core: use DAO-provided block height during during state reset
Don't use cache because it's not yet initialized. Also, perform safety checks only if state reset wasn't yet started. These fixes alloww to solve the following problem while recovering from interrupted state reset: ``` anna@kiwi:~/Documents/GitProjects/nspcc-dev/neo-go$ ./bin/neo-go db reset -t --height 83000 2022-11-20T15:51:31.431+0300 INFO MaxValidUntilBlockIncrement is not set or wrong, using default value {"MaxValidUntilBlockIncrement": 5760} 2022-11-20T15:51:31.434+0300 INFO restoring blockchain {"version": "0.2.6"} failed to create Blockchain instance: could not initialize blockchain: current block height is 0, can't reset state to height 83000 ```
This commit is contained in:
parent
7d55bf2cc1
commit
283da8f599
1 changed files with 19 additions and 12 deletions
|
@ -672,19 +672,26 @@ func (bc *Blockchain) Reset(height uint32) error {
|
|||
}
|
||||
|
||||
func (bc *Blockchain) resetStateInternal(height uint32, stage stateChangeStage) error {
|
||||
currHeight := bc.BlockHeight()
|
||||
if height > currHeight {
|
||||
return fmt.Errorf("current block height is %d, can't reset state to height %d", currHeight, height)
|
||||
// Cache isn't yet initialized, so retrieve header right from DAO.
|
||||
currHeight, err := bc.dao.GetCurrentBlockHeight()
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to retrieve current block height: %w", err)
|
||||
}
|
||||
if height == currHeight && stage == none {
|
||||
bc.log.Info("chain is already at the proper state", zap.Uint32("height", height))
|
||||
return nil
|
||||
}
|
||||
if bc.config.KeepOnlyLatestState {
|
||||
return fmt.Errorf("KeepOnlyLatestState is enabled, state for height %d is outdated and removed from the storage", height)
|
||||
}
|
||||
if bc.config.RemoveUntraceableBlocks && currHeight >= bc.config.MaxTraceableBlocks {
|
||||
return fmt.Errorf("RemoveUntraceableBlocks is enabled, a necessary batch of traceable blocks has already been removed")
|
||||
// State reset may already be started by this moment, so perform these checks only if it wasn't.
|
||||
if stage == none {
|
||||
if height > currHeight {
|
||||
return fmt.Errorf("current block height is %d, can't reset state to height %d", currHeight, height)
|
||||
}
|
||||
if height == currHeight {
|
||||
bc.log.Info("chain is already at the proper state", zap.Uint32("height", height))
|
||||
return nil
|
||||
}
|
||||
if bc.config.KeepOnlyLatestState {
|
||||
return fmt.Errorf("KeepOnlyLatestState is enabled, state for height %d is outdated and removed from the storage", height)
|
||||
}
|
||||
if bc.config.RemoveUntraceableBlocks && currHeight >= bc.config.MaxTraceableBlocks {
|
||||
return fmt.Errorf("RemoveUntraceableBlocks is enabled, a necessary batch of traceable blocks has already been removed")
|
||||
}
|
||||
}
|
||||
|
||||
// Retrieve necessary state before the DB modification.
|
||||
|
|
Loading…
Reference in a new issue