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:
parent
52a44fbf6d
commit
f3e5d1ff6c
19
layers.go
19
layers.go
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue