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:
parent
ea65edaa28
commit
8334b5f51a
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user