diff --git a/triedb/pathdb/database.go b/triedb/pathdb/database.go index e52949c93e..996d3f3ce1 100644 --- a/triedb/pathdb/database.go +++ b/triedb/pathdb/database.go @@ -543,15 +543,15 @@ func (db *Database) Recoverable(root common.Hash) bool { if db.stateFreezer == nil { return false } - // Ensure the requested state is a canonical state and all state - // histories in range [id+1, dl.ID] are present and complete. - return checkStateHistories(db.stateFreezer, *id+1, dl.stateID()-*id, func(m *meta) error { - if m.parent != root { - return errors.New("unexpected state history") - } - root = m.root - return nil - }) == nil + blob := rawdb.ReadStateHistoryMeta(db.stateFreezer, *id+1) + if len(blob) == 0 { + return false // pruned from the tail or otherwise unavailable + } + var m meta + if err := m.decode(blob); err != nil { + return false + } + return m.parent == root } // Close closes the trie database and the held freezer. diff --git a/triedb/pathdb/history_state.go b/triedb/pathdb/history_state.go index 23428b1a54..9d3bf23e22 100644 --- a/triedb/pathdb/history_state.go +++ b/triedb/pathdb/history_state.go @@ -612,30 +612,3 @@ func writeStateHistory(writer ethdb.AncientWriter, dl *diffLayer) error { 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 -}