浏览代码

Rearrange layerstore locking

Signed-off-by: Aidan Hobson Sayers <aidanhs@cantab.net>
Aidan Hobson Sayers 9 年之前
父节点
当前提交
cbf55b924f
共有 3 个文件被更改,包括 15 次插入27 次删除
  1. 12 22
      layer/layer_store.go
  2. 1 1
      layer/layer_windows.go
  3. 2 4
      layer/migration.go

+ 12 - 22
layer/layer_store.go

@@ -269,7 +269,7 @@ func (ls *layerStore) Register(ts io.Reader, parent ChainID) (Layer, error) {
 	ls.layerL.Lock()
 	defer ls.layerL.Unlock()
 
-	if existingLayer := ls.getAndRetainLayer(layer.chainID); existingLayer != nil {
+	if existingLayer := ls.getWithoutLock(layer.chainID); existingLayer != nil {
 		// Set error for cleanup, but do not return the error
 		err = errors.New("layer already exists")
 		return existingLayer.getReference(), nil
@@ -284,18 +284,21 @@ func (ls *layerStore) Register(ts io.Reader, parent ChainID) (Layer, error) {
 	return layer.getReference(), nil
 }
 
-func (ls *layerStore) get(l ChainID) *roLayer {
-	ls.layerL.Lock()
-	defer ls.layerL.Unlock()
-
-	layer, ok := ls.layerMap[l]
+func (ls *layerStore) getWithoutLock(layer ChainID) *roLayer {
+	l, ok := ls.layerMap[layer]
 	if !ok {
 		return nil
 	}
 
-	layer.referenceCount++
+	l.referenceCount++
+
+	return l
+}
 
-	return layer
+func (ls *layerStore) get(l ChainID) *roLayer {
+	ls.layerL.Lock()
+	defer ls.layerL.Unlock()
+	return ls.getWithoutLock(l)
 }
 
 func (ls *layerStore) Get(l ChainID) (Layer, error) {
@@ -415,17 +418,6 @@ func (ls *layerStore) saveMount(mount *mountedLayer) error {
 	return nil
 }
 
-func (ls *layerStore) getAndRetainLayer(layer ChainID) *roLayer {
-	l, ok := ls.layerMap[layer]
-	if !ok {
-		return nil
-	}
-
-	l.referenceCount++
-
-	return l
-}
-
 func (ls *layerStore) initMount(graphID, parent, mountLabel string, initFunc MountInit) (string, error) {
 	// Use "<graph-id>-init" to maintain compatibility with graph drivers
 	// which are expecting this layer with this special name. If all
@@ -468,9 +460,7 @@ func (ls *layerStore) Mount(name string, parent ChainID, mountLabel string, init
 	var pid string
 	var p *roLayer
 	if string(parent) != "" {
-		ls.layerL.Lock()
-		p = ls.getAndRetainLayer(parent)
-		ls.layerL.Unlock()
+		p = ls.get(parent)
 		if p == nil {
 			return nil, ErrLayerDoesNotExist
 		}

+ 1 - 1
layer/layer_windows.go

@@ -93,7 +93,7 @@ func (ls *layerStore) RegisterDiffID(graphID string, size int64) (Layer, error)
 	ls.layerL.Lock()
 	defer ls.layerL.Unlock()
 
-	if existingLayer := ls.getAndRetainLayer(layer.chainID); existingLayer != nil {
+	if existingLayer := ls.getWithoutLock(layer.chainID); existingLayer != nil {
 		// Set error for cleanup, but do not return
 		err = errors.New("layer already exists")
 		return existingLayer.getReference(), nil

+ 2 - 4
layer/migration.go

@@ -35,9 +35,7 @@ func (ls *layerStore) MountByGraphID(name string, graphID string, parent ChainID
 
 	var p *roLayer
 	if string(parent) != "" {
-		ls.layerL.Lock()
-		p = ls.getAndRetainLayer(parent)
-		ls.layerL.Unlock()
+		p = ls.get(parent)
 		if p == nil {
 			return nil, ErrLayerDoesNotExist
 		}
@@ -209,7 +207,7 @@ func (ls *layerStore) RegisterByGraphID(graphID string, parent ChainID, tarDataF
 	ls.layerL.Lock()
 	defer ls.layerL.Unlock()
 
-	if existingLayer := ls.getAndRetainLayer(layer.chainID); existingLayer != nil {
+	if existingLayer := ls.getWithoutLock(layer.chainID); existingLayer != nil {
 		// Set error for cleanup, but do not return
 		err = errors.New("layer already exists")
 		return existingLayer.getReference(), nil