aboutsummaryrefslogtreecommitdiffstats
path: root/core/consensus.go
diff options
context:
space:
mode:
authorJimmy Hu <jimmy.hu@dexon.org>2018-11-02 10:40:29 +0800
committerGitHub <noreply@github.com>2018-11-02 10:40:29 +0800
commitde9b5538bb35fef2459243464fc9c5801b421675 (patch)
tree33edf14cf30f3c4ddd41a010db0088f534cc1add /core/consensus.go
parent1467d8a82b32fb91250f7717a8be47858a38d85b (diff)
downloaddexon-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.go40
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 {