From b344c3893911db987e1c0838f0ff5774cefa3ff1 Mon Sep 17 00:00:00 2001 From: Kenfe-Mickael Laventure Date: Wed, 12 Apr 2017 13:59:59 -0700 Subject: [PATCH] Prevent multiple parallel SystemDiskUsage call Signed-off-by: Kenfe-Mickael Laventure Upstream-commit: 5a9f2a3ce66d8b0954af965b0b8bf384df02c41a Component: engine --- components/engine/daemon/daemon.go | 6 ++++++ components/engine/daemon/disk_usage.go | 6 ++++++ 2 files changed, 12 insertions(+) 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,