core/state/snapshot: fix data race in diff layer (#22540)
This commit is contained in:
parent
73ed68988f
commit
c79fc209cd
|
@ -296,13 +296,17 @@ func (dl *diffLayer) AccountRLP(hash common.Hash) ([]byte, error) {
|
||||||
if !hit {
|
if !hit {
|
||||||
hit = dl.diffed.Contains(destructBloomHasher(hash))
|
hit = dl.diffed.Contains(destructBloomHasher(hash))
|
||||||
}
|
}
|
||||||
|
var origin *diskLayer
|
||||||
|
if !hit {
|
||||||
|
origin = dl.origin // extract origin while holding the lock
|
||||||
|
}
|
||||||
dl.lock.RUnlock()
|
dl.lock.RUnlock()
|
||||||
|
|
||||||
// If the bloom filter misses, don't even bother with traversing the memory
|
// If the bloom filter misses, don't even bother with traversing the memory
|
||||||
// diff layers, reach straight into the bottom persistent disk layer
|
// diff layers, reach straight into the bottom persistent disk layer
|
||||||
if !hit {
|
if origin != nil {
|
||||||
snapshotBloomAccountMissMeter.Mark(1)
|
snapshotBloomAccountMissMeter.Mark(1)
|
||||||
return dl.origin.AccountRLP(hash)
|
return origin.AccountRLP(hash)
|
||||||
}
|
}
|
||||||
// The bloom filter hit, start poking in the internal maps
|
// The bloom filter hit, start poking in the internal maps
|
||||||
return dl.accountRLP(hash, 0)
|
return dl.accountRLP(hash, 0)
|
||||||
|
@ -358,13 +362,17 @@ func (dl *diffLayer) Storage(accountHash, storageHash common.Hash) ([]byte, erro
|
||||||
if !hit {
|
if !hit {
|
||||||
hit = dl.diffed.Contains(destructBloomHasher(accountHash))
|
hit = dl.diffed.Contains(destructBloomHasher(accountHash))
|
||||||
}
|
}
|
||||||
|
var origin *diskLayer
|
||||||
|
if !hit {
|
||||||
|
origin = dl.origin // extract origin while holding the lock
|
||||||
|
}
|
||||||
dl.lock.RUnlock()
|
dl.lock.RUnlock()
|
||||||
|
|
||||||
// If the bloom filter misses, don't even bother with traversing the memory
|
// If the bloom filter misses, don't even bother with traversing the memory
|
||||||
// diff layers, reach straight into the bottom persistent disk layer
|
// diff layers, reach straight into the bottom persistent disk layer
|
||||||
if !hit {
|
if origin != nil {
|
||||||
snapshotBloomStorageMissMeter.Mark(1)
|
snapshotBloomStorageMissMeter.Mark(1)
|
||||||
return dl.origin.Storage(accountHash, storageHash)
|
return origin.Storage(accountHash, storageHash)
|
||||||
}
|
}
|
||||||
// The bloom filter hit, start poking in the internal maps
|
// The bloom filter hit, start poking in the internal maps
|
||||||
return dl.storage(accountHash, storageHash, 0)
|
return dl.storage(accountHash, storageHash, 0)
|
||||||
|
|
Loading…
Reference in New Issue