|
@ -317,7 +317,8 @@ func (cs *ConsensusState) stepTransitionRoutine() { |
|
|
|
|
|
|
|
|
// For clarity, all state transitions that happen after some timeout are here.
|
|
|
// For clarity, all state transitions that happen after some timeout are here.
|
|
|
// Schedule the next action by pushing a RoundAction{} to cs.runActionCh.
|
|
|
// Schedule the next action by pushing a RoundAction{} to cs.runActionCh.
|
|
|
scheduleNextAction := func(rs *RoundState) { |
|
|
|
|
|
|
|
|
scheduleNextAction := func() { |
|
|
|
|
|
rs := cs.getRoundState() |
|
|
go func() { |
|
|
go func() { |
|
|
// NOTE: We can push directly to runActionCh because
|
|
|
// NOTE: We can push directly to runActionCh because
|
|
|
// we're running in a separate goroutine, which avoids deadlocks.
|
|
|
// we're running in a separate goroutine, which avoids deadlocks.
|
|
@ -350,14 +351,19 @@ func (cs *ConsensusState) stepTransitionRoutine() { |
|
|
// There's nothing to scheudle, we're waiting for
|
|
|
// There's nothing to scheudle, we're waiting for
|
|
|
// ProposalBlockParts.IsComplete() &&
|
|
|
// ProposalBlockParts.IsComplete() &&
|
|
|
// Commits.HasTwoThirdsMajority()
|
|
|
// Commits.HasTwoThirdsMajority()
|
|
|
//panic("The next action from RoundStepCommit is not scheduled by time")
|
|
|
|
|
|
|
|
|
panic("The next action from RoundStepCommit is not scheduled by time") |
|
|
default: |
|
|
default: |
|
|
panic("Should not happen") |
|
|
panic("Should not happen") |
|
|
} |
|
|
} |
|
|
}() |
|
|
}() |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
scheduleNextAction(cs.getRoundState()) |
|
|
|
|
|
|
|
|
if cs.getRoundState().Step < RoundStepCommit { |
|
|
|
|
|
scheduleNextAction() |
|
|
|
|
|
} else { |
|
|
|
|
|
// Race condition with receipt of commits, maybe.
|
|
|
|
|
|
// We shouldn't have to schedule anything.
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
// NOTE: All ConsensusState.RunAction*() calls come from here.
|
|
|
// NOTE: All ConsensusState.RunAction*() calls come from here.
|
|
|
// Since only one routine calls them, it is safe to assume that
|
|
|
// Since only one routine calls them, it is safe to assume that
|
|
@ -396,7 +402,7 @@ ACTION_LOOP: |
|
|
continue ACTION_LOOP |
|
|
continue ACTION_LOOP |
|
|
} |
|
|
} |
|
|
cs.RunActionPropose(rs.Height, rs.Round) |
|
|
cs.RunActionPropose(rs.Height, rs.Round) |
|
|
scheduleNextAction(rs) |
|
|
|
|
|
|
|
|
scheduleNextAction() |
|
|
continue ACTION_LOOP |
|
|
continue ACTION_LOOP |
|
|
|
|
|
|
|
|
case RoundActionPrevote: |
|
|
case RoundActionPrevote: |
|
@ -404,7 +410,7 @@ ACTION_LOOP: |
|
|
continue ACTION_LOOP |
|
|
continue ACTION_LOOP |
|
|
} |
|
|
} |
|
|
cs.RunActionPrevote(rs.Height, rs.Round) |
|
|
cs.RunActionPrevote(rs.Height, rs.Round) |
|
|
scheduleNextAction(rs) |
|
|
|
|
|
|
|
|
scheduleNextAction() |
|
|
continue ACTION_LOOP |
|
|
continue ACTION_LOOP |
|
|
|
|
|
|
|
|
case RoundActionPrecommit: |
|
|
case RoundActionPrecommit: |
|
@ -412,7 +418,7 @@ ACTION_LOOP: |
|
|
continue ACTION_LOOP |
|
|
continue ACTION_LOOP |
|
|
} |
|
|
} |
|
|
cs.RunActionPrecommit(rs.Height, rs.Round) |
|
|
cs.RunActionPrecommit(rs.Height, rs.Round) |
|
|
scheduleNextAction(rs) |
|
|
|
|
|
|
|
|
scheduleNextAction() |
|
|
continue ACTION_LOOP |
|
|
continue ACTION_LOOP |
|
|
|
|
|
|
|
|
case RoundActionTryCommit: |
|
|
case RoundActionTryCommit: |
|
@ -427,7 +433,7 @@ ACTION_LOOP: |
|
|
// Could not commit, move onto next round.
|
|
|
// Could not commit, move onto next round.
|
|
|
cs.SetupNewRound(rs.Height, rs.Round+1) |
|
|
cs.SetupNewRound(rs.Height, rs.Round+1) |
|
|
// cs.Step is now at RoundStepNewRound
|
|
|
// cs.Step is now at RoundStepNewRound
|
|
|
scheduleNextAction(rs) |
|
|
|
|
|
|
|
|
scheduleNextAction() |
|
|
continue ACTION_LOOP |
|
|
continue ACTION_LOOP |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -449,7 +455,7 @@ ACTION_LOOP: |
|
|
cs.evsw.FireEvent(types.EventStringNewBlock(), newBlock) |
|
|
cs.evsw.FireEvent(types.EventStringNewBlock(), newBlock) |
|
|
cs.evc.Flush() |
|
|
cs.evc.Flush() |
|
|
}() |
|
|
}() |
|
|
scheduleNextAction(rs) |
|
|
|
|
|
|
|
|
scheduleNextAction() |
|
|
continue ACTION_LOOP |
|
|
continue ACTION_LOOP |
|
|
} else { |
|
|
} else { |
|
|
// do not schedule next action.
|
|
|
// do not schedule next action.
|
|
@ -539,11 +545,8 @@ func (cs *ConsensusState) setupNewRound(round uint) { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// Increment all the way to round.
|
|
|
// Increment all the way to round.
|
|
|
log.Debug(Fmt("Validators prior to IncrementAccum: %v, %v-%v", cs.Validators.String(), |
|
|
|
|
|
round, cs.Round)) |
|
|
|
|
|
validators := cs.Validators.Copy() |
|
|
validators := cs.Validators.Copy() |
|
|
validators.IncrementAccum(round - cs.Round) |
|
|
validators.IncrementAccum(round - cs.Round) |
|
|
log.Debug(Fmt("Validators after IncrementAccum: %v", validators.String())) |
|
|
|
|
|
|
|
|
|
|
|
cs.Round = round |
|
|
cs.Round = round |
|
|
cs.Step = RoundStepNewRound |
|
|
cs.Step = RoundStepNewRound |
|
|