Commit 804de8a1 authored by Kubernetes Submit Queue's avatar Kubernetes Submit Queue Committed by GitHub

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](https://github.com/kubernetes/kubernetes/blob/dbfad789e35979083b8d4b35a4cb405c324cc485/pkg/util/cache/lruexpirecache.go#L48) requires write lock since [groupcache/lru#Get](https://github.com/golang/groupcache/blob/a6b377e3400b08991b80d6805d627f347f983866/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
parents f052de66 0bd47567
...@@ -25,7 +25,7 @@ import ( ...@@ -25,7 +25,7 @@ import (
type LRUExpireCache struct { type LRUExpireCache struct {
cache *lru.Cache cache *lru.Cache
lock sync.RWMutex lock sync.Mutex
} }
func NewLRUExpireCache(maxSize int) *LRUExpireCache { func NewLRUExpireCache(maxSize int) *LRUExpireCache {
...@@ -46,8 +46,8 @@ func (c *LRUExpireCache) Add(key lru.Key, value interface{}, ttl time.Duration) ...@@ -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) { func (c *LRUExpireCache) Get(key lru.Key) (interface{}, bool) {
c.lock.RLock() c.lock.Lock()
defer c.lock.RUnlock() defer c.lock.Unlock()
e, ok := c.cache.Get(key) e, ok := c.cache.Get(key)
if !ok { if !ok {
return nil, false return nil, false
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment