diff --git a/daemon/disk_usage.go b/daemon/disk_usage.go index cad441f9cb..344627afa0 100644 --- a/daemon/disk_usage.go +++ b/daemon/disk_usage.go @@ -35,41 +35,39 @@ func (daemon *Daemon) SystemDiskUsage(ctx context.Context) (*types.DiskUsage, er return nil, fmt.Errorf("failed to retrieve image list: %v", err) } - // Get all local volumes - allVolumes := []*types.Volume{} - getLocalVols := func(v volume.Volume) error { - select { - case <-ctx.Done(): - return ctx.Err() - default: - if d, ok := v.(volume.DetailedVolume); ok { - // skip local volumes with mount options since these could have external - // mounted filesystems that will be slow to enumerate. - if len(d.Options()) > 0 { - return nil - } - } - name := v.Name() - refs := daemon.volumes.Refs(v) - - tv := volumeToAPIType(v) - sz, err := directory.Size(ctx, v.Path()) - if err != nil { - logrus.Warnf("failed to determine size of volume %v", name) - sz = -1 - } - tv.UsageData = &types.VolumeUsageData{Size: sz, RefCount: int64(len(refs))} - allVolumes = append(allVolumes, tv) - } - - return nil - } - - err = daemon.traverseLocalVolumes(getLocalVols) + volumes, err := daemon.volumes.FilterByDriver(volume.DefaultDriverName) if err != nil { return nil, err } + var allVolumes []*types.Volume + for _, v := range volumes { + select { + case <-ctx.Done(): + return nil, ctx.Err() + default: + } + if d, ok := v.(volume.DetailedVolume); ok { + if len(d.Options()) > 0 { + // skip local volumes with mount options since these could have external + // mounted filesystems that will be slow to enumerate. + continue + } + } + + name := v.Name() + refs := daemon.volumes.Refs(v) + + tv := volumeToAPIType(v) + sz, err := directory.Size(ctx, v.Path()) + if err != nil { + logrus.Warnf("failed to determine size of volume %v", name) + sz = -1 + } + tv.UsageData = &types.VolumeUsageData{Size: sz, RefCount: int64(len(refs))} + allVolumes = append(allVolumes, tv) + } + allLayersSize, err := daemon.imageService.LayerDiskUsage(ctx) if err != nil { return nil, err diff --git a/daemon/prune.go b/daemon/prune.go index 286e1e4bd2..ba7e3485d0 100644 --- a/daemon/prune.go +++ b/daemon/prune.go @@ -107,11 +107,20 @@ func (daemon *Daemon) VolumesPrune(ctx context.Context, pruneFilters filters.Arg rep := &types.VolumesPruneReport{} - pruneVols := func(v volume.Volume) error { + volumes, err := daemon.volumes.FilterByDriver(volume.DefaultDriverName) + if err != nil { + return nil, err + } + + for _, v := range volumes { select { case <-ctx.Done(): logrus.Debugf("VolumesPrune operation cancelled: %#v", *rep) - return ctx.Err() + err := ctx.Err() + if err == context.Canceled { + return rep, nil + } + return rep, err default: } @@ -122,9 +131,10 @@ func (daemon *Daemon) VolumesPrune(ctx context.Context, pruneFilters filters.Arg detailedVolume, ok := v.(volume.DetailedVolume) if ok { if !matchLabels(pruneFilters, detailedVolume.Labels()) { - return nil + continue } } + vSize, err := directory.Size(ctx, v.Path()) if err != nil { logrus.Warnf("could not determine size of volume %s: %v", name, err) @@ -132,21 +142,15 @@ func (daemon *Daemon) VolumesPrune(ctx context.Context, pruneFilters filters.Arg err = daemon.volumeRm(v) if err != nil { logrus.Warnf("could not remove volume %s: %v", name, err) - return nil + continue } rep.SpaceReclaimed += uint64(vSize) rep.VolumesDeleted = append(rep.VolumesDeleted, name) } - return nil } - err = daemon.traverseLocalVolumes(pruneVols) - if err == context.Canceled { - return rep, nil - } - - return rep, err + return rep, nil } // localNetworksPrune removes unused local networks diff --git a/daemon/volumes.go b/daemon/volumes.go index a63a90771a..948409a00a 100644 --- a/daemon/volumes.go +++ b/daemon/volumes.go @@ -1,7 +1,6 @@ package daemon // import "github.com/docker/docker/daemon" import ( - "fmt" "os" "path/filepath" "reflect" @@ -15,7 +14,6 @@ import ( "github.com/docker/docker/container" "github.com/docker/docker/errdefs" "github.com/docker/docker/volume" - "github.com/docker/docker/volume/drivers" "github.com/pkg/errors" "github.com/sirupsen/logrus" ) @@ -385,32 +383,3 @@ func (daemon *Daemon) backportMountSpec(container *container.Container) { cm.Spec.ReadOnly = !cm.RW } } - -func (daemon *Daemon) traverseLocalVolumes(fn func(volume.Volume) error) error { - localVolumeDriver, err := volumedrivers.GetDriver(volume.DefaultDriverName) - if err != nil { - return fmt.Errorf("can't retrieve local volume driver: %v", err) - } - vols, err := localVolumeDriver.List() - if err != nil { - return fmt.Errorf("can't retrieve local volumes: %v", err) - } - - for _, v := range vols { - name := v.Name() - vol, err := daemon.volumes.Get(name) - if err != nil { - logrus.Warnf("failed to retrieve volume %s from store: %v", name, err) - } else { - // daemon.volumes.Get will return DetailedVolume - v = vol - } - - err = fn(v) - if err != nil { - return err - } - } - - return nil -}