Merge pull request #32244 from tksm/fix-cache-race

Automatic merge from submit-queue

LRUExpireCache#Get requires write lock

**What this PR does / why we need it**:

[LRUExpireCache#Get](dbfad789e3/pkg/util/cache/lruexpirecache.go (L48)) requires write lock since [groupcache/lru#Get](a6b377e340/lru/lru.go (L74)) needs to manipulate its list to track recently used item. Currently it uses read lock so it may introduce race condition.

- [test code which introduces race condition with current LRUExpireCache#Get](https://gist.github.com/tksm/17c7a610ed0574c165e6f6edeca351b7#file-lru_race_test-go)

**Which issue this PR fixes** #31081
This commit is contained in:
Kubernetes Submit Queue 2016-09-13 14:36:26 -07:00 committed by GitHub
commit 804de8a149

View File

@ -25,7 +25,7 @@ import (
type LRUExpireCache struct {
cache *lru.Cache
lock sync.RWMutex
lock sync.Mutex
}
func NewLRUExpireCache(maxSize int) *LRUExpireCache {
@ -46,8 +46,8 @@ func (c *LRUExpireCache) Add(key lru.Key, value interface{}, ttl time.Duration)
}
func (c *LRUExpireCache) Get(key lru.Key) (interface{}, bool) {
c.lock.RLock()
defer c.lock.RUnlock()
c.lock.Lock()
defer c.lock.Unlock()
e, ok := c.cache.Get(key)
if !ok {
return nil, false