diff options
author | Jimmy Hu <jimmy.hu@dexon.org> | 2018-11-02 10:40:29 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-11-02 10:40:29 +0800 |
commit | de9b5538bb35fef2459243464fc9c5801b421675 (patch) | |
tree | 33edf14cf30f3c4ddd41a010db0088f534cc1add /core/consensus.go | |
parent | 1467d8a82b32fb91250f7717a8be47858a38d85b (diff) | |
download | dexon-consensus-de9b5538bb35fef2459243464fc9c5801b421675.tar dexon-consensus-de9b5538bb35fef2459243464fc9c5801b421675.tar.gz dexon-consensus-de9b5538bb35fef2459243464fc9c5801b421675.tar.bz2 dexon-consensus-de9b5538bb35fef2459243464fc9c5801b421675.tar.lz dexon-consensus-de9b5538bb35fef2459243464fc9c5801b421675.tar.xz dexon-consensus-de9b5538bb35fef2459243464fc9c5801b421675.tar.zst dexon-consensus-de9b5538bb35fef2459243464fc9c5801b421675.zip |
core: Fix various locking issues (#285)
Diffstat (limited to 'core/consensus.go')
-rw-r--r-- | core/consensus.go | 40 |
1 files changed, 23 insertions, 17 deletions
diff --git a/core/consensus.go b/core/consensus.go index fd651a1..5256168 100644 --- a/core/consensus.go +++ b/core/consensus.go @@ -71,11 +71,11 @@ type consensusBAReceiver struct { } func (recv *consensusBAReceiver) ProposeVote(vote *types.Vote) { - if err := recv.agreementModule.prepareVote(vote); err != nil { - recv.consensus.logger.Error("Failed to prepare vote", "error", err) - return - } go func() { + if err := recv.agreementModule.prepareVote(vote); err != nil { + recv.consensus.logger.Error("Failed to prepare vote", "error", err) + return + } if err := recv.agreementModule.processVote(vote); err != nil { recv.consensus.logger.Error("Failed to process vote", "error", err) return @@ -92,7 +92,6 @@ func (recv *consensusBAReceiver) ProposeBlock() common.Hash { recv.consensus.logger.Error("unable to propose block") return nullBlockHash } - recv.consensus.baModules[recv.chainID].addCandidateBlock(block) if err := recv.consensus.preProcessBlock(block); err != nil { recv.consensus.logger.Error("Failed to pre-process block", "error", err) return common.Hash{} @@ -129,10 +128,15 @@ func (recv *consensusBAReceiver) ConfirmBlock( recv.consensus.baConfirmedBlock[hash] = ch }() recv.consensus.network.PullBlocks(common.Hashes{hash}) - block = <-ch - recv.consensus.logger.Info("Receive unknown block", - "hash", hash, - "chainID", recv.chainID) + go func() { + block = <-ch + recv.consensus.logger.Info("Receive unknown block", + "hash", hash, + "chainID", recv.chainID) + recv.agreementModule.addCandidateBlock(block) + recv.ConfirmBlock(block.Hash, votes) + }() + return } } recv.consensus.ccModule.registerBlock(block) @@ -668,14 +672,16 @@ MessageLoop: continue MessageLoop } } - con.lock.Lock() - defer con.lock.Unlock() - // In case of multiple delivered block. - if _, exist := con.baConfirmedBlock[val.Hash]; !exist { - continue MessageLoop - } - delete(con.baConfirmedBlock, val.Hash) - ch <- val + func() { + con.lock.Lock() + defer con.lock.Unlock() + // In case of multiple delivered block. + if _, exist := con.baConfirmedBlock[val.Hash]; !exist { + return + } + delete(con.baConfirmedBlock, val.Hash) + ch <- val + }() } else if val.IsFinalized() { // For sync mode. if err := con.processFinalizedBlock(val); err != nil { |