Merge pull request #1417 from flicker-harmony/pr_crash_fix

Pangaea crash fixes
pull/1421/head
Leo Chen 5 years ago committed by GitHub
commit baf29c9750
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 15
      core/blockchain.go

@ -822,20 +822,24 @@ func (bc *BlockChain) Rollback(chain []common.Hash) {
hash := chain[i] hash := chain[i]
currentHeader := bc.hc.CurrentHeader() currentHeader := bc.hc.CurrentHeader()
if currentHeader.Hash() == hash { if currentHeader != nil && currentHeader.Hash() == hash {
bc.hc.SetCurrentHeader(bc.GetHeader(currentHeader.ParentHash, currentHeader.Number.Uint64()-1)) bc.hc.SetCurrentHeader(bc.GetHeader(currentHeader.ParentHash, currentHeader.Number.Uint64()-1))
} }
if currentFastBlock := bc.CurrentFastBlock(); currentFastBlock.Hash() == hash { if currentFastBlock := bc.CurrentFastBlock(); currentFastBlock != nil && currentFastBlock.Hash() == hash {
newFastBlock := bc.GetBlock(currentFastBlock.ParentHash(), currentFastBlock.NumberU64()-1) newFastBlock := bc.GetBlock(currentFastBlock.ParentHash(), currentFastBlock.NumberU64()-1)
if newFastBlock != nil {
bc.currentFastBlock.Store(newFastBlock) bc.currentFastBlock.Store(newFastBlock)
rawdb.WriteHeadFastBlockHash(bc.db, newFastBlock.Hash()) rawdb.WriteHeadFastBlockHash(bc.db, newFastBlock.Hash())
} }
if currentBlock := bc.CurrentBlock(); currentBlock.Hash() == hash { }
if currentBlock := bc.CurrentBlock(); currentBlock != nil && currentBlock.Hash() == hash {
newBlock := bc.GetBlock(currentBlock.ParentHash(), currentBlock.NumberU64()-1) newBlock := bc.GetBlock(currentBlock.ParentHash(), currentBlock.NumberU64()-1)
if newBlock != nil {
bc.currentBlock.Store(newBlock) bc.currentBlock.Store(newBlock)
rawdb.WriteHeadBlockHash(bc.db, newBlock.Hash()) rawdb.WriteHeadBlockHash(bc.db, newBlock.Hash())
} }
} }
}
} }
// SetReceiptsData computes all the non-consensus fields of the receipts // SetReceiptsData computes all the non-consensus fields of the receipts
@ -1264,13 +1268,15 @@ func (bc *BlockChain) insertChain(chain types.Blocks) (int, []interface{}, []*ty
var winner []*types.Block var winner []*types.Block
parent := bc.GetBlock(block.ParentHash(), block.NumberU64()-1) parent := bc.GetBlock(block.ParentHash(), block.NumberU64()-1)
for !bc.HasState(parent.Root()) { for parent != nil && !bc.HasState(parent.Root()) {
winner = append(winner, parent) winner = append(winner, parent)
parent = bc.GetBlock(parent.ParentHash(), parent.NumberU64()-1) parent = bc.GetBlock(parent.ParentHash(), parent.NumberU64()-1)
} }
for j := 0; j < len(winner)/2; j++ { for j := 0; j < len(winner)/2; j++ {
winner[j], winner[len(winner)-1-j] = winner[len(winner)-1-j], winner[j] winner[j], winner[len(winner)-1-j] = winner[len(winner)-1-j], winner[j]
} }
// Prune in case non-empty winner chain
if len(winner) > 0 {
// Import all the pruned blocks to make the state available // Import all the pruned blocks to make the state available
bc.chainmu.Unlock() bc.chainmu.Unlock()
_, evs, logs, err := bc.insertChain(winner) _, evs, logs, err := bc.insertChain(winner)
@ -1280,6 +1286,7 @@ func (bc *BlockChain) insertChain(chain types.Blocks) (int, []interface{}, []*ty
if err != nil { if err != nil {
return i, events, coalescedLogs, err return i, events, coalescedLogs, err
} }
}
case err != nil: case err != nil:
bc.reportBlock(block, nil, err) bc.reportBlock(block, nil, err)

Loading…
Cancel
Save