Signed-off-by: Kenfe-Mickael Laventure <mickael.laventure@gmail.com>
Kenfe-Mickael Laventure authored on 2017/04/13 05:59:31... | ... |
@@ -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{ |