triedb/pathdb: limit the meta batch size for single retrieval

This commit is contained in:
Gary Rong 2024-03-04 12:04:55 +08:00
parent 3dc549b3d7
commit 36d6e742cb
2 changed files with 38 additions and 26 deletions

View file

@ -398,14 +398,34 @@ func (db *Database) Recoverable(root common.Hash) bool {
return false return false
} }
// Ensure the requested state is a canonical state and all state // Ensure the requested state is a canonical state and all state
// histories in range [id+1, disklayer.ID] are present and complete. // histories in range [id+1, diskLayer.ID] are present and linked.
return checkHistories(db.freezer, *id+1, dl.stateID()-*id, func(m *meta) error { var (
if m.parent != root { start = *id + 1
return errors.New("unexpected state history") limit = dl.stateID()
)
for {
// Short circuit if nothing more to check
if start > limit {
break
} }
root = m.root // Cap the meta items for single retrieval
return nil count := limit - start + 1
}) == nil if count > 1024 {
count = 1024
}
err := checkHistories(db.freezer, start, count, func(m *meta) error {
if m.parent != root {
return errors.New("unexpected state history")
}
root = m.root
return nil
})
if err != nil {
return false
}
start += count
}
return true
} }
// Close closes the trie database and the held freezer. // Close closes the trie database and the held freezer.

View file

@ -519,29 +519,21 @@ func writeHistory(freezer *rawdb.ResettableFreezer, dl *diffLayer) error {
return nil return nil
} }
// checkHistories retrieves a batch of meta objects with the specified range // checkHistories retrieves a batch of meta objects within the specified range
// and performs the callback on each item. // and performs the callback on top.
func checkHistories(freezer *rawdb.ResettableFreezer, start, count uint64, check func(*meta) error) error { func checkHistories(freezer *rawdb.ResettableFreezer, start, count uint64, check func(*meta) error) error {
for count > 0 { blobs, err := rawdb.ReadStateHistoryMetaList(freezer, start, count)
number := count if err != nil {
if number > 10000 { return err
number = 10000 // split the big read into small chunks }
} for _, blob := range blobs {
blobs, err := rawdb.ReadStateHistoryMetaList(freezer, start, number) var dec meta
if err != nil { if err := dec.decode(blob); err != nil {
return err return err
} }
for _, blob := range blobs { if err := check(&dec); err != nil {
var dec meta return err
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 return nil
} }