S1: keep the bus's "no responders" beside ErrNotAsked on an ask
A request that reached no one is asked again by mesh-sdk's busretry only when it can see the bus's own error; the node-engine's ask dropped it, so the seat list's first read, which fell into its holder's re-serve, was never asked again (issue 1966). Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
This commit is contained in:
@@ -2,10 +2,12 @@ package link
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"git.novox.be/novox/mesh-sdk/go/busretry"
|
||||
"github.com/nats-io/nats.go"
|
||||
)
|
||||
|
||||
@@ -37,4 +39,11 @@ func TestNatsAToolCheckIsAskedOnTheLink(t *testing.T) {
|
||||
if err == nil || !strings.Contains(err.Error(), "nothing on this machine answers") {
|
||||
t.Fatalf("a tool nothing serves read as %v", err)
|
||||
}
|
||||
// The bus's "no responders" is kept beside ErrNotAsked, so a reader that asks again while its request reached no one
|
||||
// (busretry.Undelivered) sees it (issue 1966: the seat list's first read fell into its holder's re-serve and was never
|
||||
// asked again).
|
||||
_, err = (&natsLink{conn: conn, js: js, node: node}).Ask(ctx, ToolSubject("sensors", "nothing_serves_this", node), nil)
|
||||
if !errors.Is(err, ErrNotAsked) || !errors.Is(err, nats.ErrNoResponders) || !busretry.Undelivered(err) {
|
||||
t.Fatalf("an ask nothing serves read as %v: want ErrNotAsked and the bus's no responders, undelivered", err)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -324,8 +324,10 @@ func (l *natsLink) Ask(ctx context.Context, subject string, body []byte) ([]byte
|
||||
case err == nil:
|
||||
return reply, nil
|
||||
case errors.Is(err, nats.ErrNoResponders):
|
||||
// The server says nobody subscribes the subject: delivered to no one.
|
||||
return nil, fmt.Errorf("%w: nothing on this machine answers %s", ErrNotAsked, subject)
|
||||
// The server says nobody subscribes the subject: delivered to no one. The bus's own error stays beside ErrNotAsked,
|
||||
// so a caller that asks again while a request reached no one (mesh-sdk busretry.Undelivered, as the seat list's
|
||||
// reader does while its holder re-serves; issue 1966) sees it.
|
||||
return nil, fmt.Errorf("%w: nothing on this machine answers %s (%w)", ErrNotAsked, subject, err)
|
||||
}
|
||||
if refused := l.refusal(subject, before); refused != "" {
|
||||
return nil, fmt.Errorf("%s: %v%s", subject, err, refused)
|
||||
|
||||
Reference in New Issue
Block a user