diff --git a/consensus/reactor.go b/consensus/reactor.go index 9ccf53e50..a671b05c3 100644 --- a/consensus/reactor.go +++ b/consensus/reactor.go @@ -98,6 +98,9 @@ func (conR *ConsensusReactor) AddPeer(peer *p2p.Peer) { // Begin gossip routines for this peer. go conR.gossipDataRoutine(peer, peerState) go conR.gossipVotesRoutine(peer, peerState) + + // Send our state to peer. + conR.sendNewRoundStepRoutine(peer) } // Implements Reactor @@ -207,6 +210,30 @@ func (conR *ConsensusReactor) SetPrivValidator(priv *state.PrivValidator) { //-------------------------------------- +func makeRoundStepMessages(rs *RoundState) (nrsMsg *NewRoundStepMessage, csMsg *CommitStepMessage) { + // Get seconds since beginning of height. + timeElapsed := time.Now().Sub(rs.StartTime) + + // Broadcast NewRoundStepMessage + nrsMsg = &NewRoundStepMessage{ + Height: rs.Height, + Round: rs.Round, + Step: rs.Step, + SecondsSinceStartTime: uint(timeElapsed.Seconds()), + } + + // If the step is commit, then also broadcast a CommitStepMessage. + if rs.Step == RoundStepCommit { + csMsg = &CommitStepMessage{ + Height: rs.Height, + BlockParts: rs.ProposalBlockParts.Header(), + BlockBitArray: rs.ProposalBlockParts.BitArray(), + } + } + + return +} + // Listens for changes to the ConsensusState.Step by pulling // on conR.conS.NewStepCh(). func (conR *ConsensusReactor) broadcastNewRoundStepRoutine() { @@ -219,33 +246,27 @@ func (conR *ConsensusReactor) broadcastNewRoundStepRoutine() { return } - // Get seconds since beginning of height. - // Due to the condition documented, this is safe. - timeElapsed := time.Now().Sub(rs.StartTime) - - // Broadcast NewRoundStepMessage - { - msg := &NewRoundStepMessage{ - Height: rs.Height, - Round: rs.Round, - Step: rs.Step, - SecondsSinceStartTime: uint(timeElapsed.Seconds()), - } - conR.sw.Broadcast(StateCh, msg) + nrsMsg, csMsg := makeRoundStepMessages(rs) + if nrsMsg != nil { + conR.sw.Broadcast(StateCh, nrsMsg) } - - // If the step is commit, then also broadcast a CommitStepMessage. - if rs.Step == RoundStepCommit { - msg := &CommitStepMessage{ - Height: rs.Height, - BlockParts: rs.ProposalBlockParts.Header(), - BlockBitArray: rs.ProposalBlockParts.BitArray(), - } - conR.sw.Broadcast(StateCh, msg) + if csMsg != nil { + conR.sw.Broadcast(StateCh, csMsg) } } } +func (conR *ConsensusReactor) sendNewRoundStepRoutine(peer *p2p.Peer) { + rs := conR.conS.GetRoundState() + nrsMsg, csMsg := makeRoundStepMessages(rs) + if nrsMsg != nil { + peer.Send(StateCh, nrsMsg) + } + if csMsg != nil { + peer.Send(StateCh, nrsMsg) + } +} + func (conR *ConsensusReactor) gossipDataRoutine(peer *p2p.Peer, ps *PeerState) { OUTER_LOOP: