core/state/snapshot: stop generator if it hits missing trie nodes (#21649)

* core/state/snapshot: exit Geth if generator hits missing trie nodes

* core/state/snapshot: error instead of hard die on generator fault

* core/state/snapshot: don't enable logging on the tests
This commit is contained in:
Péter Szilágyi
2020-10-05 11:52:36 +03:00
committed by GitHub
parent 9d1e2027a0
commit a15d71a255
2 changed files with 207 additions and 2 deletions

View File

@ -129,7 +129,7 @@ func (dl *diskLayer) generate(stats *generatorStats) {
stats.wiping = nil
stats.start = time.Now()
// If generator was aboted during wipe, return
// If generator was aborted during wipe, return
case abort := <-dl.genAbort:
abort <- stats
return
@ -203,7 +203,10 @@ func (dl *diskLayer) generate(stats *generatorStats) {
if acc.Root != emptyRoot {
storeTrie, err := trie.NewSecure(acc.Root, dl.triedb)
if err != nil {
log.Crit("Storage trie inaccessible for snapshot generation", "err", err)
log.Error("Generator failed to access storage trie", "accroot", dl.root, "acchash", common.BytesToHash(accIt.Key), "stroot", acc.Root, "err", err)
abort := <-dl.genAbort
abort <- stats
return
}
var storeMarker []byte
if accMarker != nil && bytes.Equal(accountHash[:], accMarker) && len(dl.genMarker) > common.HashLength {
@ -238,6 +241,12 @@ func (dl *diskLayer) generate(stats *generatorStats) {
}
}
}
if err := storeIt.Err; err != nil {
log.Error("Generator failed to iterate storage trie", "accroot", dl.root, "acchash", common.BytesToHash(accIt.Key), "stroot", acc.Root, "err", err)
abort := <-dl.genAbort
abort <- stats
return
}
}
if time.Since(logged) > 8*time.Second {
stats.Log("Generating state snapshot", dl.root, accIt.Key)
@ -246,6 +255,12 @@ func (dl *diskLayer) generate(stats *generatorStats) {
// Some account processed, unmark the marker
accMarker = nil
}
if err := accIt.Err; err != nil {
log.Error("Generator failed to iterate account trie", "root", dl.root, "err", err)
abort := <-dl.genAbort
abort <- stats
return
}
// Snapshot fully generated, set the marker to nil
if batch.ValueSize() > 0 {
batch.Write()