diff options
author | Tonis Tiigi <tonistiigi@gmail.com> | 2016-02-19 10:42:29 -0800 |
---|---|---|
committer | Tonis Tiigi <tonistiigi@gmail.com> | 2016-02-19 10:42:29 -0800 |
commit | 64530c8e47ec663827cceb28fc64b12da5e56147 (patch) | |
tree | de8e5504f6dea9371eb209708b6fb968ff5f8870 /layer | |
parent | 06af9471f869cd1f46da814e21c21bc815fd665e (diff) | |
download | docker-64530c8e47ec663827cceb28fc64b12da5e56147.tar.gz |
Fix releasing reference on deletion error
Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
Diffstat (limited to 'layer')
-rw-r--r-- | layer/layer_store.go | 3 | ||||
-rw-r--r-- | layer/mounted_layer.go | 7 |
2 files changed, 10 insertions, 0 deletions
diff --git a/layer/layer_store.go b/layer/layer_store.go index 619c1a3020..229ba6a3a2 100644 --- a/layer/layer_store.go +++ b/layer/layer_store.go @@ -498,18 +498,21 @@ func (ls *layerStore) ReleaseRWLayer(l RWLayer) ([]Metadata, error) { if err := ls.driver.Remove(m.mountID); err != nil { logrus.Errorf("Error removing mounted layer %s: %s", m.name, err) + m.retakeReference(l) return nil, err } if m.initID != "" { if err := ls.driver.Remove(m.initID); err != nil { logrus.Errorf("Error removing init layer %s: %s", m.name, err) + m.retakeReference(l) return nil, err } } if err := ls.store.RemoveMount(m.name); err != nil { logrus.Errorf("Error removing mount metadata: %s: %s", m.name, err) + m.retakeReference(l) return nil, err } diff --git a/layer/mounted_layer.go b/layer/mounted_layer.go index b3d6568833..bf662e9a42 100644 --- a/layer/mounted_layer.go +++ b/layer/mounted_layer.go @@ -96,6 +96,13 @@ func (ml *mountedLayer) deleteReference(ref RWLayer) error { return nil } +func (ml *mountedLayer) retakeReference(r RWLayer) { + if ref, ok := r.(*referencedRWLayer); ok { + ref.activityCount = 0 + ml.references[ref] = ref + } +} + type referencedRWLayer struct { *mountedLayer |