|
|
@@ -296,13 +296,17 @@ func (dl *diffLayer) AccountRLP(hash common.Hash) ([]byte, error) {
|
|
|
if !hit {
|
|
|
hit = dl.diffed.Contains(destructBloomHasher(hash))
|
|
|
}
|
|
|
+ var origin *diskLayer
|
|
|
+ if !hit {
|
|
|
+ origin = dl.origin // extract origin while holding the lock
|
|
|
+ }
|
|
|
dl.lock.RUnlock()
|
|
|
|
|
|
// If the bloom filter misses, don't even bother with traversing the memory
|
|
|
// diff layers, reach straight into the bottom persistent disk layer
|
|
|
- if !hit {
|
|
|
+ if origin != nil {
|
|
|
snapshotBloomAccountMissMeter.Mark(1)
|
|
|
- return dl.origin.AccountRLP(hash)
|
|
|
+ return origin.AccountRLP(hash)
|
|
|
}
|
|
|
// The bloom filter hit, start poking in the internal maps
|
|
|
return dl.accountRLP(hash, 0)
|
|
|
@@ -358,13 +362,17 @@ func (dl *diffLayer) Storage(accountHash, storageHash common.Hash) ([]byte, erro
|
|
|
if !hit {
|
|
|
hit = dl.diffed.Contains(destructBloomHasher(accountHash))
|
|
|
}
|
|
|
+ var origin *diskLayer
|
|
|
+ if !hit {
|
|
|
+ origin = dl.origin // extract origin while holding the lock
|
|
|
+ }
|
|
|
dl.lock.RUnlock()
|
|
|
|
|
|
// If the bloom filter misses, don't even bother with traversing the memory
|
|
|
// diff layers, reach straight into the bottom persistent disk layer
|
|
|
- if !hit {
|
|
|
+ if origin != nil {
|
|
|
snapshotBloomStorageMissMeter.Mark(1)
|
|
|
- return dl.origin.Storage(accountHash, storageHash)
|
|
|
+ return origin.Storage(accountHash, storageHash)
|
|
|
}
|
|
|
// The bloom filter hit, start poking in the internal maps
|
|
|
return dl.storage(accountHash, storageHash, 0)
|