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.
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user