Browse code

Fix releasing reference on deletion error

Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
(cherry picked from commit 64530c8e47ec663827cceb28fc64b12da5e56147)

Tonis Tiigi authored on 2016/02/20 03:42:29
Showing 2 changed files
... ...
@@ -498,18 +498,21 @@ func (ls *layerStore) ReleaseRWLayer(l RWLayer) ([]Metadata, error) {
498 498
 
499 499
 	if err := ls.driver.Remove(m.mountID); err != nil {
500 500
 		logrus.Errorf("Error removing mounted layer %s: %s", m.name, err)
501
+		m.retakeReference(l)
501 502
 		return nil, err
502 503
 	}
503 504
 
504 505
 	if m.initID != "" {
505 506
 		if err := ls.driver.Remove(m.initID); err != nil {
506 507
 			logrus.Errorf("Error removing init layer %s: %s", m.name, err)
508
+			m.retakeReference(l)
507 509
 			return nil, err
508 510
 		}
509 511
 	}
510 512
 
511 513
 	if err := ls.store.RemoveMount(m.name); err != nil {
512 514
 		logrus.Errorf("Error removing mount metadata: %s: %s", m.name, err)
515
+		m.retakeReference(l)
513 516
 		return nil, err
514 517
 	}
515 518
 
... ...
@@ -96,6 +96,13 @@ func (ml *mountedLayer) deleteReference(ref RWLayer) error {
96 96
 	return nil
97 97
 }
98 98
 
99
+func (ml *mountedLayer) retakeReference(r RWLayer) {
100
+	if ref, ok := r.(*referencedRWLayer); ok {
101
+		ref.activityCount = 0
102
+		ml.references[ref] = ref
103
+	}
104
+}
105
+
99 106
 type referencedRWLayer struct {
100 107
 	*mountedLayer
101 108