From a246d6f1d13d1215e6556c5c419a7cb0e7afccab Mon Sep 17 00:00:00 2001 From: "Dr. Stefan Schimanski" Date: Mon, 6 Nov 2017 18:31:40 +0100 Subject: [PATCH] apiserver: protect registry cleanup against concurrent access --- .../generic/registry/storage_factory.go | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/staging/src/k8s.io/apiserver/pkg/registry/generic/registry/storage_factory.go b/staging/src/k8s.io/apiserver/pkg/registry/generic/registry/storage_factory.go index 188f6f7bcdc..c1ef906f66d 100644 --- a/staging/src/k8s.io/apiserver/pkg/registry/generic/registry/storage_factory.go +++ b/staging/src/k8s.io/apiserver/pkg/registry/generic/registry/storage_factory.go @@ -17,6 +17,8 @@ limitations under the License. package registry import ( + "sync" + "github.com/golang/glog" "k8s.io/apimachinery/pkg/runtime" @@ -82,13 +84,23 @@ func StorageWithCacher(capacity int) generic.StorageDecorator { // only from the test harness, so Register/Cleanup will be // no-op at runtime. +var cleanupLock sync.Mutex var cleanup []func() = nil func TrackStorageCleanup() { + cleanupLock.Lock() + defer cleanupLock.Unlock() + + if cleanup != nil { + panic("Conflicting storage tracking") + } cleanup = make([]func(), 0) } func RegisterStorageCleanup(fn func()) { + cleanupLock.Lock() + defer cleanupLock.Unlock() + if cleanup == nil { return } @@ -96,11 +108,12 @@ func RegisterStorageCleanup(fn func()) { } func CleanupStorage() { - if cleanup == nil { - return - } - for _, d := range cleanup { + cleanupLock.Lock() + old := cleanup + cleanup = nil + cleanupLock.Unlock() + + for _, d := range old { d() } - cleanup = nil }