Browse code

Honor context within SystemDiskUsage

Signed-off-by: Kenfe-Mickael Laventure <mickael.laventure@gmail.com>

Kenfe-Mickael Laventure authored on 2017/04/13 05:59:31
Showing 4 changed files
... ...
@@ -14,7 +14,7 @@ import (
14 14
 type Backend interface {
15 15
 	SystemInfo() (*types.Info, error)
16 16
 	SystemVersion() types.Version
17
-	SystemDiskUsage() (*types.DiskUsage, error)
17
+	SystemDiskUsage(ctx context.Context) (*types.DiskUsage, error)
18 18
 	SubscribeToEvents(since, until time.Time, ef filters.Args) ([]events.Message, chan interface{})
19 19
 	UnsubscribeFromEvents(chan interface{})
20 20
 	AuthenticateToRegistry(ctx context.Context, authConfig *types.AuthConfig) (string, string, error)
... ...
@@ -26,7 +26,7 @@ func NewRouter(b Backend, c *cluster.Cluster) router.Router {
26 26
 		router.NewGetRoute("/events", r.getEvents, router.WithCancel),
27 27
 		router.NewGetRoute("/info", r.getInfo),
28 28
 		router.NewGetRoute("/version", r.getVersion),
29
-		router.NewGetRoute("/system/df", r.getDiskUsage),
29
+		router.NewGetRoute("/system/df", r.getDiskUsage, router.WithCancel),
30 30
 		router.NewPostRoute("/auth", r.postAuth),
31 31
 	}
32 32
 
... ...
@@ -71,7 +71,7 @@ func (s *systemRouter) getVersion(ctx context.Context, w http.ResponseWriter, r
71 71
 }
72 72
 
73 73
 func (s *systemRouter) getDiskUsage(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
74
-	du, err := s.backend.SystemDiskUsage()
74
+	du, err := s.backend.SystemDiskUsage(ctx)
75 75
 	if err != nil {
76 76
 		return err
77 77
 	}
... ...
@@ -3,6 +3,8 @@ package daemon
3 3
 import (
4 4
 	"fmt"
5 5
 
6
+	"golang.org/x/net/context"
7
+
6 8
 	"github.com/Sirupsen/logrus"
7 9
 	"github.com/docker/docker/api/types"
8 10
 	"github.com/docker/docker/api/types/filters"
... ...
@@ -34,7 +36,7 @@ func (daemon *Daemon) getLayerRefs() map[layer.ChainID]int {
34 34
 }
35 35
 
36 36
 // SystemDiskUsage returns information about the daemon data disk usage
37
-func (daemon *Daemon) SystemDiskUsage() (*types.DiskUsage, error) {
37
+func (daemon *Daemon) SystemDiskUsage(ctx context.Context) (*types.DiskUsage, error) {
38 38
 	// Retrieve container list
39 39
 	allContainers, err := daemon.Containers(&types.ContainerListOptions{
40 40
 		Size: true,
... ...
@@ -53,17 +55,22 @@ func (daemon *Daemon) SystemDiskUsage() (*types.DiskUsage, error) {
53 53
 	// Get all local volumes
54 54
 	allVolumes := []*types.Volume{}
55 55
 	getLocalVols := func(v volume.Volume) error {
56
-		name := v.Name()
57
-		refs := daemon.volumes.Refs(v)
56
+		select {
57
+		case <-ctx.Done():
58
+			return ctx.Err()
59
+		default:
60
+			name := v.Name()
61
+			refs := daemon.volumes.Refs(v)
58 62
 
59
-		tv := volumeToAPIType(v)
60
-		sz, err := directory.Size(v.Path())
61
-		if err != nil {
62
-			logrus.Warnf("failed to determine size of volume %v", name)
63
-			sz = -1
63
+			tv := volumeToAPIType(v)
64
+			sz, err := directory.Size(v.Path())
65
+			if err != nil {
66
+				logrus.Warnf("failed to determine size of volume %v", name)
67
+				sz = -1
68
+			}
69
+			tv.UsageData = &types.VolumeUsageData{Size: sz, RefCount: int64(len(refs))}
70
+			allVolumes = append(allVolumes, tv)
64 71
 		}
65
-		tv.UsageData = &types.VolumeUsageData{Size: sz, RefCount: int64(len(refs))}
66
-		allVolumes = append(allVolumes, tv)
67 72
 
68 73
 		return nil
69 74
 	}
... ...
@@ -78,17 +85,21 @@ func (daemon *Daemon) SystemDiskUsage() (*types.DiskUsage, error) {
78 78
 	allLayers := daemon.layerStore.Map()
79 79
 	var allLayersSize int64
80 80
 	for _, l := range allLayers {
81
-		size, err := l.DiffSize()
82
-		if err == nil {
83
-			if _, ok := layerRefs[l.ChainID()]; ok {
84
-				allLayersSize += size
81
+		select {
82
+		case <-ctx.Done():
83
+			return nil, ctx.Err()
84
+		default:
85
+			size, err := l.DiffSize()
86
+			if err == nil {
87
+				if _, ok := layerRefs[l.ChainID()]; ok {
88
+					allLayersSize += size
89
+				} else {
90
+					logrus.Warnf("found leaked image layer %v", l.ChainID())
91
+				}
85 92
 			} else {
86
-				logrus.Warnf("found leaked image layer %v", l.ChainID())
93
+				logrus.Warnf("failed to get diff size for layer %v", l.ChainID())
87 94
 			}
88
-		} else {
89
-			logrus.Warnf("failed to get diff size for layer %v", l.ChainID())
90 95
 		}
91
-
92 96
 	}
93 97
 
94 98
 	return &types.DiskUsage{