mesh-catalog #553's verdict stayed running after its step mvsgthyjed5786 passed on shanks at 19:09:31Z: the watch of that one step key, opened at 18:46:05Z, heard neither its start nor its end and never closed, so the wait had no bound running and nothing would ever judge it. - HeardEnds stands between the asker and each ask's watch: at every step end of the same build module (one watch per steps state), at a reconnect, the asks waited on read their keys now and are judged; a watch that closes is opened again, at most 3 times. - A step the build module's next process ended (RestartReason, a delivery replacing it) counts as a lost ask: asked again under the claim, at most LostAskTries, then failed as not heard, judged again when the nodes change. - checker_ask_again {group, why} ends a running verdict as asked again by hand; the checker hears its verdicts, ends the wait and claims it anew. Refused while a step of its pull requests runs, or for a verdict that is not running. - checker_status names such checks under lost, and each step's what. Tests: one table replaces the given-up test (rows for given up, replaced, deaf and nudged, deaf and asked by hand); counts unchanged (147 unit, 10 integration in the checker).
40 lines
2.3 KiB
Go
40 lines
2.3 KiB
Go
package check
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"git.novox.be/novox/mesh-sdk/go/buildstep"
|
|
"git.novox.be/novox/mesh-sdk/go/delivery"
|
|
"git.novox.be/novox/mesh-sdk/go/delivery/buildrun"
|
|
)
|
|
|
|
// **An ask the build seat gave up on ends its step** (novox/hq issue 734): mesh-sdk buildrun.LostAskWaiter hands the
|
|
// waiting asker a failed step on the node buildrun.LostNode when DEAD_LETTERS keeps the ask's copy (buildrun.HearDeadLetters,
|
|
// granted by buscompose DeadLetterReads), and, under buildrun.NotTakenBound, when no build node took the ask within the
|
|
// bound. What follows is the checker's: a try ends as error (Tryer.run), with the not-taken bound at the step bound
|
|
// (Tryer.NotTaken); a check is asked again under its claim, at most LostAskTries times, then fails as not heard and is
|
|
// judged again when the nodes change (Checker.try). A check's ask has no not-taken bound: it waits in the stream as long as
|
|
// the backlog is (ADR 0525 §9), and a check ended for a backlog would owe its pull request a failure.
|
|
|
|
// LostAskTries is how often a check asks again whose ask was given up, before it fails as not heard (UnheardWords) and is
|
|
// judged again when the nodes change.
|
|
const LostAskTries = 3
|
|
|
|
// IsLostAsk says whether a verdict failed because its ask judged nothing: the build seat gave it up (buildrun.LostWords), or
|
|
// the build module that ran its step was replaced under it, and its next process ended the step it left running
|
|
// (buildstep.RestartReason; a delivery of the build module, as on 2026-10-28). Neither is the change's failure: the check
|
|
// is asked again, as for a given-up ask.
|
|
func IsLostAsk(v delivery.Verdict) bool {
|
|
return v.State == delivery.VerdictFail && (strings.Contains(v.Failed.Words, buildrun.LostWords) ||
|
|
strings.Contains(v.Failed.Words, buildstep.RestartReason))
|
|
}
|
|
|
|
// IsNotTaken says whether a verdict failed because no build node took its ask within the bound (buildrun.NotTakenWords).
|
|
func IsNotTaken(v delivery.Verdict) bool {
|
|
return v.State == delivery.VerdictFail && strings.Contains(v.Failed.Words, buildrun.NotTakenWords)
|
|
}
|
|
|
|
// HearingBucket is the checker's state hearing: whether it hears DEAD_LETTERS (buildrun.Hearing under
|
|
// buildrun.HearingKey), which checker_status says (dead_letters).
|
|
const HearingBucket = delivery.CheckerModule + "_" + buildrun.HearingState
|