summaryrefslogtreecommitdiff
path: root/layer
diff options
context:
space:
mode:
authorTonis Tiigi <tonistiigi@gmail.com>2016-02-19 10:42:29 -0800
committerTonis Tiigi <tonistiigi@gmail.com>2016-02-19 10:42:29 -0800
commit64530c8e47ec663827cceb28fc64b12da5e56147 (patch)
treede8e5504f6dea9371eb209708b6fb968ff5f8870 /layer
parent06af9471f869cd1f46da814e21c21bc815fd665e (diff)
downloaddocker-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.go3
-rw-r--r--layer/mounted_layer.go7
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