A newer sequence carrying an older view of the assignments undeclared four assigned modules on 2026-10-04; the sequence cannot tell it, the generation can. The engine keeps the highest generation it applied, refuses an older one before reading the machine unless the declaration is a gate's put-back, and says the refusal in its report so the controller can name the sender. A declaration without a generation is applied as before, and every report says it reads one, so the controller sends it only to engines that do.
41 lines
1.7 KiB
Go
41 lines
1.7 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
"github.com/novox/mesh-host/internal/apply"
|
|
"github.com/novox/mesh-host/internal/store"
|
|
"github.com/novox/mesh-host/internal/system"
|
|
)
|
|
|
|
// **The generation applied is kept, and a put-back never lowers it**: after a put-back of generation 5
|
|
// over 7, a send from generation 6 is still older than what this machine applied.
|
|
func TestThePutBackDoesNotLowerTheGenerationApplied(t *testing.T) {
|
|
built, err := system.For("arch")
|
|
if err != nil || built.Confirm(context.Background(), apply.ExecRunner) != nil {
|
|
t.Skip("this machine is not one these tests can apply on")
|
|
}
|
|
was := builtFor
|
|
builtFor = "arch"
|
|
t.Cleanup(func() { builtFor = was })
|
|
f := machineThatApplied(t, 7)
|
|
|
|
newer := f.declared(t, map[string]any{"sequence": 9, "generation": 8}, "docker.conf", f.stays)
|
|
if r := applyAndKeep(context.Background(), f.opts, newer.Declaration, &newer, nil, nil); r.Refused != "" {
|
|
t.Fatalf("a newer generation was refused: %s", r.Refused)
|
|
}
|
|
back := f.declared(t, map[string]any{"sequence": 10, "generation": 5, "put_back": true}, "docker.conf", f.stays)
|
|
if r := applyAndKeep(context.Background(), f.opts, back.Declaration, &back, nil, nil); r.Refused != "" {
|
|
t.Fatalf("a put-back was refused: %s", r.Refused)
|
|
}
|
|
state, err := store.Load(f.opts.state)
|
|
if err != nil || state.Generation != 8 {
|
|
t.Fatalf("the generation applied is %d after a put-back of 5 over 8 (%v)", state.Generation, err)
|
|
}
|
|
stale := f.declared(t, map[string]any{"sequence": 11, "generation": 7}, "docker.conf", f.stays)
|
|
if r := applyAndKeep(context.Background(), f.opts, stale.Declaration, &stale, nil, nil); r.OlderGeneration == nil {
|
|
t.Fatalf("a send from generation 7 after 8 was applied because a put-back came between: %+v", r)
|
|
}
|
|
}
|