From ff62c5be7e21bee59b20cb24cd41728e45570f77 Mon Sep 17 00:00:00 2001 From: Nalin Dahyabhai Date: Wed, 13 Apr 2022 18:15:10 -0400 Subject: [PATCH] DeleteImage(): always delete mapped top layers When deleting an image, always delete an image's mapped top layers, even when the unmapped top layer is shared with other images and must therefore not be deleted. Mapped top layers aren't shared with other images, so we never need to preserve them. Signed-off-by: Nalin Dahyabhai --- store.go | 10 ++++------ tests/idmaps.bats | 18 +++++++++++++++++- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/store.go b/store.go index 6b40b68cac..30d3e8715e 100644 --- a/store.go +++ b/store.go @@ -2452,6 +2452,10 @@ func (s *store) DeleteImage(id string, commit bool) (layers []string, err error) } layer := image.TopLayer layersToRemoveMap := make(map[string]struct{}) + layersToRemove = append(layersToRemove, image.MappedTopLayers...) + for _, mappedTopLayer := range image.MappedTopLayers { + layersToRemoveMap[mappedTopLayer] = struct{}{} + } for layer != "" { if rcstore.Exists(layer) { break @@ -2483,12 +2487,6 @@ func (s *store) DeleteImage(id string, commit bool) (layers []string, err error) if hasChildrenNotBeingRemoved() { break } - if layer == image.TopLayer { - layersToRemove = append(layersToRemove, image.MappedTopLayers...) - for _, mappedTopLayer := range image.MappedTopLayers { - layersToRemoveMap[mappedTopLayer] = struct{}{} - } - } layersToRemove = append(layersToRemove, layer) layersToRemoveMap[layer] = struct{}{} layer = parent diff --git a/tests/idmaps.bats b/tests/idmaps.bats index 7e21144179..079b5a705a 100644 --- a/tests/idmaps.bats +++ b/tests/idmaps.bats @@ -700,11 +700,27 @@ load helpers test $actual = $expected done - # Remove the containers and image and check that all of the layers we used got removed. + # Create a new layer based on the image. + run storage --debug=false create-layer --hostuidmap --hostgidmap $lowerlayer + echo "$output" + [ "$status" -eq 0 ] + [ "$output" != "" ] + upperlayer="$output" + run storage --debug=false applydiff -f "$TESTDIR"/layer.empty $upperlayer + # Create an image record for the new layer. + run storage --debug=false create-image $upperlayer + echo "$output" + [ "$status" -eq 0 ] + [ "$output" != "" ] + upperimage="$output" + echo upperimage:$upperimage + + # Remove the containers and images and check that all of the layers we used got removed. for container in "${containers[@]}" ; do run storage --debug=false delete-container $container done run storage --debug=false delete-image $image + run storage --debug=false delete-image $upperimage run storage --debug=false layers echo "$output" [ "$status" -eq 0 ]