triedb/pathdb: make Recoverable check cheaper

This commit is contained in:
Gary Rong 2026-07-01 10:03:32 +08:00
parent e2f2b6cb42
commit 3958630ef8
2 changed files with 9 additions and 36 deletions

View file

@ -543,15 +543,15 @@ func (db *Database) Recoverable(root common.Hash) bool {
if db.stateFreezer == nil { if db.stateFreezer == nil {
return false return false
} }
// Ensure the requested state is a canonical state and all state blob := rawdb.ReadStateHistoryMeta(db.stateFreezer, *id+1)
// histories in range [id+1, dl.ID] are present and complete. if len(blob) == 0 {
return checkStateHistories(db.stateFreezer, *id+1, dl.stateID()-*id, func(m *meta) error { return false // pruned from the tail or otherwise unavailable
if m.parent != root { }
return errors.New("unexpected state history") var m meta
} if err := m.decode(blob); err != nil {
root = m.root return false
return nil }
}) == nil return m.parent == root
} }
// Close closes the trie database and the held freezer. // Close closes the trie database and the held freezer.

View file

@ -612,30 +612,3 @@ func writeStateHistory(writer ethdb.AncientWriter, dl *diffLayer) error {
return nil return nil
} }
// checkStateHistories retrieves a batch of metadata objects with the specified
// range and performs the callback on each item.
func checkStateHistories(reader ethdb.AncientReader, start, count uint64, check func(*meta) error) error {
for count > 0 {
number := count
if number > 10000 {
number = 10000 // split the big read into small chunks
}
blobs, err := rawdb.ReadStateHistoryMetaList(reader, start, number)
if err != nil {
return err
}
for _, blob := range blobs {
var dec meta
if err := dec.decode(blob); err != nil {
return err
}
if err := check(&dec); err != nil {
return err
}
}
count -= uint64(len(blobs))
start += uint64(len(blobs))
}
return nil
}