Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix data race #1259

Merged
merged 10 commits into from
Jul 21, 2020
4 changes: 2 additions & 2 deletions consensus/vbft/block_pool.go
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ func (pool *BlockPool) newBlockProposal(msg *blockProposalMsg) error {
// check dup-proposal from same proposer
for _, p := range candidate.Proposals {
if p.Block.getProposer() == msg.Block.getProposer() {
if bytes.Compare(p.Block.Block.Header.SigData[0], msg.Block.Block.Header.SigData[0]) == 0 {
if bytes.Compare(p.BlockProposerSig, msg.BlockProposerSig) == 0 {
return nil
}
return errDupProposal
Expand All @@ -151,7 +151,7 @@ func (pool *BlockPool) newBlockProposal(msg *blockProposalMsg) error {
proposer := msg.Block.getProposer()
eSig := &CandidateEndorseSigInfo{
EndorsedProposer: proposer,
Signature: msg.Block.Block.Header.SigData[0],
Signature: msg.BlockProposerSig,
ForEmpty: false,
}
if msg.Block.Block.Header.Height > 1 && msg.Block.CrossChainMsg != nil {
Expand Down
3 changes: 2 additions & 1 deletion consensus/vbft/chain_store.go
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,8 @@ func (self *ChainStore) AddBlock(block *Block) error {
log.Errorf("chainstore AddBlock GetBlockExecResult: %s", err)
return fmt.Errorf("chainstore AddBlock GetBlockExecResult: %s", err)
}
log.Debugf("execResult:%+v, AddBlock execResult height:%d \n", execResult, block.Block.Header.Height)
h := block.Block.Hash()
log.Debugf("execResult:%+v, AddBlock execResult height:%d, hash: %s \n", execResult, block.Block.Header.Height, h.ToHexString())
log.Debugf("chainstore addblock pendingBlocks height:%d,block height:%d", blkNum, block.getBlockNum())
self.pendingBlocks[blkNum] = &PendingBlock{block: block, execResult: &execResult, hasSubmitted: false}

Expand Down
13 changes: 7 additions & 6 deletions consensus/vbft/msg_builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -141,11 +141,12 @@ func (self *Server) constructHandshakeMsg() (*peerHandshakeMsg, error) {
if block == nil {
return nil, fmt.Errorf("failed to get sealed block, current block: %d", self.GetCurrentBlockNo())
}
cfg := self.GetChainConfig()
msg := &peerHandshakeMsg{
CommittedBlockNumber: blkNum,
CommittedBlockHash: blockhash,
CommittedBlockLeader: block.getProposer(),
ChainConfig: self.config,
ChainConfig: &cfg,
}

return msg, nil
Expand Down Expand Up @@ -177,7 +178,7 @@ func (self *Server) constructHeartbeatMsg() (*peerHeartbeatMsg, error) {
CommittedBlockLeader: block.getProposer(),
Endorsers: bookkeepers,
EndorsersSig: sigData,
ChainConfigView: self.config.View,
ChainConfigView: self.GetChainConfig().View,
}

return msg, nil
Expand Down Expand Up @@ -315,7 +316,7 @@ func (self *Server) constructEndorseMsg(proposal *blockProposalMsg, forEmpty boo
var blkHash common.Uint256
var err error
if !forEmpty {
proposerSig = proposal.Block.Block.Header.SigData[0]
proposerSig = proposal.BlockProposerSig
blkHash = proposal.Block.Block.Hash()

} else {
Expand All @@ -324,7 +325,7 @@ func (self *Server) constructEndorseMsg(proposal *blockProposalMsg, forEmpty boo
proposal.GetBlockNum(), proposal.Block.getProposer())
}

proposerSig = proposal.Block.EmptyBlock.Header.SigData[0]
proposerSig = proposal.EmptyBlockProposerSig
blkHash = proposal.Block.EmptyBlock.Hash()
}
endorserSig, err = signature.Sign(self.account, blkHash[:])
Expand Down Expand Up @@ -362,15 +363,15 @@ func (self *Server) constructCommitMsg(proposal *blockProposalMsg, endorses []*b
var err error

if !forEmpty {
proposerSig = proposal.Block.Block.Header.SigData[0]
proposerSig = proposal.BlockProposerSig
blkHash = proposal.Block.Block.Hash()
} else {
if proposal.Block.EmptyBlock == nil {
return nil, fmt.Errorf("blk %d proposal from %d has no empty proposal",
proposal.GetBlockNum(), proposal.Block.getProposer())
}

proposerSig = proposal.Block.EmptyBlock.Header.SigData[0]
proposerSig = proposal.EmptyBlockProposerSig
blkHash = proposal.Block.EmptyBlock.Hash()
}
committerSig, err = signature.Sign(self.account, blkHash[:])
Expand Down
10 changes: 9 additions & 1 deletion consensus/vbft/msg_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,9 @@ type ConsensusMsg interface {
}

type blockProposalMsg struct {
Block *Block `json:"block"`
Block *Block `json:"block"`
BlockProposerSig []byte
EmptyBlockProposerSig []byte
}

func (msg *blockProposalMsg) Type() MsgType {
Expand Down Expand Up @@ -127,6 +129,12 @@ func (msg *blockProposalMsg) UnmarshalJSON(data []byte) error {
}

msg.Block = blk
if blk.Block != nil {
msg.BlockProposerSig = blk.Block.Header.SigData[0]
}
if blk.EmptyBlock != nil {
msg.EmptyBlockProposerSig = blk.EmptyBlock.Header.SigData[0]
}
return nil
}

Expand Down
8 changes: 6 additions & 2 deletions consensus/vbft/node_sync.go
Original file line number Diff line number Diff line change
Expand Up @@ -241,8 +241,10 @@ func (self *Syncer) blockConsensusDone(blks BlockFromPeers) *Block {
for _, blk := range blks {
proposers[blk.getProposer()] += 1
}

chainCfg := self.server.GetChainConfig()
for proposerId, cnt := range proposers {
if cnt > int(self.server.config.C) {
if cnt > int(chainCfg.C) {
// find the block
for _, blk := range blks {
if blk.getProposer() == proposerId {
Expand All @@ -263,8 +265,10 @@ func (self *Syncer) blockCheckMerkleRoot(blks BlockFromPeers) *Block {
for _, blk := range blks {
merkleRoot[blk.getPrevExecMerkleRoot()] += 1
}

chainCfg := self.server.GetChainConfig()
for merklerootvalue, cnt := range merkleRoot {
if cnt > int(self.server.config.C) {
if cnt > int(chainCfg.C) {
// find the block
for _, blk := range blks {
if blk.getPrevExecMerkleRoot() == merklerootvalue {
Expand Down
10 changes: 9 additions & 1 deletion consensus/vbft/node_utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,14 @@ func (self *Server) SetCurrentBlockNo(blknum uint32) {
atomic.CompareAndSwapUint32(&self.currentBlockNum, self.currentBlockNum, blknum)
}

func (self *Server) GetChainConfig() vconfig.ChainConfig {
self.metaLock.RLock()
defer self.metaLock.RUnlock()
// shallow copy
cfg := *self.config
return cfg
}

func (self *Server) GetPeerMsgChan(peerIdx uint32) chan *p2pMsgPayload {
if C, ok := self.msgRecvC.Load(peerIdx); ok {
return C.(chan *p2pMsgPayload)
Expand Down Expand Up @@ -127,7 +135,7 @@ func (self *Server) isProposer(blockNum uint32, peerIdx uint32) bool {

func (self *Server) is2ndProposer(blockNum uint32, peerIdx uint32) bool {
rank := self.getProposerRank(blockNum, peerIdx)
return rank > 0 && rank <= int(self.config.C)
return rank > 0 && rank <= int(self.GetChainConfig().C)
}

func (self *Server) getProposerRank(blockNum uint32, peerIdx uint32) int {
Expand Down