From baea9d79b232951758a4057e84f6afceb08e33ae Mon Sep 17 00:00:00 2001 From: Tonis Tiigi Date: Fri, 19 Feb 2016 10:42:29 -0800 Subject: [PATCH] Fix releasing reference on deletion error Signed-off-by: Tonis Tiigi Upstream-commit: 64530c8e47ec663827cceb28fc64b12da5e56147 Component: engine --- components/engine/layer/layer_store.go | 3 +++ components/engine/layer/mounted_layer.go | 7 +++++++ 2 files changed, 10 insertions(+) diff --git a/components/engine/layer/layer_store.go b/components/engine/layer/layer_store.go index 619c1a3020..229ba6a3a2 100644 --- a/components/engine/layer/layer_store.go +++ b/components/engine/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/components/engine/layer/mounted_layer.go b/components/engine/layer/mounted_layer.go index b3d6568833..bf662e9a42 100644 --- a/components/engine/layer/mounted_layer.go +++ b/components/engine/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