From 526d60afbec083f9bcfd06b63e2fb50f3b932db6 Mon Sep 17 00:00:00 2001 From: xrstf Date: Tue, 19 Apr 2022 11:49:37 +0200 Subject: [PATCH] fix concurrent cache issues --- pkg/cache/cache.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/pkg/cache/cache.go b/pkg/cache/cache.go index 2f3d8f9..db90505 100644 --- a/pkg/cache/cache.go +++ b/pkg/cache/cache.go @@ -2,6 +2,7 @@ package cache import ( "fmt" + "sync" "time" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" @@ -14,15 +15,20 @@ type cacheItem struct { type ResourceCache struct { resources map[string]cacheItem + lock *sync.RWMutex } func NewCache() *ResourceCache { return &ResourceCache{ resources: map[string]cacheItem{}, + lock: &sync.RWMutex{}, } } func (rc *ResourceCache) Get(obj *unstructured.Unstructured) (*unstructured.Unstructured, time.Time) { + rc.lock.RLock() + defer rc.lock.RUnlock() + existing, exists := rc.resources[rc.objectKey(obj)] if !exists { return nil, time.Time{} @@ -32,6 +38,9 @@ func (rc *ResourceCache) Get(obj *unstructured.Unstructured) (*unstructured.Unst } func (rc *ResourceCache) Set(obj *unstructured.Unstructured) { + rc.lock.Lock() + defer rc.lock.Unlock() + rc.resources[rc.objectKey(obj)] = cacheItem{ resource: obj.DeepCopy(), lastSeen: time.Now(), @@ -39,6 +48,9 @@ func (rc *ResourceCache) Set(obj *unstructured.Unstructured) { } func (rc *ResourceCache) Delete(obj *unstructured.Unstructured) { + rc.lock.Lock() + defer rc.lock.Unlock() + delete(rc.resources, rc.objectKey(obj)) }