diff options
author | Pavel Zbitskiy <65323360+algorandskiy@users.noreply.github.com> | 2023-12-20 15:26:42 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-12-20 15:26:42 -0500 |
commit | 9eaebc0ef295b56ff966d50a312f6e77f9dcaa17 (patch) | |
tree | 1d82dcb3d0cb9cef6626048c1b5101012829dd62 | |
parent | 64f588912c37f8cad7c755a55007df754349a51b (diff) |
agreement: dump demux queues on fuzzer test failure (#5882)
-rw-r--r-- | agreement/demux.go | 12 | ||||
-rw-r--r-- | agreement/fuzzer/fuzzer_test.go | 7 | ||||
-rw-r--r-- | agreement/fuzzer/networkFacade_test.go | 4 | ||||
-rw-r--r-- | agreement/fuzzer/validator_test.go | 6 | ||||
-rw-r--r-- | agreement/service.go | 6 |
5 files changed, 33 insertions, 2 deletions
diff --git a/agreement/demux.go b/agreement/demux.go index 7f888dc97..2653b8d8c 100644 --- a/agreement/demux.go +++ b/agreement/demux.go @@ -19,6 +19,7 @@ package agreement import ( "context" "fmt" + "io" "github.com/algorand/go-algorand/config" "github.com/algorand/go-algorand/logging" @@ -361,6 +362,17 @@ func (d *demux) next(s *Service, deadline Deadline, fastDeadline Deadline, curre return } +// dumpQueues dumps the current state of the demux queues to the given writer. +func (d *demux) dumpQueues(w io.Writer) { + fmt.Fprintf(w, "rawVotes: %d\n", len(d.rawVotes)) + fmt.Fprintf(w, "rawProposals: %d\n", len(d.rawProposals)) + fmt.Fprintf(w, "rawBundles: %d\n", len(d.rawBundles)) + + fmt.Fprintf(w, "cryptoVerifiedVotes: %d\n", len(d.crypto.VerifiedVotes())) + fmt.Fprintf(w, "cryptoVerified ProposalPayloadTag: %d\n", len(d.crypto.Verified(protocol.ProposalPayloadTag))) + fmt.Fprintf(w, "cryptoVerified VoteBundleTag: %d\n", len(d.crypto.Verified(protocol.VoteBundleTag))) +} + // setupCompoundMessage processes compound messages: distinct messages which are delivered together func setupCompoundMessage(l LedgerReader, m message) (res externalEvent) { compound := m.CompoundMessage diff --git a/agreement/fuzzer/fuzzer_test.go b/agreement/fuzzer/fuzzer_test.go index e505faa19..77a52401e 100644 --- a/agreement/fuzzer/fuzzer_test.go +++ b/agreement/fuzzer/fuzzer_test.go @@ -261,6 +261,13 @@ func (n *Fuzzer) Start() { } } +// DumpQueues dumps the queues of all the nodes. +func (n *Fuzzer) DumpQueues() { + for _, f := range n.agreements { + f.DumpDemuxQueues(os.Stderr) + } +} + func (n *Fuzzer) InvokeFiltersShutdown(preshutdown bool) { for _, facade := range n.facades { dsFilter := facade.GetDownstreamFilter() diff --git a/agreement/fuzzer/networkFacade_test.go b/agreement/fuzzer/networkFacade_test.go index d18f8251d..86c7ff712 100644 --- a/agreement/fuzzer/networkFacade_test.go +++ b/agreement/fuzzer/networkFacade_test.go @@ -122,7 +122,7 @@ func (n *NetworkFacade) DumpQueues() { } n.eventsQueuesMu.Unlock() queues += "----------------------\n" - fmt.Printf(queues) + fmt.Print(queues) } func (n *NetworkFacade) WaitForEventsQueue(cleared bool) { @@ -151,7 +151,7 @@ func (n *NetworkFacade) WaitForEventsQueue(cleared bool) { n.DumpQueues() //panic("Waiting for event processing for 0 took too long") pprof.Lookup("goroutine").WriteTo(os.Stdout, 1) - os.Exit(1) + panic(fmt.Sprintf("maxWait %d sec exceeded", maxEventQueueWait/time.Second)) } } diff --git a/agreement/fuzzer/validator_test.go b/agreement/fuzzer/validator_test.go index 87425a099..8c7352ccc 100644 --- a/agreement/fuzzer/validator_test.go +++ b/agreement/fuzzer/validator_test.go @@ -47,6 +47,12 @@ func (v *Validator) Go(netConfig *FuzzerConfig) { network := MakeFuzzer(*netConfig) require.NotNil(v.tb, network) + defer func() { + if r := recover(); r != nil { + network.DumpQueues() + } + }() + network.Start() //_, runRes := network.Run(v.config.NetworkRunDuration /*time.Millisecond*5000*/, time.Millisecond*3000, time.Second) _, v.runResult = network.Run(v.config.NetworkRunTicks, v.config.NetworkRecoverTicks, 100) diff --git a/agreement/service.go b/agreement/service.go index 433a17d5c..852f17145 100644 --- a/agreement/service.go +++ b/agreement/service.go @@ -19,6 +19,7 @@ package agreement //go:generate dbgen -i agree.sql -p agreement -n agree -o agreeInstall.go -h ../scripts/LICENSE_HEADER import ( "context" + "io" "time" "github.com/algorand/go-algorand/config" @@ -178,6 +179,11 @@ func (s *Service) Shutdown() { s.persistenceLoop.Quit() } +// DumpDemuxQueues dumps the demux queues to the given writer. +func (s *Service) DumpDemuxQueues(w io.Writer) { + s.demux.dumpQueues(w) +} + // demuxLoop repeatedly executes pending actions and then requests the next event from the Service.demux. func (s *Service) demuxLoop(ctx context.Context, input chan<- externalEvent, output <-chan []action, ready <-chan externalDemuxSignals) { for a := range output { |