consensus: TimeoutTicker, skip TimeoutCommit on HasAll

This commit is contained in:
Ethan Buchman
2016-12-19 10:44:25 -05:00
parent 18b3821e06
commit faf23aa0d4
5 changed files with 122 additions and 23 deletions

View File

@ -257,7 +257,7 @@ func randConsensusState(nValidators int) (*ConsensusState, []*validatorStub) {
return cs, vss
}
func randConsensusNet(nValidators int, testName string, updateConfig func(cfg.Config)) []*ConsensusState {
func randConsensusNet(nValidators int, testName string, updateConfig func(cfg.Config), tickerFunc func() TimeoutTicker) []*ConsensusState {
genDoc, privVals := randGenesisDoc(nValidators, false, 10)
css := make([]*ConsensusState, nValidators)
for i := 0; i < nValidators; i++ {
@ -268,12 +268,13 @@ func randConsensusNet(nValidators int, testName string, updateConfig func(cfg.Co
updateConfig(thisConfig)
EnsureDir(thisConfig.GetString("cs_wal_dir"), 0700) // dir for wal
css[i] = newConsensusStateWithConfig(thisConfig, state, privVals[i], counter.NewCounterApplication(true))
css[i].SetTimeoutTicker(tickerFunc())
}
return css
}
// nPeers = nValidators + nNotValidator
func randConsensusNetWithPeers(nValidators, nPeers int, testName string, updateConfig func(cfg.Config)) []*ConsensusState {
func randConsensusNetWithPeers(nValidators, nPeers int, testName string, updateConfig func(cfg.Config), tickerFunc func() TimeoutTicker) []*ConsensusState {
genDoc, privVals := randGenesisDoc(nValidators, false, int64(testMinPower))
css := make([]*ConsensusState, nPeers)
for i := 0; i < nPeers; i++ {
@ -294,6 +295,7 @@ func randConsensusNetWithPeers(nValidators, nPeers int, testName string, updateC
dir, _ := ioutil.TempDir("/tmp", "persistent-dummy")
css[i] = newConsensusStateWithConfig(thisConfig, state, privVal, dummy.NewPersistentDummyApplication(dir))
css[i].SetTimeoutTicker(tickerFunc())
}
return css
}
@ -379,3 +381,46 @@ func crankTimeoutPropose(config cfg.Config) {
config.Set("timeout_propose", 110000) // TODO: crank it to eleventy
config.Set("timeout_commit", 1000)
}
//------------------------------------
func newMockTickerFunc(onlyOnce bool) func() TimeoutTicker {
return func() TimeoutTicker {
return &mockTicker{
c: make(chan time.Time, 10),
onlyOnce: onlyOnce,
}
}
}
// mock ticker only fires for NewStepRound (timeout commit),
// and only once if onlyOnce=true
type mockTicker struct {
c chan time.Time
onlyOnce bool
fired bool
}
func (m *mockTicker) Stop() {
}
func (m *mockTicker) Reset(ti timeoutInfo) {
if m.onlyOnce && m.fired {
return
}
if ti.Step == RoundStepNewHeight {
m.Fire()
m.fired = true
}
}
func (m *mockTicker) Chan() <-chan time.Time {
return m.c
}
func (m *mockTicker) Fire() {
m.c <- time.Now()
}
//------------------------------------