mirror of
https://github.com/tendermint/tendermint.git
synced 2026-09-03 14:47:16 +00:00
consensus: avoid race in accessing channel (#8149)
This commit is contained in:
@@ -348,6 +348,8 @@ func (r *Reactor) broadcastHasVoteMessage(ctx context.Context, vote *types.Vote)
|
||||
// internal pubsub defined in the consensus state to broadcast them to peers
|
||||
// upon receiving.
|
||||
func (r *Reactor) subscribeToBroadcastEvents() {
|
||||
onStopCh := r.state.getOnStopCh()
|
||||
|
||||
err := r.state.evsw.AddListenerForEvent(
|
||||
listenerIDConsensus,
|
||||
types.EventNewRoundStepValue,
|
||||
@@ -356,7 +358,7 @@ func (r *Reactor) subscribeToBroadcastEvents() {
|
||||
return err
|
||||
}
|
||||
select {
|
||||
case r.state.onStopCh <- data.(*cstypes.RoundState):
|
||||
case onStopCh <- data.(*cstypes.RoundState):
|
||||
return nil
|
||||
case <-ctx.Done():
|
||||
return ctx.Err()
|
||||
|
||||
@@ -493,12 +493,19 @@ func (cs *State) loadWalFile(ctx context.Context) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (cs *State) getOnStopCh() chan *cstypes.RoundState {
|
||||
cs.mtx.RLock()
|
||||
defer cs.mtx.RUnlock()
|
||||
|
||||
return cs.onStopCh
|
||||
}
|
||||
|
||||
// OnStop implements service.Service.
|
||||
func (cs *State) OnStop() {
|
||||
// If the node is committing a new block, wait until it is finished!
|
||||
if cs.GetRoundState().Step == cstypes.RoundStepCommit {
|
||||
select {
|
||||
case <-cs.onStopCh:
|
||||
case <-cs.getOnStopCh():
|
||||
case <-time.After(cs.config.TimeoutCommit):
|
||||
cs.logger.Error("OnStop: timeout waiting for commit to finish", "time", cs.config.TimeoutCommit)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user