From bd39747c22f57957d8067b144e9df6bdfab5a52d Mon Sep 17 00:00:00 2001 From: jochen Date: Tue, 10 Nov 2026 03:53:05 +0100 Subject: [PATCH] =?UTF-8?q?D1i:=20a=20row=20for=20the=20indexer's=20bind:?= =?UTF-8?q?=20every=20counted=20node's=20manifest-reads=20is=20called=20on?= =?UTF-8?q?ce=20(issue=201966=20note=20155,=20ADR=200668=20=C2=A74)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ --- .../cmd/mesh-delivery-indexer/main_test.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/modules/mesh-delivery-indexer/cmd/mesh-delivery-indexer/main_test.go b/modules/mesh-delivery-indexer/cmd/mesh-delivery-indexer/main_test.go index 40e32bfe..1bb57db3 100644 --- a/modules/mesh-delivery-indexer/cmd/mesh-delivery-indexer/main_test.go +++ b/modules/mesh-delivery-indexer/cmd/mesh-delivery-indexer/main_test.go @@ -12,6 +12,7 @@ import ( "github.com/nats-io/nats.go/jetstream" + "git.novox.be/novox/mesh-contracts/go/clients/nodeengineclient/enginereads" "git.novox.be/novox/mesh-delivery/contracts/go/clients/meshdeliveryclient" "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshdelivery" "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-forge-bridge/forgemsg" @@ -79,6 +80,20 @@ func TestAMessageIsIndexedAndAcked(t *testing.T) { // 1238/AC2 (unit part) if em := viewsEmitter(context.Background(), nil, process.Account{}, nil, &process.AwaitedBucket{}, nil, t.Logf); em.Findings == nil { t.Error("the indexer's views emitter writes no view-unsaid finding") } + t.Run("the consumer bound: every counted node's manifest-reads called once", func(t *testing.T) { // 1966 note 155, ADR 0668 ยง4 + // A manifest-reads-changed said before the indexer's consumer existed is never delivered: the hub's OnBound + // (reads.atBind) calls every node the assignments counts, so a stale statement ends at the bind. + var called []string + reads := &engineReads{known: true, nodes: []string{"ace", "g14"}, keeper: &enginereads.Keeper{Sync: true, + Call: func(node, _ string, _ any) (json.RawMessage, error) { + called = append(called, node) + return nil, errors.New("no responders") + }}} + reads.atBind(time.Unix(0, 0)) + if strings.Join(called, ",") != "ace,g14" { + t.Errorf("at the bind called %v, want ace and g14 once each", called) + } + }) t.Run("not a forge message: terminated and logged", func(t *testing.T) { // 1238 (never redelivered) var logs bytes.Buffer st := &memStore{vals: map[string][]byte{}}