Consolidate the error handling cleanup into a defer
... 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>
This commit is contained in:
parent
ce3c7ffbd2
commit
c7ae082b70
39
layers.go
39
layers.go
|
|
@ -841,26 +841,32 @@ func (r *layerStore) Put(id string, parentLayer *Layer, names []string, mountLab
|
||||||
layer.Flags[flag] = value
|
layer.Flags[flag] = value
|
||||||
}
|
}
|
||||||
layer.Flags[incompleteFlag] = true
|
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()
|
err := r.Save()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// We don't have a presistent record of this layer, but
|
cleanupFailureContext = "saving incomplete layer metadata"
|
||||||
// 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)
|
|
||||||
}
|
|
||||||
return nil, -1, err
|
return nil, -1, err
|
||||||
}
|
}
|
||||||
var size int64 = -1
|
var size int64 = -1
|
||||||
if diff != nil {
|
if diff != nil {
|
||||||
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 {
|
cleanupFailureContext = "applying layer diff"
|
||||||
// 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)
|
|
||||||
}
|
|
||||||
return nil, -1, err
|
return nil, -1, err
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -875,15 +881,12 @@ func (r *layerStore) Put(id string, parentLayer *Layer, names []string, mountLab
|
||||||
delete(layer.Flags, incompleteFlag)
|
delete(layer.Flags, incompleteFlag)
|
||||||
err = r.Save()
|
err = r.Save()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if err2 := r.Delete(layer.ID); err2 != nil {
|
cleanupFailureContext = "saving finished layer metadata"
|
||||||
// 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)
|
|
||||||
}
|
|
||||||
return nil, -1, err
|
return nil, -1, err
|
||||||
}
|
}
|
||||||
|
|
||||||
layer = copyLayer(layer)
|
layer = copyLayer(layer)
|
||||||
|
succeeded = true
|
||||||
return layer, size, err
|
return layer, size, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue