Try to delete also the metadata of an incomplete layer

Account for the "diff != nil" path; try to remove even
the metadata of a layer on a failure saving.

Not that there's _much_ hope to be able to save
the version without the new layer when we weren't able
to save the version with the new layer.

Signed-off-by: Miloslav Trmač <mitr@redhat.com>
This commit is contained in:
Miloslav Trmač 2022-02-16 22:32:32 +01:00
parent 52a44fbf6d
commit f3e5d1ff6c
1 changed files with 15 additions and 4 deletions

View File

@ -795,6 +795,7 @@ func (r *layerStore) Put(id string, parentLayer *Layer, names []string, mountLab
for flag, value := range flags { for flag, value := range flags {
layer.Flags[flag] = value layer.Flags[flag] = value
} }
savedIncompleteLayer := false
if diff != nil { if diff != nil {
layer.Flags[incompleteFlag] = true layer.Flags[incompleteFlag] = true
err = r.Save() err = r.Save()
@ -806,6 +807,7 @@ func (r *layerStore) Put(id string, parentLayer *Layer, names []string, mountLab
} }
return nil, -1, err return nil, -1, err
} }
savedIncompleteLayer = true
size, err = r.applyDiffWithOptions(layer.ID, moreOptions, diff) size, err = r.applyDiffWithOptions(layer.ID, moreOptions, diff)
if err != nil { if err != nil {
if err2 := r.Delete(layer.ID); err2 != nil { if err2 := r.Delete(layer.ID); err2 != nil {
@ -820,10 +822,19 @@ func (r *layerStore) Put(id string, parentLayer *Layer, names []string, mountLab
} }
err = r.Save() err = r.Save()
if err != nil { if err != nil {
// We don't have a record of this layer, but at least if savedIncompleteLayer {
// try to clean it up underneath us. if err2 := r.Delete(layer.ID); err2 != nil {
if err2 := r.driver.Remove(id); err2 != nil { // Either a driver error or an error saving.
logrus.Errorf("While recovering from a failure saving finished layer metadata, error deleting layer %#v: %v", id, err2) // We now have a layer that's been marked for
// deletion but which we failed to remove.
logrus.Errorf("While recovering from a failure applying layer diff, error deleting layer %#v: %v", layer.ID, err2)
}
} else {
// We don't have a record of this layer, but at least
// try to clean it up underneath us.
if err2 := r.driver.Remove(id); err2 != nil {
logrus.Errorf("While recovering from a failure saving finished layer metadata, error deleting layer %#v in graph driver: %v", id, err2)
}
} }
return nil, -1, err return nil, -1, err
} }