From d00926e08953a3b458979ba11e1c91cc02dc16a2 Mon Sep 17 00:00:00 2001 From: jochen Date: Tue, 27 Oct 2026 23:19:40 +0100 Subject: [PATCH] Compose with what the node runs, so a folded module of an old-form build is carried as it runs, and bound an archive read; pin mesh-sdk 2fd5ffd (issue 1126, the seed's shadow) novox refused its own composition and its answer on de-spiegel, a module it runs folded into its own composition at a build only the controller holds. The composer now gives frombus what the node runs (Scope.Running), so such a module is carried as it runs. The shadow's answer names every refusal (mesh-sdk). A templates archive read is bounded at 30 s: nothing else held an unanswered store. --- go.mod | 2 +- go.sum | 2 ++ internal/selfcompose/selfcompose.go | 16 ++++++++++++++-- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index ed71e1e..b397ee6 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/novox/mesh-host go 1.26.0 require ( - git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261027201213-7a8e9f970648 + git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261027221705-2fd5ffdd6263 github.com/nats-io/nats-server/v2 v2.11.17 github.com/nats-io/nats.go v1.54.0 golang.org/x/crypto v0.57.0 diff --git a/go.sum b/go.sum index 07b9c16..09f31d8 100644 --- a/go.sum +++ b/go.sum @@ -18,6 +18,8 @@ git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261027200317-538ffbaa085b h1:LuBK5dtB git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261027200317-538ffbaa085b/go.mod h1:ouERNpZizzwZ0HLEtAypsY9FR20FyUgUYRni6J7kVCY= git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261027201213-7a8e9f970648 h1:XoMsgg9kSgjQWa86NZM8h8OpxJ2kovxcMS2C0i6WSVU= git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261027201213-7a8e9f970648/go.mod h1:ouERNpZizzwZ0HLEtAypsY9FR20FyUgUYRni6J7kVCY= +git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261027221705-2fd5ffdd6263 h1:JZV8C+WR6NPiopj9ShzhbpjN0gqVQV60vOFxsxFwH00= +git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261027221705-2fd5ffdd6263/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/internal/selfcompose/selfcompose.go b/internal/selfcompose/selfcompose.go index a39ccf0..f92405f 100644 --- a/internal/selfcompose/selfcompose.go +++ b/internal/selfcompose/selfcompose.go @@ -20,6 +20,7 @@ import ( "sort" "strings" "sync" + "time" "git.novox.be/novox/mesh-sdk/go/catalogue" "git.novox.be/novox/mesh-sdk/go/compose" @@ -436,7 +437,12 @@ func (c *Composer) compose(ctx context.Context) []agent.Update { kept[module] = fps[module] } - compositions, _, err := frombus.Compose(ctx, r, c.env.Mesh, frombus.Scope{Node: c.env.Node, KeptAt: kept, InOwn: inOwn}, fps) + // What it runs: a folded module of an old-form build is carried in its own composition as it runs (issue 1126). + var running []delivery.Composed + if c.env.Running != nil { + running = c.env.Running() + } + compositions, _, err := frombus.Compose(ctx, r, c.env.Mesh, frombus.Scope{Node: c.env.Node, KeptAt: kept, InOwn: inOwn, Running: running}, fps) if err != nil { c.refused(fmt.Sprintf("%v", err)) c.sayOnce(fmt.Sprintf("the node cannot compose its modules, and keeps running what it runs: %v", err)) @@ -650,6 +656,9 @@ func (r reader) Build(ctx context.Context, module, fp string) (*delivery.Builder return &b, nil } +// archiveWithin bounds one read of a templates archive in the artifact store. +const archiveWithin = 30 * time.Second + // Archive reads a templates archive once per digest (an archive is the whole of its digest), checked against it. func (r reader) Archive(ctx context.Context, url, digest string) ([]byte, error) { r.c.mu.Lock() @@ -661,7 +670,10 @@ func (r reader) Archive(ctx context.Context, url, digest string) ([]byte, error) if r.c.env.Fetch == nil { return nil, fmt.Errorf("this node reads no archive (%s)", url) } - body, err := r.c.env.Fetch(ctx, url) + // Bounded: a store that does not answer must not hold the composer or the node's answer (issue 1126). + fetching, cancel := context.WithTimeout(ctx, archiveWithin) + defer cancel() + body, err := r.c.env.Fetch(fetching, url) if err != nil { return nil, err }