From 125ec8a7bd7d14a4986846c082c4654e62e1fb20 Mon Sep 17 00:00:00 2001 From: Mrunal Patel Date: Wed, 14 Feb 2018 17:55:31 -0800 Subject: [PATCH] image: Add lock around image cache access Signed-off-by: Mrunal Patel --- pkg/storage/image.go | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/pkg/storage/image.go b/pkg/storage/image.go index 2c2c3f62..9df7ffbc 100644 --- a/pkg/storage/image.go +++ b/pkg/storage/image.go @@ -5,6 +5,7 @@ import ( "net" "path" "strings" + "sync" "github.com/containers/image/copy" "github.com/containers/image/docker/reference" @@ -63,6 +64,7 @@ type imageService struct { indexConfigs map[string]*indexInfo registries []string imageCache map[string]imageCacheItem + imageCacheLock sync.Mutex } // sizer knows its size. @@ -249,16 +251,21 @@ func (svc *imageService) ListImages(systemContext *types.SystemContext, filter s } } // Handle the removals. + svc.imageCacheLock.Lock() for _, removedID := range removedIDs { delete(svc.imageCache, removedID) } + svc.imageCacheLock.Unlock() }() for _, image := range images { visited[image.ID] = struct{}{} var user string var size *uint64 var configDigest digest.Digest - if cacheItem, ok := svc.imageCache[image.ID]; ok { + svc.imageCacheLock.Lock() + cacheItem, ok := svc.imageCache[image.ID] + svc.imageCacheLock.Unlock() + if ok { user, size, configDigest = cacheItem.user, cacheItem.size, cacheItem.configDigest } else { ref, err := istorage.Transport.ParseStoreReference(svc.store, "@"+image.ID) @@ -291,7 +298,9 @@ func (svc *imageService) ListImages(systemContext *types.SystemContext, filter s size: size, configDigest: configDigest, } + svc.imageCacheLock.Lock() svc.imageCache[image.ID] = cacheItem + svc.imageCacheLock.Unlock() } name, tags, digests := sortNamesByType(image.Names) imageDigest, repoDigests := svc.makeRepoDigests(digests, tags, image.ID)