[hermes] ananke #314: test_timeout_deadlock #16
Loading…
x
Reference in New Issue
Block a user
No description provided.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Hermes auto-triage classified incident
ananke/314as test_timeout_deadlock (confidence 0.88); first failed gate:tests.Why a human is needed
Build 314 of ananke failed because the test binary for scm.bstein.dev/bstein/ananke/testing/orchestrator hung and was killed by Go's 10-minute package timeout. The console shows 'panic: test timed out after 10m0s' with TestHookVaultLifecycleBranchMatrix/critical-vault-low-branches/workload-ready-no-value-and-ensure-error stuck for 6m57s, followed by 'FAIL scm.bstein.dev/bstein/ananke/testing/orchestrator 600.063s'. Every other package passed. Because the timeout panic kills the whole binary, no per-test report was published, so the console output is the only record of which test hung. The static-analysis and supply-chain steps ran after this and both passed; the exit 1 at the end of the log is just the pipeline reporting the earlier test failure, so the tail of the build is not where the problem is. Two clues point at the cause: the goroutine dump taken at the timeout shows an HTTP/2 client read loop parked in net/http, and six seconds earlier the test logged 'http: TLS handshake error from 127.0.0.1:60938: remote error: tls: bad certificate' from a loopback listener. That is consistent with the code under test making an HTTPS call to a test server that rejected the handshake, and the call never returning because there is no context deadline or client timeout on that path - so instead of surfacing an error the subtest waits forever. A fix has two parts. First, in the product code exercised by this subtest, make every outbound call on the vault-hook lifecycle path carry a context with a deadline (or an http.Client with Timeout set) and make sure the cancel is deferred before the ensure call so an error return cannot leak a blocked goroutine; if there is a wait or retry loop for 'workload ready with no value', give it a bounded number of attempts and a select on ctx.Done(). Second, in the test itself, give the subtest its own context with a short timeout and assert the expected error, so a regression of this kind fails in seconds with a useful message instead of taking the whole package down at the 10-minute mark. It is also worth checking that the test server's TLS material matches what the client trusts, since the bad-certificate handshake may itself be the trigger. This needs a maintainer with the source in hand: the evidence identifies the hanging test precisely but not the specific blocking call, and the choice between fixing the timeout handling in the product code and fixing the test's TLS fixture is a judgement that requires reading that package. Note also that SonarQube could not parse seven Go files ('Go parser external process returned non-zero exit value: 2', including internal/config/validate.go and internal/service/daemon.go); that did not fail this build, but those files are going unanalyzed and deserve a separate look. Finally, centralized log search was unavailable for this window (connection refused), so this analysis is based solely on the retained build console.
Ariadne did not authorize automated remediation:
human_required.Facts
https://ci.bstein.dev/job/ananke/314/)jenkins.first_failed_stage)jenkins.failed_tests (empty array))jenkins.console_failures[1], line 217)jenkins.console_failures[2], line 321)jenkins.console_failures[2], line 321)jenkins.console_failures[1], line 217)76876ef895on refs/remotes/origin/main, commit message 'support terraform-owned bootstrap inputs'. (jenkins.console_failures[1], line 217 (Checkout stage))jenkins.console_tail)jenkins.console_failures[3], line 392)Evidence
The earliest failure region of the build console:
Inferences
Suggested remediation (not available)
No automated remediation exists for this failure. Hermes proposes one; i
Truncated by Ariadne: the diagnosis exceeded the configured issue body limit. The complete evidence bundle is in the Ariadne audit trail.