Skip to content

Commit

Permalink
Consolidate the error handling cleanup into a defer
Browse files Browse the repository at this point in the history
... so that we don't repeat it all over the place.

Introduce a pretty ugly cleanupFailureContext variable
for that purpose; still, it's better than copy&pasting everything.

This will be even more useful soon.

Signed-off-by: Miloslav Trmač <mitr@redhat.com>
  • Loading branch information
mtrmac committed Feb 22, 2022
1 parent 5aa616c commit 55f1960
Showing 1 changed file with 21 additions and 18 deletions.
39 changes: 21 additions & 18 deletions layers.go
Expand Up @@ -787,40 +787,43 @@ func (r *layerStore) Put(id string, parentLayer *Layer, names []string, mountLab
layer.Flags[flag] = value
}
layer.Flags[incompleteFlag] = true

succeeded := false
cleanupFailureContext := ""
defer func() {
if !succeeded {
// On any error, try both removing the driver's data as well
// as the in-memory layer record.
if err2 := r.Delete(layer.ID); err2 != nil {
if cleanupFailureContext == "" {
cleanupFailureContext = "unknown: cleanupFailureContext not set at the failure site"
}
logrus.Errorf("While recovering from a failure (%s), error deleting layer %#v: %v", cleanupFailureContext, layer.ID, err2)
}
}
}()

err = r.Save()
if err != nil {
// We don't have a presistent record of this layer, but
// try to remove both the driver’s data as well as
// the in-memory layer record.
if err2 := r.Delete(layer.ID); err2 != nil {
logrus.Errorf("While recovering from a failure saving incomplete layer metadata, error deleting layer %#v: %v", id, err2)
}
cleanupFailureContext = "saving incomplete layer metadata"
return nil, -1, err
}
if diff != nil {
size, err = r.applyDiffWithOptions(layer.ID, moreOptions, diff)
if err != nil {
if err2 := r.Delete(layer.ID); err2 != nil {
// Either a driver error or an error saving.
// 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)
}
cleanupFailureContext = "applying layer diff"
return nil, -1, err
}
}
delete(layer.Flags, incompleteFlag)
err = r.Save()
if err != nil {
if err2 := r.Delete(layer.ID); err2 != nil {
// Either a driver error or an error saving.
// We now have a layer that's been marked for
// deletion but which we failed to remove.
logrus.Errorf("While recovering from a failure saving finished layer metadata, error deleting layer %#v: %v", layer.ID, err2)
}
cleanupFailureContext = "saving finished layer metadata"
return nil, -1, err
}

layer = copyLayer(layer)
succeeded = true
return layer, size, err
}

Expand Down

0 comments on commit 55f1960

Please sign in to comment.