diff --git a/components/engine/daemon/daemon.go b/components/engine/daemon/daemon.go index c4a156acd0..87697ad144 100644 --- a/components/engine/daemon/daemon.go +++ b/components/engine/daemon/daemon.go @@ -111,6 +111,12 @@ type Daemon struct { seccompProfile []byte seccompProfilePath string + + diskUsageRunning int32 + containersPruneRunning int32 + volumesPruneRunning int32 + imagesPruneRunning int32 + networksPruneRunning int32 } // HasExperimental returns whether the experimental features of the daemon are enabled or not diff --git a/components/engine/daemon/disk_usage.go b/components/engine/daemon/disk_usage.go index 6bff4f0ff9..83de00ab2e 100644 --- a/components/engine/daemon/disk_usage.go +++ b/components/engine/daemon/disk_usage.go @@ -2,6 +2,7 @@ package daemon import ( "fmt" + "sync/atomic" "golang.org/x/net/context" @@ -37,6 +38,11 @@ func (daemon *Daemon) getLayerRefs() map[layer.ChainID]int { // SystemDiskUsage returns information about the daemon data disk usage func (daemon *Daemon) SystemDiskUsage(ctx context.Context) (*types.DiskUsage, error) { + if !atomic.CompareAndSwapInt32(&daemon.diskUsageRunning, 0, 1) { + return nil, fmt.Errorf("a disk usage operation is already running") + } + defer atomic.StoreInt32(&daemon.diskUsageRunning, 0) + // Retrieve container list allContainers, err := daemon.Containers(&types.ContainerListOptions{ Size: true,