Signed-off-by: Kenfe-Mickael Laventure <mickael.laventure@gmail.com>
| ... | ... |
@@ -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{
|