From 0e130f5e2c096f487b79e82dbcb8ad2a3ac27aed Mon Sep 17 00:00:00 2001 From: William Banfield Date: Thu, 24 Feb 2022 15:52:47 -0500 Subject: [PATCH] change lock handling in consensus reactor --- consensus/reactor.go | 39 +++++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/consensus/reactor.go b/consensus/reactor.go index 0a7c590be..8033da501 100644 --- a/consensus/reactor.go +++ b/consensus/reactor.go @@ -46,6 +46,7 @@ type Reactor struct { mtx tmsync.RWMutex waitSync bool eventBus *types.EventBus + rs *cstypes.RoundState Metrics *Metrics } @@ -58,6 +59,7 @@ func NewReactor(consensusState *State, waitSync bool, options ...ReactorOption) conR := &Reactor{ conS: consensusState, waitSync: waitSync, + rs: consensusState.GetRoundState(), Metrics: NopMetrics(), } conR.BaseReactor = *p2p.NewBaseReactor("Consensus", conR) @@ -78,6 +80,7 @@ func (conR *Reactor) OnStart() error { go conR.peerStatsRoutine() conR.subscribeToBroadcastEvents() + go conR.updateRoundStateRoutine() if !conR.WaitSync() { err := conR.conS.Start() @@ -482,11 +485,35 @@ func makeRoundStepMessage(rs *cstypes.RoundState) (nrsMsg *NewRoundStepMessage) } func (conR *Reactor) sendNewRoundStepMessage(peer p2p.Peer) { - rs := conR.conS.GetRoundState() + rs := conR.getRoundState() nrsMsg := makeRoundStepMessage(rs) peer.Send(StateChannel, MustEncode(nrsMsg)) } +func (conR *Reactor) updateRoundStateRoutine() { + for { + if !conR.IsRunning() { + return + } + rs := conR.conS.GetRoundState() + conR.mtx.Lock() + conR.rs = rs + conR.mtx.Unlock() + } +} + +func (conR *Reactor) setRoundState(rs *cstypes.RoundState) { + conR.mtx.Lock() + defer conR.mtx.Unlock() + conR.rs = rs +} + +func (conR *Reactor) getRoundState() *cstypes.RoundState { + conR.mtx.RLock() + defer conR.mtx.RUnlock() + return conR.rs +} + func (conR *Reactor) gossipDataRoutine(peer p2p.Peer, ps *PeerState) { logger := conR.Logger.With("peer", peer) @@ -496,7 +523,7 @@ OUTER_LOOP: if !peer.IsRunning() || !conR.IsRunning() { return } - rs := conR.conS.GetRoundState() + rs := conR.getRoundState() prs := ps.GetRoundState() // Send proposal Block parts? @@ -639,7 +666,7 @@ OUTER_LOOP: if !peer.IsRunning() || !conR.IsRunning() { return } - rs := conR.conS.GetRoundState() + rs := conR.getRoundState() prs := ps.GetRoundState() switch sleeping { @@ -771,7 +798,7 @@ OUTER_LOOP: // Maybe send Height/Round/Prevotes { - rs := conR.conS.GetRoundState() + rs := conR.getRoundState() prs := ps.GetRoundState() if rs.Height == prs.Height { if maj23, ok := rs.Votes.Prevotes(prs.Round).TwoThirdsMajority(); ok { @@ -788,7 +815,7 @@ OUTER_LOOP: // Maybe send Height/Round/Precommits { - rs := conR.conS.GetRoundState() + rs := conR.getRoundState() prs := ps.GetRoundState() if rs.Height == prs.Height { if maj23, ok := rs.Votes.Precommits(prs.Round).TwoThirdsMajority(); ok { @@ -805,7 +832,7 @@ OUTER_LOOP: // Maybe send Height/Round/ProposalPOL { - rs := conR.conS.GetRoundState() + rs := conR.getRoundState() prs := ps.GetRoundState() if rs.Height == prs.Height && prs.ProposalPOLRound >= 0 { if maj23, ok := rs.Votes.Prevotes(prs.ProposalPOLRound).TwoThirdsMajority(); ok {