consensus: crank timeout in timeoutWaitGroup

This commit is contained in:
Ethan Buchman 2017-11-12 06:41:15 +00:00
parent 0448c2b437
commit aba8a8f4fc
1 changed files with 21 additions and 8 deletions

View File

@ -3,6 +3,8 @@ package consensus
import ( import (
"context" "context"
"fmt" "fmt"
"os"
"runtime/pprof"
"sync" "sync"
"testing" "testing"
"time" "time"
@ -29,11 +31,16 @@ func startConsensusNet(t *testing.T, css []*ConsensusState, N int) ([]*Consensus
eventBuses := make([]*types.EventBus, N) eventBuses := make([]*types.EventBus, N)
logger := consensusLogger() logger := consensusLogger()
for i := 0; i < N; i++ { for i := 0; i < N; i++ {
/*thisLogger, err := tmflags.ParseLogLevel("consensus:info,*:error", logger, "info")
if err != nil { t.Fatal(err)}*/
thisLogger := logger
reactors[i] = NewConsensusReactor(css[i], true) // so we dont start the consensus states reactors[i] = NewConsensusReactor(css[i], true) // so we dont start the consensus states
reactors[i].SetLogger(logger.With("validator", i)) reactors[i].conS.SetLogger(thisLogger.With("validator", i))
reactors[i].SetLogger(thisLogger.With("validator", i))
eventBuses[i] = types.NewEventBus() eventBuses[i] = types.NewEventBus()
eventBuses[i].SetLogger(logger.With("module", "events", "validator", i)) eventBuses[i].SetLogger(thisLogger.With("module", "events", "validator", i))
_, err := eventBuses[i].Start() _, err := eventBuses[i].Start()
require.NoError(t, err) require.NoError(t, err)
@ -52,6 +59,7 @@ func startConsensusNet(t *testing.T, css []*ConsensusState, N int) ([]*Consensus
// now that everyone is connected, start the state machines // now that everyone is connected, start the state machines
// If we started the state machines before everyone was connected, // If we started the state machines before everyone was connected,
// we'd block when the cs fires NewBlockEvent and the peers are trying to start their reactors // we'd block when the cs fires NewBlockEvent and the peers are trying to start their reactors
// TODO: is this still true with new pubsub?
for i := 0; i < N; i++ { for i := 0; i < N; i++ {
s := reactors[i].conS.GetState() s := reactors[i].conS.GetState()
reactors[i].SwitchToConsensus(s, 0) reactors[i].SwitchToConsensus(s, 0)
@ -304,7 +312,7 @@ func waitForAndValidateBlock(t *testing.T, n int, activeVals map[string]struct{}
}, css) }, css)
} }
func waitForBlockWithUpdatedValsAndValidateIt(t *testing.T, n int, updatedVals map[string]struct{}, eventChans []chan interface{}, css []*ConsensusState, txs ...[]byte) { func waitForBlockWithUpdatedValsAndValidateIt(t *testing.T, n int, updatedVals map[string]struct{}, eventChans []chan interface{}, css []*ConsensusState) {
timeoutWaitGroup(t, n, func(wg *sync.WaitGroup, j int) { timeoutWaitGroup(t, n, func(wg *sync.WaitGroup, j int) {
var newBlock *types.Block var newBlock *types.Block
LOOP: LOOP:
@ -355,15 +363,20 @@ func timeoutWaitGroup(t *testing.T, n int, f func(*sync.WaitGroup, int), css []*
close(done) close(done)
}() }()
// we're running many nodes in-process, possibly in in a virtual machine,
// and spewing debug messages - making a block could take a while,
timeout := time.Second * 60
select { select {
case <-done: case <-done:
case <-time.After(time.Second * 10): case <-time.After(timeout):
for i, cs := range css { for i, cs := range css {
fmt.Println("#################") t.Log("#################")
fmt.Println("Validator", i) t.Log("Validator", i)
fmt.Println(cs.GetRoundState()) t.Log(cs.GetRoundState())
fmt.Println("") t.Log("")
} }
pprof.Lookup("goroutine").WriteTo(os.Stdout, 1)
panic("Timed out waiting for all validators to commit a block") panic("Timed out waiting for all validators to commit a block")
} }
} }