From 52ba4dfb3663289c7fd0b513a28bbc0faa9ecf13 Mon Sep 17 00:00:00 2001 From: William Banfield Date: Thu, 17 Mar 2022 16:51:47 -0400 Subject: [PATCH] handle panics --- internal/consensus/state.go | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/internal/consensus/state.go b/internal/consensus/state.go index 90c287f8c..e91875e50 100644 --- a/internal/consensus/state.go +++ b/internal/consensus/state.go @@ -948,6 +948,8 @@ func (cs *State) receiveRoutine(ctx context.Context, maxSteps int) { // state transitions on complete-proposal, 2/3-any, 2/3-one func (cs *State) handleMsg(ctx context.Context, mi msgInfo) { + cs.mtx.Lock() + defer cs.mtx.Unlock() var ( added bool err error @@ -959,13 +961,10 @@ func (cs *State) handleMsg(ctx context.Context, mi msgInfo) { case *ProposalMessage: // will not cause transition. // once proposal is set, we can receive block parts - cs.mtx.Lock() err = cs.setProposal(msg.Proposal, mi.ReceiveTime) - cs.mtx.Unlock() case *BlockPartMessage: // if the proposal is complete, we'll enterPrevote or tryFinalizeCommit - cs.mtx.Lock() added, err = cs.addProposalBlockPart(ctx, msg, peerID) // We unlock here to yield to any routines that need to read the the RoundState. @@ -989,7 +988,6 @@ func (cs *State) handleMsg(ctx context.Context, mi msgInfo) { select { case cs.statsMsgQueue <- mi: case <-ctx.Done(): - cs.mtx.Unlock() return } } @@ -1003,22 +1001,18 @@ func (cs *State) handleMsg(ctx context.Context, mi msgInfo) { ) err = nil } - cs.mtx.Unlock() case *VoteMessage: // attempt to add the vote and dupeout the validator if its a duplicate signature // if the vote gives us a 2/3-any or 2/3-one, we transition - cs.mtx.Lock() added, err = cs.tryAddVote(ctx, msg.Vote, peerID) if added { select { case cs.statsMsgQueue <- mi: case <-ctx.Done(): - cs.mtx.Unlock() return } } - cs.mtx.Unlock() // TODO: punish peer // We probably don't want to stop the peer here. The vote does not