浏览代码

Prevent multiple parallel SystemDiskUsage call

Signed-off-by: Kenfe-Mickael Laventure <mickael.laventure@gmail.com>
Kenfe-Mickael Laventure 8 年之前
父节点
当前提交
5a9f2a3ce6
共有 2 个文件被更改,包括 12 次插入0 次删除
  1. 6 0
      daemon/daemon.go
  2. 6 0
      daemon/disk_usage.go

+ 6 - 0
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

+ 6 - 0
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,