mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-26 14:46:42 +00:00
alternative approach
This commit is contained in:
parent
92c0695cf3
commit
f62a7e22c9
2 changed files with 18 additions and 10 deletions
|
|
@ -513,19 +513,33 @@ func (bc *BlockChain) loadLastState() error {
|
||||||
log.Warn("Empty database, resetting chain")
|
log.Warn("Empty database, resetting chain")
|
||||||
return bc.Reset()
|
return bc.Reset()
|
||||||
}
|
}
|
||||||
// Make sure the entire head block is available
|
headHeader := bc.GetHeaderByHash(head)
|
||||||
headBlock := bc.GetBlockByHash(head)
|
if headHeader == nil {
|
||||||
|
// Corrupt or empty database, init from scratch
|
||||||
|
log.Warn("Head header missing, resetting chain", "hash", head)
|
||||||
|
return bc.Reset()
|
||||||
|
}
|
||||||
|
|
||||||
|
var headBlock *types.Block
|
||||||
|
if cmp := headHeader.Number.Cmp(new(big.Int)); cmp == 1 {
|
||||||
|
// Make sure the entire head block is available.
|
||||||
|
headBlock = bc.GetBlockByHash(head)
|
||||||
|
} else if cmp == 0 {
|
||||||
|
// On a pruned node the block body might not be available. But a pruned
|
||||||
|
// block should never be the head block. The only exception is when, as
|
||||||
|
// a last resort, chain is reset to genesis.
|
||||||
|
headBlock = bc.genesisBlock
|
||||||
|
}
|
||||||
if headBlock == nil {
|
if headBlock == nil {
|
||||||
// Corrupt or empty database, init from scratch
|
// Corrupt or empty database, init from scratch
|
||||||
log.Warn("Head block missing, resetting chain", "hash", head)
|
log.Warn("Head block missing, resetting chain", "hash", head)
|
||||||
return bc.Reset()
|
return bc.Reset()
|
||||||
}
|
}
|
||||||
// Everything seems to be fine, set as the head block
|
// Everything seems to be fine, set as the head block
|
||||||
bc.currentBlock.Store(headBlock.Header())
|
bc.currentBlock.Store(headHeader)
|
||||||
headBlockGauge.Update(int64(headBlock.NumberU64()))
|
headBlockGauge.Update(int64(headBlock.NumberU64()))
|
||||||
|
|
||||||
// Restore the last known head header
|
// Restore the last known head header
|
||||||
headHeader := headBlock.Header()
|
|
||||||
if head := rawdb.ReadHeadHeaderHash(bc.db); head != (common.Hash{}) {
|
if head := rawdb.ReadHeadHeaderHash(bc.db); head != (common.Hash{}) {
|
||||||
if header := bc.GetHeaderByHash(head); header != nil {
|
if header := bc.GetHeaderByHash(head); header != nil {
|
||||||
headHeader = header
|
headHeader = header
|
||||||
|
|
|
||||||
|
|
@ -440,12 +440,6 @@ func ReadBodyRLP(db ethdb.Reader, hash common.Hash, number uint64) rlp.RawValue
|
||||||
// Check if the data is in ancients
|
// Check if the data is in ancients
|
||||||
if isCanon(reader, number, hash) {
|
if isCanon(reader, number, hash) {
|
||||||
data, _ = reader.Ancient(ChainFreezerBodiesTable, number)
|
data, _ = reader.Ancient(ChainFreezerBodiesTable, number)
|
||||||
// The freezer might be pruned. In the particular case of genesis, the block
|
|
||||||
// will be still available in kvdb. The full genesis block is needed on startup
|
|
||||||
// sometimes for repair.
|
|
||||||
if data == nil {
|
|
||||||
data, _ = db.Get(blockBodyKey(number, hash))
|
|
||||||
}
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
// If not, try reading from leveldb
|
// If not, try reading from leveldb
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue