From e6ecc2d15ecf52da4945ab76fd711c44a3fb11a9 Mon Sep 17 00:00:00 2001 From: jochen Date: Fri, 30 Oct 2026 18:16:09 +0100 Subject: [PATCH] Put mesh-delivery's merge words through mesh-sdk's kvlimit, so a word too large for its bucket is refused once and never retried (issue 774) The controller's other writer of the 16 KiB bucket of merges, the keeper of mesh-delivery's merge words, called every put failure "not now". A word too large would be retried as the forge's merges were. It now puts through kvlimit.Put: a value that does not fit is refused before it is put and returned as an answer (the events consumer takes it, max-deliver 5 then a dead letter), and only another failure is retried. It is the one write of the controller whose failure was retried as "not now" (searched: every Put, Create and Update wrapped in ErrTryAgain). Needs the group's mesh-sdk head (go/kvlimit, 7b02f63 or later). Quick fix: none smaller. Thorough fix: every bucket write through kvlimit; this is the only one whose refusal was retried, the others fail once and say so. No new test: kvlimit is tested in mesh-sdk, and an integration test here would push the repository further over its budget (rules-are-weighed). Research 072 piece: 03-domains (Control shrinks): the merge words stay the controller's only until the registration of a moved module leaves it. --- cmd/mesh-controller/moved.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/cmd/mesh-controller/moved.go b/cmd/mesh-controller/moved.go index ca5c03e9..88596958 100644 --- a/cmd/mesh-controller/moved.go +++ b/cmd/mesh-controller/moved.go @@ -16,6 +16,7 @@ import ( sdkdelivery "git.novox.be/novox/mesh-sdk/go/delivery" "git.novox.be/novox/mesh-sdk/go/catalogue" + "git.novox.be/novox/mesh-sdk/go/kvlimit" "git.novox.be/novox/mesh-sdk/go/process" "github.com/novox/mesh-controller/internal/broker" "github.com/novox/mesh-controller/internal/inventory" @@ -180,7 +181,12 @@ func (k keepingDeliveryMerges) KeepDeliveryMerge(ctx context.Context, emitter st if err != nil { return fmt.Errorf("%w: the bucket of mesh-delivery's merges: %w", link.ErrTryAgain, err) } - if _, err := kv.Put(ctx, deliveryMergeKey(d.Owner, d.Repo, d.Number, d.HeadSHA), body); err != nil { + // Through kvlimit (sweep 2026-10-30, issue 774): a word too large for the bucket is refused before it is put, and + // is an answer, never "not now" — retried, it held the forge's merges for a day (10054 on de-spiegel's merge). + if _, err := kvlimit.Put(ctx, kv, deliveryMergeKey(d.Owner, d.Repo, d.Number, d.HeadSHA), body); err != nil { + if errors.Is(err, kvlimit.ErrTooLarge) { + return err + } return fmt.Errorf("%w: %w", link.ErrTryAgain, err) } if k.kept != nil {