common/lru: fix race in lru (#26164)

This fixes a problem in the SizeConstrainedLRU. The SCLRU uses an underlying simple lru which is not thread safe.
During the Get operation, the recentness of the accessed item is updated, so it is not a pure read-operation. Therefore, the mutex we need is a full mutex, not RLock.

This PR changes the mutex to be a regular Mutex, instead of RWMutex, so a reviewer can at a glance see that all affected locations are fixed.
This commit is contained in:
Martin Holst Swende 2022-11-11 19:48:36 +01:00 committed by GitHub
parent ea65edaa28
commit 8334b5f51a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -33,7 +33,7 @@ type SizeConstrainedLRU struct {
size uint64 size uint64
maxSize uint64 maxSize uint64
lru *simplelru.LRU lru *simplelru.LRU
lock sync.RWMutex lock sync.Mutex
} }
// NewSizeConstrainedLRU creates a new SizeConstrainedLRU. // NewSizeConstrainedLRU creates a new SizeConstrainedLRU.
@ -78,8 +78,8 @@ func (c *SizeConstrainedLRU) Add(key common.Hash, value []byte) (evicted bool) {
// Get looks up a key's value from the cache. // Get looks up a key's value from the cache.
func (c *SizeConstrainedLRU) Get(key common.Hash) []byte { func (c *SizeConstrainedLRU) Get(key common.Hash) []byte {
c.lock.RLock() c.lock.Lock()
defer c.lock.RUnlock() defer c.lock.Unlock()
if v, ok := c.lru.Get(key); ok { if v, ok := c.lru.Get(key); ok {
return v.([]byte) return v.([]byte)