Skip to content

Commit

Permalink
DeleteImage(): always delete mapped top layers
Browse files Browse the repository at this point in the history
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 <nalin@redhat.com>
  • Loading branch information
nalind committed Apr 14, 2022
1 parent 6a5a0e5 commit ff62c5b
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 7 deletions.
10 changes: 4 additions & 6 deletions store.go
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
18 changes: 17 additions & 1 deletion tests/idmaps.bats
Expand Up @@ -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 ]
Expand Down

0 comments on commit ff62c5b

Please sign in to comment.