From c32474ee40f44eaf7cd7179140b9492c4d32d76c Mon Sep 17 00:00:00 2001 From: jochen Date: Fri, 23 Oct 2026 19:19:45 +0200 Subject: [PATCH] Judge the delivery-before-check order from the step records, not a poll: at capacity 1 the check starts the instant the delivery ends (R4g, issue 1887) --- .../mesh-build-go/asks_integration_test.go | 52 ++++++++++++------- 1 file changed, 33 insertions(+), 19 deletions(-) diff --git a/modules/mesh-build-go/cmd/mesh-build-go/asks_integration_test.go b/modules/mesh-build-go/cmd/mesh-build-go/asks_integration_test.go index aab652b0..e8519808 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/asks_integration_test.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/asks_integration_test.go @@ -16,6 +16,9 @@ import ( "git.novox.be/novox/mesh-sdk/go/testbus" ) +// checkCommit is the commit the check ask fetches, apart from the delivery ask's, so the fetch order names which ran first. +const checkCommit = "89abcdef0123456789abcdef0123456789abcdef" + // 1887/AC-order, 1887/AC-pull against the real bus: a check ask published before a delivery ask runs after it, and at // capacity 1 the second waits in the stream until the first ends. // @@ -23,6 +26,10 @@ import ( // build seat's stream and its fixed workers (SEAT_NODE_BUILD_GO and its workers) and deletes the stream at its end, so // anything else on that bus, a puller or a leftover consumer, could hold or take its delivery ask and let the check // ask run first. It starts from testbus (mesh-sdk, novox/hq ADR 0495 clause 5): a bus for this test alone, gone after it. +// +// **The order is read from the record.** At capacity 1 the puller starts the check the instant the delivery ask's step +// ends, well before any poll, so "the check key holds a state" is true on correct behaviour (issue 1887). The test +// waits for both asks to end and compares the step records' own Started and Ended times, and the fetch order by commit. func TestTheModuleTakesADeliveryAskBeforeAnEarlierCheck(t *testing.T) { nc, err := nats.Connect(testbus.URL(t)) if err != nil { @@ -41,6 +48,7 @@ func TestTheModuleTakesADeliveryAskBeforeAnEarlierCheck(t *testing.T) { t.Cleanup(func() { _ = js.DeleteStream(context.Background(), "SEAT_NODE_BUILD_GO") }) check := deliveryAsk() check.Kind = delivery.AskCheck + check.Build.Fetch["commit"] = checkCommit first := deliveryAsk() for _, a := range []delivery.StepAsk{check, first} { raw, _ := delivery.EncodeStepAsk(a) @@ -69,30 +77,36 @@ func TestTheModuleTakesADeliveryAskBeforeAnEarlierCheck(t *testing.T) { p := m.Puller(steps, &buildstep.JetStreamAsks{JS: js, Language: delivery.AskGo}) p.PullWait = 200 * time.Millisecond go p.Pull(ctx) - for _, a := range []delivery.StepAsk{first, check} { - key, _ := delivery.AskStepKey("ace", a.ID) - for deadline := time.Now().Add(10 * time.Second); ; time.Sleep(10 * time.Millisecond) { - states.mu.Lock() - v := states.steps[key] - states.mu.Unlock() - if len(v) > 0 && v[len(v)-1].State != delivery.StepRunning { - break - } - if time.Now().After(deadline) { - t.Fatalf("the ask %s (%s) never ended", a.ID, a.Kind) - } - } + var ran map[string][]delivery.Step + for deadline := time.Now().Add(10 * time.Second); ; time.Sleep(10 * time.Millisecond) { + ran = map[string][]delivery.Step{} + ended := 0 states.mu.Lock() - checkKey, _ := delivery.AskStepKey("ace", check.ID) - if a.ID == first.ID && len(states.steps[checkKey]) > 0 { - states.mu.Unlock() - t.Fatal("the check ask started before the delivery ask ended at capacity 1") + for _, a := range []delivery.StepAsk{first, check} { + key, _ := delivery.AskStepKey("ace", a.ID) + v := append([]delivery.Step(nil), states.steps[key]...) + ran[a.ID] = v + if len(v) > 0 && v[len(v)-1].State != delivery.StepRunning { + ended++ + } } states.mu.Unlock() + if ended == 2 { + break + } + if time.Now().After(deadline) { + t.Fatalf("the asks never both ended: %v", ran) + } + } + // The check's step may start the moment the delivery's ends, so the order is read from the records' own times. + deliveryEnded := ran[first.ID][len(ran[first.ID])-1].Ended + checkStarted := ran[check.ID][0].Started + if checkStarted.Before(deliveryEnded) { + t.Fatalf("the check ask started at %v, before the delivery ask ended at %v at capacity 1", checkStarted, deliveryEnded) } mu.Lock() defer mu.Unlock() - if len(order) != 2 { - t.Fatalf("fetched %v", order) + if len(order) != 2 || order[0] != askCommit || order[1] != checkCommit { + t.Fatalf("fetched %v, want the delivery ask's commit %s first, then the check's %s", order, askCommit, checkCommit) } }