@ -624,7 +624,7 @@ func (cs *ConsensusState) handleMsg(mi msgInfo) {
err = cs . setProposal ( msg . Proposal )
err = cs . setProposal ( msg . Proposal )
case * BlockPartMessage :
case * BlockPartMessage :
// if the proposal is complete, we'll enterPrevote or tryFinalizeCommit
// if the proposal is complete, we'll enterPrevote or tryFinalizeCommit
_ , err = cs . addProposalBlockPart ( msg . Height , msg . Part )
_ , err = cs . addProposalBlockPart ( msg , peerID )
if err != nil && msg . Round != cs . Round {
if err != nil && msg . Round != cs . Round {
cs . Logger . Debug ( "Received block part from wrong round" , "height" , cs . Height , "csRound" , cs . Round , "blockRound" , msg . Round )
cs . Logger . Debug ( "Received block part from wrong round" , "height" , cs . Height , "csRound" , cs . Round , "blockRound" , msg . Round )
err = nil
err = nil
@ -1399,17 +1399,22 @@ func (cs *ConsensusState) defaultSetProposal(proposal *types.Proposal) error {
// NOTE: block is not necessarily valid.
// NOTE: block is not necessarily valid.
// Asynchronously triggers either enterPrevote (before we timeout of propose) or tryFinalizeCommit, once we have the full block.
// Asynchronously triggers either enterPrevote (before we timeout of propose) or tryFinalizeCommit, once we have the full block.
func ( cs * ConsensusState ) addProposalBlockPart ( height int64 , part * types . Part ) ( added bool , err error ) {
func ( cs * ConsensusState ) addProposalBlockPart ( msg * BlockPartMessage , peerID p2p . ID ) ( added bool , err error ) {
height , round , part := msg . Height , msg . Round , msg . Part
// Blocks might be reused, so round mismatch is OK
// Blocks might be reused, so round mismatch is OK
if cs . Height != height {
if cs . Height != height {
cs . Logger . Debug ( "Received block part from wrong height" , "height" , height )
cs . Logger . Debug ( "Received block part from wrong height" , "height" , height , "round" , round )
return false , nil
return false , nil
}
}
// We're not expecting a block part.
// We're not expecting a block part.
if cs . ProposalBlockParts == nil {
if cs . ProposalBlockParts == nil {
cs . Logger . Info ( "Received a block part when we're not expecting any" , "height" , height )
return false , nil // TODO: bad peer? Return error?
// NOTE: this can happen when we've gone to a higher round and
// then receive parts from the previous round - not necessarily a bad peer.
cs . Logger . Info ( "Received a block part when we're not expecting any" ,
"height" , height , "round" , round , "index" , part . Index , "peer" , peerID )
return false , nil
}
}
added , err = cs . ProposalBlockParts . AddPart ( part )
added , err = cs . ProposalBlockParts . AddPart ( part )
@ -1443,7 +1448,7 @@ func (cs *ConsensusState) addProposalBlockPart(height int64, part *types.Part) (
// procedure at this point.
// procedure at this point.
}
}
if cs . Step = = cstypes . RoundStepPropose && cs . isProposalComplete ( ) {
if cs . Step < = cstypes . RoundStepPropose && cs . isProposalComplete ( ) {
// Move onto the next step
// Move onto the next step
cs . enterPrevote ( height , cs . Round )
cs . enterPrevote ( height , cs . Round )
} else if cs . Step == cstypes . RoundStepCommit {
} else if cs . Step == cstypes . RoundStepCommit {