From 2d841870a873d877b068559297187d75417f3db9 Mon Sep 17 00:00:00 2001 From: jochen Date: Mon, 26 Oct 2026 14:03:48 +0100 Subject: [PATCH] Assigner: only a put still on its steps is named when a node leaves neither list (issue 1945) Review round 2: an ended put stays in the bucket and owns no want. --- .../cmd/mesh-delivery-assigner/pass.go | 9 +++++---- .../cmd/mesh-delivery-assigner/pass_test.go | 1 + 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/modules/mesh-delivery-assigner/cmd/mesh-delivery-assigner/pass.go b/modules/mesh-delivery-assigner/cmd/mesh-delivery-assigner/pass.go index 01370a6..45c3e77 100644 --- a/modules/mesh-delivery-assigner/cmd/mesh-delivery-assigner/pass.go +++ b/modules/mesh-delivery-assigner/cmd/mesh-delivery-assigner/pass.go @@ -277,11 +277,12 @@ func leftNeither(into map[string]string, m assign.Module, before map[string]deli } } -// putOn says whether an operator's put names module m on node: it owns the node's want through its steps (ADR 0546), so the -// rules write none meanwhile. +// putOn says whether an operator's put on node owns m's want there: one still on its steps (ADR 0546), so the rules write none +// meanwhile. An ended put (done, refused, released) stays in the bucket and owns nothing. func putOn(m assign.Module, node string) bool { - _, put := m.Puts[node] - return put + p, put := m.Puts[node] + _, owns := assign.PutOwns(p) + return put && owns } // startClears adds, for the first pass after a start, every node of m that is not on neither list after the pass: a neither diff --git a/modules/mesh-delivery-assigner/cmd/mesh-delivery-assigner/pass_test.go b/modules/mesh-delivery-assigner/cmd/mesh-delivery-assigner/pass_test.go index 575224f..7a89fef 100644 --- a/modules/mesh-delivery-assigner/cmd/mesh-delivery-assigner/pass_test.go +++ b/modules/mesh-delivery-assigner/cmd/mesh-delivery-assigner/pass_test.go @@ -409,6 +409,7 @@ func TestThePassGathersTheModulesOnNeitherList(t *testing.T) { {"a live want", nil, map[string]delivery.Want{"novox": {FP: fpTest}}, ""}, {"a put on its steps", map[string]delivery.Put{"novox": {FP: fpTest, Step: delivery.PutPerson}}, nil, "its put waits on its own steps and the operator's answer"}, {"nothing", nil, nil, "the node does not run it"}, + {"an ended put", map[string]delivery.Put{"novox": {FP: fpTest, Step: delivery.PutRefused}}, nil, "the node does not run it"}, } { left := map[string]string{} leftNeither(left, assign.Module{Name: "nats", FP: fpTest, Nodes: []string{"novox"}, Puts: c.puts}, c.before, assign.Outcome{})