diff --git a/modules/mesh-delivery-builder/cmd/mesh-delivery-builder/held.go b/modules/mesh-delivery-builder/cmd/mesh-delivery-builder/held.go index 6316cfe..e5493a4 100644 --- a/modules/mesh-delivery-builder/cmd/mesh-delivery-builder/held.go +++ b/modules/mesh-delivery-builder/cmd/mesh-delivery-builder/held.go @@ -41,14 +41,16 @@ func (h heldOnTheBus) Held(ctx context.Context, a delivery.StepAsk) (bool, error if err != nil { return false, err } - name, err := h.js.StreamNameBySubject(ctx, subject) - if errors.Is(err, jetstream.ErrStreamNotFound) { - return false, nil - } + // The seat's stream by its name (delivery.AskStream), as the broker grants the builder its information and its + // messages by sequence and nothing wider (issue 1910). + name, err := delivery.AskStream(a.Language) if err != nil { return false, err } stream, err := h.js.Stream(ctx, name) + if errors.Is(err, jetstream.ErrStreamNotFound) { + return false, nil + } if err != nil { return false, err } diff --git a/modules/mesh-delivery-builder/internal/build/run.go b/modules/mesh-delivery-builder/internal/build/run.go index 9ca9dbf..f4f2035 100644 --- a/modules/mesh-delivery-builder/internal/build/run.go +++ b/modules/mesh-delivery-builder/internal/build/run.go @@ -677,8 +677,9 @@ func (b *Builder) runLane(ctx context.Context, l *lane, repository string, m del if b.Held != nil { held, err := b.Held.Held(ctx, ask) if err != nil { - l.err = fmt.Errorf("whether the ask %s of %s the key names is on its stream cannot be read: %w", ask.ID, l.module, err) - return + // Said, and the key is not failed: the ask may well be on its stream and its build finish (issue 1910). + b.logf("whether the ask %s of %s the key names is on its stream cannot be read, so it is waited for as put: %v", ask.ID, l.module, err) + held = true } if !held { // The builder that named it stopped before it put it (issue 1910): put it now, under the same id. diff --git a/modules/mesh-delivery-builder/internal/build/run_test.go b/modules/mesh-delivery-builder/internal/build/run_test.go index 8506201..f3e82b8 100644 --- a/modules/mesh-delivery-builder/internal/build/run_test.go +++ b/modules/mesh-delivery-builder/internal/build/run_test.go @@ -3,6 +3,7 @@ package build import ( "context" "encoding/json" + "errors" "fmt" "git.novox.be/novox/mesh-sdk/go/delivery/buildrun" "strings" @@ -671,3 +672,28 @@ func TestAnAskTheKeyNamesAndNobodyPutIsPutAtStart(t *testing.T) { } } } + +// unreadableHeld cannot tell whether an ask is held. +type unreadableHeld struct{} + +func (unreadableHeld) Held(context.Context, delivery.StepAsk) (bool, error) { + return false, errors.New("permissions violation for publish to $JS.API.STREAM.INFO.SEAT_NODE_BUILD_GO") +} + +// 1910: a take-over that cannot read whether the ask its key names is on its stream says so and waits for the ask's step: +// the key is not failed, and the build finishes when a node ran the ask. +func TestATakeOverThatCannotReadTheStreamWaitsForTheAsk(t *testing.T) { + r := newRig(t, goBundle) + const id = "mvl0frv18d1959" + data, _ := delivery.EncodeBuilderBuild(delivery.BuilderBuild{State: delivery.BuildBuilding, By: "novox.builder", Manifest: manifestD, + Step: "asked mesh-build-go", Asks: map[string]string{delivery.AskGo: id}}) + r.st.vals[r.key] = data + r.b.Held = unreadableHeld{} + r.asks.Answer = nil + r.asks.End(delivery.Step{ID: id, Node: "shanks", State: delivery.StepPassed, + Result: []byte(`{"artifacts":[{"artifact":"tool","digest":"` + digest + `","reference":"artifact-store://m/tool/blobs/` + digest + `"}]}`)}) + v := r.consider(t, "modules/m") + if v.State != delivery.BuildDone || len(r.asks.Asks()) != 0 { + t.Fatalf("the key = %+v after %d asks, want done from the ask's step, none put", v, len(r.asks.Asks())) + } +}