|
@@ -930,6 +930,8 @@ func (bc *BlockChain) truncateAncient(head uint64) error {
|
|
|
// InsertReceiptChain attempts to complete an already existing header chain with
|
|
// InsertReceiptChain attempts to complete an already existing header chain with
|
|
|
// transaction and receipt data.
|
|
// transaction and receipt data.
|
|
|
func (bc *BlockChain) InsertReceiptChain(blockChain types.Blocks, receiptChain []types.Receipts, ancientLimit uint64) (int, error) {
|
|
func (bc *BlockChain) InsertReceiptChain(blockChain types.Blocks, receiptChain []types.Receipts, ancientLimit uint64) (int, error) {
|
|
|
|
|
+ // We don't require the chainMu here since we want to maximize the
|
|
|
|
|
+ // concurrency of header insertion and receipt insertion.
|
|
|
bc.wg.Add(1)
|
|
bc.wg.Add(1)
|
|
|
defer bc.wg.Done()
|
|
defer bc.wg.Done()
|
|
|
|
|
|
|
@@ -962,19 +964,21 @@ func (bc *BlockChain) InsertReceiptChain(blockChain types.Blocks, receiptChain [
|
|
|
// updateHead updates the head fast sync block if the inserted blocks are better
|
|
// updateHead updates the head fast sync block if the inserted blocks are better
|
|
|
// and returns a indicator whether the inserted blocks are canonical.
|
|
// and returns a indicator whether the inserted blocks are canonical.
|
|
|
updateHead := func(head *types.Block) bool {
|
|
updateHead := func(head *types.Block) bool {
|
|
|
- var isCanonical bool
|
|
|
|
|
bc.chainmu.Lock()
|
|
bc.chainmu.Lock()
|
|
|
- if td := bc.GetTd(head.Hash(), head.NumberU64()); td != nil { // Rewind may have occurred, skip in that case
|
|
|
|
|
- currentFastBlock := bc.CurrentFastBlock()
|
|
|
|
|
|
|
+
|
|
|
|
|
+ // Rewind may have occurred, skip in that case.
|
|
|
|
|
+ if bc.CurrentHeader().Number.Cmp(head.Number()) >= 0 {
|
|
|
|
|
+ currentFastBlock, td := bc.CurrentFastBlock(), bc.GetTd(head.Hash(), head.NumberU64())
|
|
|
if bc.GetTd(currentFastBlock.Hash(), currentFastBlock.NumberU64()).Cmp(td) < 0 {
|
|
if bc.GetTd(currentFastBlock.Hash(), currentFastBlock.NumberU64()).Cmp(td) < 0 {
|
|
|
rawdb.WriteHeadFastBlockHash(bc.db, head.Hash())
|
|
rawdb.WriteHeadFastBlockHash(bc.db, head.Hash())
|
|
|
bc.currentFastBlock.Store(head)
|
|
bc.currentFastBlock.Store(head)
|
|
|
headFastBlockGauge.Update(int64(head.NumberU64()))
|
|
headFastBlockGauge.Update(int64(head.NumberU64()))
|
|
|
- isCanonical = true
|
|
|
|
|
|
|
+ bc.chainmu.Unlock()
|
|
|
|
|
+ return true
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
bc.chainmu.Unlock()
|
|
bc.chainmu.Unlock()
|
|
|
- return isCanonical
|
|
|
|
|
|
|
+ return false
|
|
|
}
|
|
}
|
|
|
// writeAncient writes blockchain and corresponding receipt chain into ancient store.
|
|
// writeAncient writes blockchain and corresponding receipt chain into ancient store.
|
|
|
//
|
|
//
|