mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-21 20:26:41 +00:00
triedb/pathdb: make Recoverable check cheaper
This commit is contained in:
parent
e2f2b6cb42
commit
3958630ef8
2 changed files with 9 additions and 36 deletions
|
|
@ -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")
|
|
||||||
}
|
}
|
||||||
root = m.root
|
var m meta
|
||||||
return nil
|
if err := m.decode(blob); err != nil {
|
||||||
}) == nil
|
return false
|
||||||
|
}
|
||||||
|
return m.parent == root
|
||||||
}
|
}
|
||||||
|
|
||||||
// Close closes the trie database and the held freezer.
|
// Close closes the trie database and the held freezer.
|
||||||
|
|
|
||||||
|
|
@ -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
|
|
||||||
}
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue