diff --git a/config/tendermint/config.go b/config/tendermint/config.go index a48f801e..2e8d9025 100644 --- a/config/tendermint/config.go +++ b/config/tendermint/config.go @@ -84,6 +84,8 @@ func GetConfig(rootDir string) cfg.Config { mapConfig.SetDefault("timeout_precommit", 1000) mapConfig.SetDefault("timeout_precommit_delta", 500) mapConfig.SetDefault("timeout_commit", 1000) + // make progress asap (no `timeout_commit`) on full precommit votes + mapConfig.SetDefault("skip_timeout_commit", false) mapConfig.SetDefault("mempool_recheck", true) mapConfig.SetDefault("mempool_recheck_empty", true) mapConfig.SetDefault("mempool_broadcast", true) diff --git a/config/tendermint_test/config.go b/config/tendermint_test/config.go index 28b1da80..2913546c 100644 --- a/config/tendermint_test/config.go +++ b/config/tendermint_test/config.go @@ -98,6 +98,7 @@ func ResetConfig(localPath string) cfg.Config { mapConfig.SetDefault("timeout_precommit", 10) mapConfig.SetDefault("timeout_precommit_delta", 1) mapConfig.SetDefault("timeout_commit", 10) + mapConfig.SetDefault("skip_timeout_commit", false) mapConfig.SetDefault("mempool_recheck", true) mapConfig.SetDefault("mempool_recheck_empty", true) mapConfig.SetDefault("mempool_broadcast", true) diff --git a/consensus/reactor_test.go b/consensus/reactor_test.go index 995f4a38..d7fd3ba5 100644 --- a/consensus/reactor_test.go +++ b/consensus/reactor_test.go @@ -149,6 +149,12 @@ func TestValidatorSetChanges(t *testing.T) { nPeers := 8 nVals := 4 css := randConsensusNetWithPeers(nVals, nPeers, "consensus_val_set_changes_test", newMockTickerFunc(true), newPersistentDummy) + + // otherwise, the test is failing with timeout error + for i := 0; i < nPeers; i++ { + css[i].timeoutParams.SkipCommit0 = true + } + reactors := make([]*ConsensusReactor, nPeers) eventChans := make([]chan interface{}, nPeers) for i := 0; i < nPeers; i++ { diff --git a/consensus/state.go b/consensus/state.go index 3020a214..13125a5d 100644 --- a/consensus/state.go +++ b/consensus/state.go @@ -24,15 +24,17 @@ import ( //----------------------------------------------------------------------------- // Timeout Parameters -// All in milliseconds +// TimeoutParams holds timeouts and deltas for each round step. +// All timeouts and deltas in milliseconds. type TimeoutParams struct { - Propose0 int - ProposeDelta int - Prevote0 int - PrevoteDelta int - Precommit0 int - PrecommitDelta int - Commit0 int + Propose0 int + ProposeDelta int + Prevote0 int + PrevoteDelta int + Precommit0 int + PrecommitDelta int + Commit0 int + SkipTimeoutCommit bool } // Wait this long for a proposal @@ -55,16 +57,17 @@ func (tp *TimeoutParams) Commit(t time.Time) time.Time { return t.Add(time.Duration(tp.Commit0) * time.Millisecond) } -// Initialize parameters from config +// InitTimeoutParamsFromConfig initializes parameters from config func InitTimeoutParamsFromConfig(config cfg.Config) *TimeoutParams { return &TimeoutParams{ - Propose0: config.GetInt("timeout_propose"), - ProposeDelta: config.GetInt("timeout_propose_delta"), - Prevote0: config.GetInt("timeout_prevote"), - PrevoteDelta: config.GetInt("timeout_prevote_delta"), - Precommit0: config.GetInt("timeout_precommit"), - PrecommitDelta: config.GetInt("timeout_precommit_delta"), - Commit0: config.GetInt("timeout_commit"), + Propose0: config.GetInt("timeout_propose"), + ProposeDelta: config.GetInt("timeout_propose_delta"), + Prevote0: config.GetInt("timeout_prevote"), + PrevoteDelta: config.GetInt("timeout_prevote_delta"), + Precommit0: config.GetInt("timeout_precommit"), + PrecommitDelta: config.GetInt("timeout_precommit_delta"), + Commit0: config.GetInt("timeout_commit"), + SkipTimeoutCommit: config.GetBool("skip_timeout_commit"), } } @@ -1388,8 +1391,8 @@ func (cs *ConsensusState) addVote(vote *types.Vote, peerKey string) (added bool, log.Info(Fmt("Added to lastPrecommits: %v", cs.LastCommit.StringShort())) types.FireEventVote(cs.evsw, types.EventDataVote{vote}) - if cs.LastCommit.HasAll() { - // if we have all the votes now, + // if we can skip timeoutCommit and have all the votes now, + if cs.timeoutParams.SkipTimeoutCommit && cs.LastCommit.HasAll() { // go straight to new round (skip timeout commit) // cs.scheduleTimeout(time.Duration(0), cs.Height, 0, RoundStepNewHeight) cs.enterNewRound(cs.Height, 0) @@ -1452,7 +1455,7 @@ func (cs *ConsensusState) addVote(vote *types.Vote, peerKey string) (added bool, cs.enterPrecommit(height, vote.Round) cs.enterCommit(height, vote.Round) - if precommits.HasAll() { + if cs.timeoutParams.SkipTimeoutCommit && cs.LastCommit.HasAll() { // if we have all the votes now, // go straight to new round (skip timeout commit) // cs.scheduleTimeout(time.Duration(0), cs.Height, 0, RoundStepNewHeight)