From 7651e47cc669a7965aef72267b457be8275bc107 Mon Sep 17 00:00:00 2001 From: jochen Date: Thu, 22 Oct 2026 18:03:02 +0200 Subject: [PATCH] =?UTF-8?q?Write=20a=20module=20with=20no=20artifact=20a?= =?UTF-8?q?=20done=20key=20with=20no=20artifact,=20so=20the=20controller?= =?UTF-8?q?=20has=20a=20done=20key=20to=20register=20it=20from=20(issue=20?= =?UTF-8?q?1613,=20ADR=200478=20=C2=A71,=20ADR=200501=20=C2=A71)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Moves the mesh-sdk pin to feat/r4e-sdk 9cb4d59, which accepts such a key and names delivery.WaitsFor; the builder's package wait now uses that shared prefix (B7). --- modules/mesh-delivery-builder/go.mod | 2 +- modules/mesh-delivery-builder/go.sum | 2 ++ .../internal/build/run.go | 17 ++++++++----- .../internal/build/run_test.go | 25 ++++++++++++++++--- 4 files changed, 36 insertions(+), 10 deletions(-) diff --git a/modules/mesh-delivery-builder/go.mod b/modules/mesh-delivery-builder/go.mod index a96fd50..10090b3 100644 --- a/modules/mesh-delivery-builder/go.mod +++ b/modules/mesh-delivery-builder/go.mod @@ -3,7 +3,7 @@ module mesh-delivery-builder go 1.26.0 require ( - git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261022154726-a90f523edc75 + git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261022160024-9cb4d59093a7 github.com/nats-io/nats-server/v2 v2.11.17 github.com/nats-io/nats.go v1.54.0 ) diff --git a/modules/mesh-delivery-builder/go.sum b/modules/mesh-delivery-builder/go.sum index d5ce48e..a9c5711 100644 --- a/modules/mesh-delivery-builder/go.sum +++ b/modules/mesh-delivery-builder/go.sum @@ -2,6 +2,8 @@ git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261021192148-78364e318bdc h1:ZJScJSnF git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261021192148-78364e318bdc/go.mod h1:ouERNpZizzwZ0HLEtAypsY9FR20FyUgUYRni6J7kVCY= git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261022154726-a90f523edc75 h1:e/aOJLHaNSBPFFHHjUF+0fAfjmtMUy/vDWqetauWp/U= git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261022154726-a90f523edc75/go.mod h1:ouERNpZizzwZ0HLEtAypsY9FR20FyUgUYRni6J7kVCY= +git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261022160024-9cb4d59093a7 h1:wK9O1CgNk7mo3IdJqW/CCx/hebg+1F0rkvW8CvJfnRM= +git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261022160024-9cb4d59093a7/go.mod h1:ouERNpZizzwZ0HLEtAypsY9FR20FyUgUYRni6J7kVCY= github.com/antithesishq/antithesis-sdk-go v0.7.0-default-no-op h1:Z/MZK75wC/NSrkgqeNIa7jexam9uWzhLmFTSCPI/kn0= github.com/antithesishq/antithesis-sdk-go v0.7.0-default-no-op/go.mod h1:FQyySiasQQM8735Ddel3MRojmy4dA1IqCeyJ5jmPMbI= github.com/google/go-tpm v0.9.8 h1:slArAR9Ft+1ybZu0lBwpSmpwhRXaa85hWtMinMyRAWo= diff --git a/modules/mesh-delivery-builder/internal/build/run.go b/modules/mesh-delivery-builder/internal/build/run.go index 627cc0d..e725a4f 100644 --- a/modules/mesh-delivery-builder/internal/build/run.go +++ b/modules/mesh-delivery-builder/internal/build/run.go @@ -309,10 +309,8 @@ func (b *Builder) consider(ctx context.Context, module string, m delivery.Module // building by this builder: it takes it again when it starts (ADR 0478 clause 5). func (b *Builder) try(ctx context.Context, module string, m delivery.Module) { plan, planErr, read := b.planOf(ctx, m.Manifest) - if read && planErr == nil && len(plan.Tasks) == 0 { - return // nothing in the manifest for a builder to build - } - if planErr == nil { + nothing := read && planErr == nil && len(plan.Tasks) == 0 + if planErr == nil && !nothing { if why := b.stale(m, plan); why != "" { // The fingerprint names a toolchain the build nodes no longer agree on: a new fingerprint is coming, and a build // now would be of this source with another toolchain (ADR 0477 clause 2). Nothing is written. @@ -357,7 +355,14 @@ func (b *Builder) try(ctx context.Context, module string, m delivery.Module) { } } } - result := b.build(ctx, module, m, plan, planErr, prior, only) + var result delivery.BuilderBuild + if nothing { + // A manifest with no artifact is built by building nothing: its key is done with no artifact, claimed and written as + // any other, so the controller has a done key to register it from (issue 1613, ADR 0478 clause 1, ADR 0501 clause 1). + result = delivery.BuilderBuild{State: delivery.BuildDone, Step: "nothing to build: the manifest names no artifact"} + } else { + result = b.build(ctx, module, m, plan, planErr, prior, only) + } if ctx.Err() != nil { return } @@ -610,7 +615,7 @@ func stored(kind string) bool { // waitsFor opens the reason of a fetch step whose module's lock names a package version the registry does not hold, then // `@` (the Node build module's, ADR 0500 clause 6). -const waitsFor = "waits for: " +const waitsFor = delivery.WaitsFor // waitsOf is the package version a lane's error says the module waits for, or "" when none does or what it names is not // `@`. diff --git a/modules/mesh-delivery-builder/internal/build/run_test.go b/modules/mesh-delivery-builder/internal/build/run_test.go index f5d6068..aef2d5a 100644 --- a/modules/mesh-delivery-builder/internal/build/run_test.go +++ b/modules/mesh-delivery-builder/internal/build/run_test.go @@ -404,14 +404,33 @@ func TestAnUnreadableManifestFailsTheBuild(t *testing.T) { } } -func TestAModuleWithNoFingerprintOrNoArtifactIsNotBuilt(t *testing.T) { // 1607/AC2 +func TestAModuleWithNoFingerprintIsNotBuilt(t *testing.T) { // 1607/AC2 r := newRig(t) - r.b.Module(context.Background(), "m", moduleValue(t, "modules/m")) data, _ := delivery.EncodeModule(delivery.Module{Repository: "novox/r", Commit: "c", FP: "src1:" + hex64('f'), None2: "toolchain not yet reported"}) r.b.Module(context.Background(), "n", data) r.b.Wait() if len(r.st.vals) != 0 { - t.Errorf("keys %v were written: a module with no new-form fingerprint or no artifact has nothing to build", r.st.vals) + t.Errorf("keys %v were written: a module with no new-form fingerprint has nothing to build", r.st.vals) + } +} + +func TestAModuleWithNoArtifactGetsADoneKeyWithNoArtifactAndNoBuildCall(t *testing.T) { // issue 1613, ADR 0478 clause 1 + for name, manifest := range map[string]catalogue.Manifest{"no build": {Module: "m"}, "no artifact": {Module: "m", Build: &catalogue.Build{}}} { + r := newRig(t) + r.mf.byDigest[mdigest('a')] = manifest + v := r.consider(t, "") // a module with nothing to build needs no directory + if v.State != delivery.BuildDone || len(v.Artifacts) != 0 || v.Manifest != manifestD || v.By != "novox.builder" { + t.Errorf("%s: build = %+v, want done with no artifact", name, v) + } + if len(r.bm.calls) != 0 { + t.Errorf("%s: %d build module calls, want none", name, len(r.bm.calls)) + } + writes := r.st.writes + r.b.tried = map[string]bool{} + r.consider(t, "") + if r.st.writes != writes { + t.Errorf("%s: the done key was written again", name) + } } }