Skip to content

Commit af3e556

Browse files
author
Roman Volosatovs
committed
daemon/images: fix shared size computation for filtered requests
Signed-off-by: Roman Volosatovs <roman.volosatovs@docker.com>
1 parent b308097 commit af3e556

File tree

1 file changed

+26
-16
lines changed

1 file changed

+26
-16
lines changed

daemon/images/images.go

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -77,21 +77,19 @@ func (i *ImageService) Images(imageFilters filters.Args, all bool, withExtraAttr
7777
return nil, err
7878
}
7979

80-
var allImages map[image.ID]*image.Image
80+
var selectedImages map[image.ID]*image.Image
8181
if danglingOnly {
82-
allImages = i.imageStore.Heads()
82+
selectedImages = i.imageStore.Heads()
8383
} else {
84-
allImages = i.imageStore.Map()
84+
selectedImages = i.imageStore.Map()
8585
}
8686

8787
var (
88-
summaries []*types.ImageSummary
88+
summaries = make([]*types.ImageSummary, 0, len(selectedImages))
8989
summaryMap map[*image.Image]*types.ImageSummary
90-
layerRefs map[layer.ChainID]int
91-
allLayers map[layer.ChainID]layer.Layer
9290
allContainers []*container.Container
9391
)
94-
for id, img := range allImages {
92+
for id, img := range selectedImages {
9593
if beforeFilter != nil {
9694
if img.Created.Equal(beforeFilter.Created) || img.Created.After(beforeFilter.Created) {
9795
continue
@@ -187,12 +185,10 @@ func (i *ImageService) Images(imageFilters filters.Args, all bool, withExtraAttr
187185
}
188186

189187
if withExtraAttrs {
190-
// lazily init variables
188+
// Lazily init summaryMap and allContainers
191189
if summaryMap == nil {
190+
summaryMap = make(map[*image.Image]*types.ImageSummary, len(selectedImages))
192191
allContainers = i.containers.List()
193-
allLayers = i.layerStore.Map()
194-
summaryMap = make(map[*image.Image]*types.ImageSummary)
195-
layerRefs = make(map[layer.ChainID]int)
196192
}
197193

198194
// Get container count
@@ -205,19 +201,33 @@ func (i *ImageService) Images(imageFilters filters.Args, all bool, withExtraAttr
205201
// NOTE: By default, Containers is -1, or "not set"
206202
summary.Containers = containers
207203

208-
// count layer references
204+
summaryMap[img] = summary
205+
}
206+
summaries = append(summaries, summary)
207+
}
208+
209+
if withExtraAttrs {
210+
allLayers := i.layerStore.Map()
211+
layerRefs := make(map[layer.ChainID]int, len(allLayers))
212+
213+
allImages := selectedImages
214+
if danglingOnly {
215+
// If danglingOnly is true, then selectedImages include only dangling images,
216+
// but we need to consider all existing images to correctly perform reference counting.
217+
// If danglingOnly is false, selectedImages (and, hence, allImages) is already equal to i.imageStore.Map()
218+
// and we can avoid performing an otherwise redundant method call.
219+
allImages = i.imageStore.Map()
220+
}
221+
// Count layer references across all known images
222+
for _, img := range allImages {
209223
rootFS := *img.RootFS
210224
rootFS.DiffIDs = nil
211225
for _, id := range img.RootFS.DiffIDs {
212226
rootFS.Append(id)
213227
layerRefs[rootFS.ChainID()]++
214228
}
215-
summaryMap[img] = summary
216229
}
217-
summaries = append(summaries, summary)
218-
}
219230

220-
if withExtraAttrs {
221231
// Get Shared sizes
222232
for img, summary := range summaryMap {
223233
rootFS := *img.RootFS

0 commit comments

Comments
 (0)