|
|
@ -391,17 +391,23 @@ func (db *Database) Recoverable(root common.Hash) bool { |
|
|
|
if *id >= dl.stateID() { |
|
|
|
if *id >= dl.stateID() { |
|
|
|
return false |
|
|
|
return false |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// This is a temporary workaround for the unavailability of the freezer in
|
|
|
|
|
|
|
|
// dev mode. As a consequence, the Pathdb loses the ability for deep reorg
|
|
|
|
|
|
|
|
// in certain cases.
|
|
|
|
|
|
|
|
// TODO(rjl493456442): Implement the in-memory ancient store.
|
|
|
|
|
|
|
|
if db.freezer == nil { |
|
|
|
|
|
|
|
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 complete.
|
|
|
|
parent := root |
|
|
|
|
|
|
|
return checkHistories(db.freezer, *id+1, dl.stateID()-*id, func(m *meta) error { |
|
|
|
return checkHistories(db.freezer, *id+1, dl.stateID()-*id, func(m *meta) error { |
|
|
|
if m.parent != parent { |
|
|
|
if m.parent != root { |
|
|
|
return errors.New("unexpected state history") |
|
|
|
return errors.New("unexpected state history") |
|
|
|
} |
|
|
|
} |
|
|
|
if len(m.incomplete) > 0 { |
|
|
|
if len(m.incomplete) > 0 { |
|
|
|
return errors.New("incomplete state history") |
|
|
|
return errors.New("incomplete state history") |
|
|
|
} |
|
|
|
} |
|
|
|
parent = m.root |
|
|
|
root = m.root |
|
|
|
return nil |
|
|
|
return nil |
|
|
|
}) == nil |
|
|
|
}) == nil |
|
|
|
} |
|
|
|
} |
|
|
|