Browse Source

Merge pull request #20513 from tonistiigi/retake-ref

Fix releasing reference on deletion error
David Calavera 9 years ago
parent
commit
e51457eea8
2 changed files with 10 additions and 0 deletions
  1. 3 0
      layer/layer_store.go
  2. 7 0
      layer/mounted_layer.go

+ 3 - 0
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 {
 	if err := ls.driver.Remove(m.mountID); err != nil {
 		logrus.Errorf("Error removing mounted layer %s: %s", m.name, err)
 		logrus.Errorf("Error removing mounted layer %s: %s", m.name, err)
+		m.retakeReference(l)
 		return nil, err
 		return nil, err
 	}
 	}
 
 
 	if m.initID != "" {
 	if m.initID != "" {
 		if err := ls.driver.Remove(m.initID); err != nil {
 		if err := ls.driver.Remove(m.initID); err != nil {
 			logrus.Errorf("Error removing init layer %s: %s", m.name, err)
 			logrus.Errorf("Error removing init layer %s: %s", m.name, err)
+			m.retakeReference(l)
 			return nil, err
 			return nil, err
 		}
 		}
 	}
 	}
 
 
 	if err := ls.store.RemoveMount(m.name); err != nil {
 	if err := ls.store.RemoveMount(m.name); err != nil {
 		logrus.Errorf("Error removing mount metadata: %s: %s", m.name, err)
 		logrus.Errorf("Error removing mount metadata: %s: %s", m.name, err)
+		m.retakeReference(l)
 		return nil, err
 		return nil, err
 	}
 	}
 
 

+ 7 - 0
layer/mounted_layer.go

@@ -96,6 +96,13 @@ func (ml *mountedLayer) deleteReference(ref RWLayer) error {
 	return nil
 	return nil
 }
 }
 
 
+func (ml *mountedLayer) retakeReference(r RWLayer) {
+	if ref, ok := r.(*referencedRWLayer); ok {
+		ref.activityCount = 0
+		ml.references[ref] = ref
+	}
+}
+
 type referencedRWLayer struct {
 type referencedRWLayer struct {
 	*mountedLayer
 	*mountedLayer