Merge pull request #1412 from tendermint/bucky/exit-conR-subscribe-routine

consensus: check for closed subscription channels and exit routine
This commit is contained in:
Ethan Buchman 2018-04-03 23:53:48 +03:00 committed by GitHub
commit 7aa6d36258
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 9 additions and 3 deletions

View File

@ -371,19 +371,21 @@ func (conR *ConsensusReactor) startBroadcastRoutine() error {
}
go func() {
var data interface{}
var ok bool
for {
select {
case data, ok := <-stepsCh:
case data, ok = <-stepsCh:
if ok { // a receive from a closed channel returns the zero value immediately
edrs := data.(types.TMEventData).Unwrap().(types.EventDataRoundState)
conR.broadcastNewRoundStep(edrs.RoundState.(*cstypes.RoundState))
}
case data, ok := <-votesCh:
case data, ok = <-votesCh:
if ok {
edv := data.(types.TMEventData).Unwrap().(types.EventDataVote)
conR.broadcastHasVoteMessage(edv.Vote)
}
case data, ok := <-heartbeatsCh:
case data, ok = <-heartbeatsCh:
if ok {
edph := data.(types.TMEventData).Unwrap().(types.EventDataProposalHeartbeat)
conR.broadcastProposalHeartbeatMessage(edph)
@ -392,6 +394,10 @@ func (conR *ConsensusReactor) startBroadcastRoutine() error {
conR.eventBus.UnsubscribeAll(ctx, subscriber)
return
}
if !ok {
conR.eventBus.UnsubscribeAll(ctx, subscriber)
return
}
}
}()