diff --git a/core/state/snapshot/iterator.go b/core/state/snapshot/iterator.go index 84cc5c3bca..4c619d3ce8 100644 --- a/core/state/snapshot/iterator.go +++ b/core/state/snapshot/iterator.go @@ -125,8 +125,10 @@ func (it *diffAccountIterator) Account() []byte { blob, ok := it.layer.accountData[it.curHash] if !ok { if _, ok := it.layer.destructSet[it.curHash]; ok { + it.layer.lock.RUnlock() return nil } + it.layer.lock.RUnlock() panic(fmt.Sprintf("iterator referenced non-existent account: %x", it.curHash)) } it.layer.lock.RUnlock() diff --git a/core/state/snapshot/snapshot.go b/core/state/snapshot/snapshot.go index 27a8c7f0bb..35cc8da432 100644 --- a/core/state/snapshot/snapshot.go +++ b/core/state/snapshot/snapshot.go @@ -420,6 +420,7 @@ func diffToDisk(bottom *diffLayer) *diskLayer { // Mark the original base as stale as we're going to create a new wrapper base.lock.Lock() if base.stale { + base.lock.Unlock() panic("parent disk layer is stale") // we've committed into the same base from two children, boo } base.stale = true