Browse Source

Merge pull request #31954 from darrenstahlmsft/GraphdriverReference

Windows: Fix reference counting in graphdriver
Victor Vieux 8 years ago
parent
commit
a6746e6ca5
1 changed files with 9 additions and 0 deletions
  1. 9 0
      daemon/graphdriver/windows/windows.go

+ 9 - 0
daemon/graphdriver/windows/windows.go

@@ -370,6 +370,9 @@ func (d *Driver) Get(id, mountLabel string) (string, error) {
 	mountPath, err := hcsshim.GetLayerMountPath(d.info, rID)
 	if err != nil {
 		d.ctr.Decrement(rID)
+		if err := hcsshim.UnprepareLayer(d.info, rID); err != nil {
+			logrus.Warnf("Failed to Unprepare %s: %s", id, err)
+		}
 		if err2 := hcsshim.DeactivateLayer(d.info, rID); err2 != nil {
 			logrus.Warnf("Failed to Deactivate %s: %s", id, err)
 		}
@@ -402,9 +405,15 @@ func (d *Driver) Put(id string) error {
 		return nil
 	}
 	d.cacheMu.Lock()
+	_, exists := d.cache[rID]
 	delete(d.cache, rID)
 	d.cacheMu.Unlock()
 
+	// If the cache was not populated, then the layer was left unprepared and deactivated
+	if !exists {
+		return nil
+	}
+
 	if err := hcsshim.UnprepareLayer(d.info, rID); err != nil {
 		return err
 	}