A declaration newer in sequence than every other named four fewer modules than the assignments held, a machine applied it, and nothing the mesh kept said who sent it or from what view. The store now raises an assignment generation in the same transaction as every assignment change (a trigger, so a cascade counts too); a send reads it before composing, carries it to engines that said they read it, marks a gate's put-back, and is recorded with its sequence, sender, generation and modules. The would-send is stamped with what was last sent, so nothing reads behind for it; a refusal is kept on the send it refused and raised as S20 naming the sender; plan says what the machine was last told.
34 lines
1.3 KiB
Go
34 lines
1.3 KiB
Go
package link
|
|
|
|
import (
|
|
"encoding/json"
|
|
"testing"
|
|
)
|
|
|
|
// A report's word on the assignment generation (novox/hq issue 234), as mesh-host's report writes it:
|
|
// `reads_generation` on every report of a node-engine that reads one, and `older_generation` on a refusal
|
|
// of a declaration composed from an older generation than the machine applied.
|
|
func TestTheGenerationOnTheWire(t *testing.T) {
|
|
raw := []byte(`{"node":"anchor","refused":"older generation","declared":"d12","epoch":57,"sequence":12,` +
|
|
`"report_sequence":8,"reads_generation":true,"older_generation":{"generation":38,"applied":40}}`)
|
|
var r Report
|
|
if err := json.Unmarshal(raw, &r); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !r.ReadsGeneration || r.OlderGeneration == nil || *r.OlderGeneration != (GenerationRefusal{38, 40}) ||
|
|
r.Sequence != 12 {
|
|
t.Fatalf("a node-engine's generation refusal reads as %+v", r)
|
|
}
|
|
// Not a refusal by the lease's epoch: S13 counts those, and this one is raised naming its sender.
|
|
if r.StaleRefusalOf() {
|
|
t.Errorf("a generation refusal reads as a stale writer's")
|
|
}
|
|
var older Report
|
|
if err := json.Unmarshal([]byte(`{"node":"anchor","applied":["a"],"report_sequence":3}`), &older); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if older.ReadsGeneration || older.OlderGeneration != nil {
|
|
t.Fatalf("a node-engine that never said it reads a generation reads as one that does: %+v", older)
|
|
}
|
|
}
|