From 44e67adae5695e3e2c3b450453ab0fe6119eb80d Mon Sep 17 00:00:00 2001 From: Aaron Lehmann Date: Tue, 20 Jun 2017 18:31:29 -0700 Subject: [PATCH] image: Improve store locking This showed up in a recent profile. Search doesn't need to take a lock on the store, because digestset has its own locking. Some other methods can get by with a read lock instead of an exclusive lock. Signed-off-by: Aaron Lehmann --- image/store.go | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/image/store.go b/image/store.go index 26ae109a06..55472f1353 100644 --- a/image/store.go +++ b/image/store.go @@ -37,7 +37,7 @@ type imageMeta struct { } type store struct { - sync.Mutex + sync.RWMutex ls LayerGetReleaser images map[ID]*imageMeta fs StoreBackend @@ -166,9 +166,6 @@ func (is *store) Create(config []byte) (ID, error) { } func (is *store) Search(term string) (ID, error) { - is.Lock() - defer is.Unlock() - dgst, err := is.digestSet.Lookup(term) if err != nil { if err == digestset.ErrDigestNotFound { @@ -251,8 +248,8 @@ func (is *store) GetParent(id ID) (ID, error) { } func (is *store) Children(id ID) []ID { - is.Lock() - defer is.Unlock() + is.RLock() + defer is.RUnlock() return is.children(id) } @@ -276,8 +273,8 @@ func (is *store) Map() map[ID]*Image { } func (is *store) imagesMap(all bool) map[ID]*Image { - is.Lock() - defer is.Unlock() + is.RLock() + defer is.RUnlock() images := make(map[ID]*Image)