From cbf55b924f05a918c9b95795f6c69aa89d180530 Mon Sep 17 00:00:00 2001 From: Aidan Hobson Sayers Date: Fri, 20 Nov 2015 12:35:01 +0000 Subject: [PATCH] Rearrange layerstore locking Signed-off-by: Aidan Hobson Sayers --- layer/layer_store.go | 34 ++++++++++++---------------------- layer/layer_windows.go | 2 +- layer/migration.go | 6 ++---- 3 files changed, 15 insertions(+), 27 deletions(-) diff --git a/layer/layer_store.go b/layer/layer_store.go index 55ec2262f5..f163d558d4 100644 --- a/layer/layer_store.go +++ b/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 layer + return l +} + +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 "-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 } diff --git a/layer/layer_windows.go b/layer/layer_windows.go index d2e91b7980..2779995927 100644 --- a/layer/layer_windows.go +++ b/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 diff --git a/layer/migration.go b/layer/migration.go index db25ed9e94..bc448a59a5 100644 --- a/layer/migration.go +++ b/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