|
@@ -1277,6 +1277,7 @@ func (bc *BlockChain) InsertReceiptChain(blockChain types.Blocks, receiptChain [
|
|
|
}
|
|
}
|
|
|
// writeLive writes blockchain and corresponding receipt chain into active store.
|
|
// writeLive writes blockchain and corresponding receipt chain into active store.
|
|
|
writeLive := func(blockChain types.Blocks, receiptChain []types.Receipts) (int, error) {
|
|
writeLive := func(blockChain types.Blocks, receiptChain []types.Receipts) (int, error) {
|
|
|
|
|
+ skipPresenceCheck := false
|
|
|
batch := bc.db.NewBatch()
|
|
batch := bc.db.NewBatch()
|
|
|
for i, block := range blockChain {
|
|
for i, block := range blockChain {
|
|
|
// Short circuit insertion if shutting down or processing failed
|
|
// Short circuit insertion if shutting down or processing failed
|
|
@@ -1287,9 +1288,17 @@ func (bc *BlockChain) InsertReceiptChain(blockChain types.Blocks, receiptChain [
|
|
|
if !bc.HasHeader(block.Hash(), block.NumberU64()) {
|
|
if !bc.HasHeader(block.Hash(), block.NumberU64()) {
|
|
|
return i, fmt.Errorf("containing header #%d [%x…] unknown", block.Number(), block.Hash().Bytes()[:4])
|
|
return i, fmt.Errorf("containing header #%d [%x…] unknown", block.Number(), block.Hash().Bytes()[:4])
|
|
|
}
|
|
}
|
|
|
- if bc.HasBlock(block.Hash(), block.NumberU64()) {
|
|
|
|
|
- stats.ignored++
|
|
|
|
|
- continue
|
|
|
|
|
|
|
+ if !skipPresenceCheck {
|
|
|
|
|
+ // Ignore if the entire data is already known
|
|
|
|
|
+ if bc.HasBlock(block.Hash(), block.NumberU64()) {
|
|
|
|
|
+ stats.ignored++
|
|
|
|
|
+ continue
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // If block N is not present, neither are the later blocks.
|
|
|
|
|
+ // This should be true, but if we are mistaken, the shortcut
|
|
|
|
|
+ // here will only cause overwriting of some existing data
|
|
|
|
|
+ skipPresenceCheck = true
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
// Write all the data out into the database
|
|
// Write all the data out into the database
|
|
|
rawdb.WriteBody(batch, block.Hash(), block.NumberU64(), block.Body())
|
|
rawdb.WriteBody(batch, block.Hash(), block.NumberU64(), block.Body())
|