From 13998c2362d35f0d150e5cdc2d6234800fb5519e Mon Sep 17 00:00:00 2001 From: jochen Date: Tue, 10 Nov 2026 04:11:33 +0100 Subject: [PATCH] =?UTF-8?q?S5:=20the=20old=20JetStream=20client's=20no=20r?= =?UTF-8?q?esponse=20from=20the=20stream=20is=20a=20request=20that=20reach?= =?UTF-8?q?ed=20no=20one=20(issue=201966,=20ADR=200668=20=C2=A71;=20review?= =?UTF-8?q?=20round=201,=20finding=202)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The node-engine's natsLink publishes through the old client, which says no responders as nats.ErrNoStreamResponse: sayOnce gave up at once. Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ --- go/busretry/busretry.go | 4 +++- go/busretry/busretry_test.go | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/go/busretry/busretry.go b/go/busretry/busretry.go index 9d91c7c..f083c3c 100644 --- a/go/busretry/busretry.go +++ b/go/busretry/busretry.go @@ -43,7 +43,8 @@ func Waits(bound, first, most time.Duration) (restore func()) { } // Undelivered says err means the request reached no one: no responders, JetStream not enabled (for the account), or -// no response from the stream after the client's own retries on no responders; also said in words by a runtime that +// no response from the stream after the client's own retries on no responders (either JetStream client's: the old +// one's publish says it for no responders, review round 1 of issue 1966); also said in words by a runtime that // passed the error on. func Undelivered(err error) bool { var answered *Answered @@ -52,6 +53,7 @@ func Undelivered(err error) bool { } if errors.Is(err, nats.ErrNoResponders) || errors.Is(err, jetstream.ErrJetStreamNotEnabled) || errors.Is(err, jetstream.ErrJetStreamNotEnabledForAccount) || errors.Is(err, jetstream.ErrNoStreamResponse) || + errors.Is(err, nats.ErrNoStreamResponse) || errors.Is(err, nats.ErrJetStreamNotEnabled) || errors.Is(err, nats.ErrJetStreamNotEnabledForAccount) { return true } diff --git a/go/busretry/busretry_test.go b/go/busretry/busretry_test.go index f08c18c..ef2bf84 100644 --- a/go/busretry/busretry_test.go +++ b/go/busretry/busretry_test.go @@ -37,6 +37,7 @@ func TestABusThatAnswersNothingIsWaitedOut(t *testing.T) { {"repeatable: no responders with no probe, then an answer", []error{nats.ErrNoResponders, nil}, nil, 2, 2, true, true}, {"repeatable: a callee's answer is an answer", []error{&Answered{Words: "context deadline exceeded"}}, nil, 1, 1, false, true}, {"repeatable: nobody answers and the probe says the bus answers", []error{nats.ErrNoResponders}, func() bool { return false }, 1, 1, false, true}, + {"repeatable: no response from the stream, either client's, then an answer", []error{nats.ErrNoStreamResponse, jetstream.ErrNoStreamResponse, nil}, nil, 3, 3, true, true}, {"timed out past the bound: said", []error{context.DeadlineExceeded}, nil, 2, 1000, false, true}, } { // A row that ends in an answer waits on a bound of seconds, which no slow machine reaches; only the row that