Pass a seat held once to its only claimant when its recorded holder is assigned nowhere (issue 1317, ADR 0449)
This commit is contained in:
@@ -153,3 +153,24 @@ func TestAReplicatedSeatHasSeveralHoldersOnRecord(t *testing.T) {
|
||||
t.Fatalf("a handover left other holders on record: %+v", held)
|
||||
}
|
||||
}
|
||||
|
||||
// A pass is a compare-and-set: it moves the record only while the holder it was read with is still on it.
|
||||
func TestPassingASeatMovesTheRecordOnceAndOnlyFromTheHolderRead(t *testing.T) {
|
||||
inv, ctx := twoBrokersOnTwoNodes(t)
|
||||
if err := inv.HoldSeat(ctx, "mesh-broker", catalogue.ScopeMesh, "anchor", "old-broker"); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
from := catalogue.Held{Claim: "mesh-broker", Scope: catalogue.ScopeMesh, Node: "anchor", Module: "old-broker"}
|
||||
to := catalogue.Held{Claim: "mesh-broker", Scope: catalogue.ScopeMesh, Node: "laptop", Module: "new-broker"}
|
||||
passed, err := inv.PassSeat(ctx, "mesh-broker", catalogue.ScopeMesh, from, to)
|
||||
if err != nil || !passed {
|
||||
t.Fatalf("the seat was not passed: %v %v", passed, err)
|
||||
}
|
||||
held, _ := inv.Holdings(ctx)
|
||||
if len(held) != 1 || held[0].Node != "laptop" || held[0].Module != "new-broker" {
|
||||
t.Fatalf("the record does not name the new holder alone: %+v", held)
|
||||
}
|
||||
if passed, err = inv.PassSeat(ctx, "mesh-broker", catalogue.ScopeMesh, from, to); err != nil || passed {
|
||||
t.Fatalf("a second pass from the same read moved the record again: %v %v", passed, err)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user