From 071c5710c5f682a80087c1fe02abb38dd36a1194 Mon Sep 17 00:00:00 2001 From: Christian Schwarz Date: Sun, 19 Jan 2025 22:16:58 +0100 Subject: [PATCH] offline-ness --- storage_broker/spec/replicated/replicated.tla | 35 +- .../Model_1/25-01-19-16-40-15/MC-0.st | Bin 16384 -> 0 bytes .../Model_1/25-01-19-16-40-15/MC-1.st | Bin 16384 -> 0 bytes .../Model_1/25-01-19-16-40-15/MC-2.st | Bin 16384 -> 0 bytes .../Model_1/25-01-19-16-40-15/MC-3.st | Bin 16384 -> 0 bytes .../replicated.toolbox/Model_1/MC.cfg | 22 +- .../replicated.toolbox/Model_1/MC.out | 53 --- .../replicated.toolbox/Model_1/MC.tla | 26 +- .../replicated.toolbox/Model_1/MC_TE.out | 317 +++++++++++++++- .../replicated.toolbox/Model_1/replicated.tla | 35 +- .../Model_1/states/25-01-19-18-52-55/0 | Bin 0 -> 720007 bytes .../Model_1/states/25-01-19-18-52-55/MC-0.st | Bin 0 -> 270336 bytes .../25-01-19-18-52-55}/MC.st | 0 .../25-01-19-18-52-55}/MC_0.fp | 0 .../25-01-19-18-52-55}/MC_1.fp | 0 .../25-01-19-18-52-55}/nodes_0 | 0 .../25-01-19-18-52-55}/ptrs_0 | 0 .../Model_1_SnapShot_1737296416956/MC.cfg | 37 -- .../Model_1_SnapShot_1737296416956/MC.out | 38 -- .../Model_1_SnapShot_1737296416956/MC.tla | 50 --- .../Model_1_SnapShot_1737296416956/MC_TE.out | 38 -- .../fullmesh.tla | 85 ----- .../Model_1_SnapShot_1737297534393/MC.cfg | 48 --- .../Model_1_SnapShot_1737297534393/MC.out | 35 -- .../Model_1_SnapShot_1737297534393/MC_TE.out | 35 -- .../fullmesh.tla | 91 ----- .../Model_1_SnapShot_1737297999722/MC.cfg | 48 --- .../Model_1_SnapShot_1737297999722/MC.out | 38 -- .../Model_1_SnapShot_1737297999722/MC.tla | 65 ---- .../Model_1_SnapShot_1737297999722/MC_TE.out | 38 -- .../fullmesh.tla | 97 ----- .../fullmesh.tla | 115 ------ .../Model_1_SnapShot_1737299381423/MC.tla | 65 ---- .../fullmesh.tla | 115 ------ .../Model_1_SnapShot_1737299469039/MC.out | 202 ---------- .../Model_1_SnapShot_1737299469039/MC.tla | 65 ---- .../Model_1_SnapShot_1737299469039/MC_TE.out | 202 ---------- .../Model_1_SnapShot_1737299542008/MC.out | 57 --- .../Model_1_SnapShot_1737299542008/MC.tla | 65 ---- .../Model_1_SnapShot_1737299542008/MC_TE.out | 57 --- .../Model_1_SnapShot_1737299744229/MC.cfg | 51 --- .../Model_1_SnapShot_1737299744229/MC.out | 323 ---------------- .../Model_1_SnapShot_1737299744229/MC.tla | 65 ---- .../Model_1_SnapShot_1737299744229/MC_TE.out | 323 ---------------- .../MC.cfg | 18 +- .../Model_1_SnapShot_1737307595008/MC.out | 164 ++++++++ .../MC.tla | 20 +- .../Model_1_SnapShot_1737307595008/MC_TE.out | 164 ++++++++ .../replicated.tla | 26 +- .../MC.cfg | 18 +- .../Model_1_SnapShot_1737307621596/MC.out | 174 +++++++++ .../MC.tla | 20 +- .../Model_1_SnapShot_1737307621596/MC_TE.out | 174 +++++++++ .../replicated.tla | 27 +- .../MC.cfg | 18 +- .../MC.out | 155 ++++---- .../MC.tla | 22 +- .../MC_TE.out | 155 ++++---- .../replicated.tla} | 30 +- .../MC.cfg | 18 +- .../Model_1_SnapShot_1737307704621/MC.out | 282 ++++++++++++++ .../MC.tla | 22 +- .../Model_1_SnapShot_1737307704621/MC_TE.out | 282 ++++++++++++++ .../replicated.tla | 131 +++++++ .../Model_1_SnapShot_1737307769810/MC.cfg | 51 +++ .../MC.out | 16 +- .../Model_1_SnapShot_1737307769810/MC.tla | 65 ++++ .../MC_TE.out | 16 +- .../replicated.tla} | 32 +- .../Model_1_SnapShot_1737307828738/MC.cfg | 50 +++ .../MC.out | 19 +- .../Model_1_SnapShot_1737307828738/MC.tla | 65 ++++ .../MC_TE.out | 19 +- .../replicated.tla} | 33 +- .../MC.cfg | 22 +- .../MC.out | 16 +- .../Model_1_SnapShot_1737308024914/MC.tla | 65 ++++ .../MC_TE.out | 16 +- .../replicated.tla | 135 +++++++ .../MC.cfg | 22 +- .../Model_1_SnapShot_1737308183077/MC.out | 52 +++ .../Model_1_SnapShot_1737308183077/MC.tla | 65 ++++ .../Model_1_SnapShot_1737308183077/MC_TE.out | 52 +++ .../replicated.tla | 134 +++++++ .../Model_1_SnapShot_1737308216766/MC.cfg | 53 +++ .../Model_1_SnapShot_1737308216766/MC.out | 53 +++ .../Model_1_SnapShot_1737308216766/MC.tla | 65 ++++ .../Model_1_SnapShot_1737308216766/MC_TE.out | 53 +++ .../replicated.tla | 134 +++++++ .../Model_1_SnapShot_1737308355472/MC.cfg | 53 +++ .../Model_1_SnapShot_1737308355472/MC.out | 354 ++++++++++++++++++ .../Model_1_SnapShot_1737308355472/MC.tla | 65 ++++ .../Model_1_SnapShot_1737308355472/MC_TE.out | 354 ++++++++++++++++++ .../replicated.tla | 134 +++++++ .../replicated___Model_1.launch | 12 +- ...ed___Model_1_SnapShot_1737296416956.launch | 38 -- ...ed___Model_1_SnapShot_1737297534393.launch | 40 -- ...ed___Model_1_SnapShot_1737297999722.launch | 40 -- ...ed___Model_1_SnapShot_1737299352762.launch | 42 --- ...ed___Model_1_SnapShot_1737301172627.launch | 58 --- ...ed___Model_1_SnapShot_1737301223409.launch | 58 --- ...d___Model_1_SnapShot_1737307595008.launch} | 2 +- ...d___Model_1_SnapShot_1737307621596.launch} | 2 +- ...d___Model_1_SnapShot_1737307660221.launch} | 2 +- ...d___Model_1_SnapShot_1737307704621.launch} | 2 +- ...ed___Model_1_SnapShot_1737307769810.launch | 58 +++ ...ed___Model_1_SnapShot_1737307828738.launch | 58 +++ ...ed___Model_1_SnapShot_1737308024914.launch | 60 +++ ...ed___Model_1_SnapShot_1737308183077.launch | 60 +++ ...ed___Model_1_SnapShot_1737308216766.launch | 60 +++ ...ed___Model_1_SnapShot_1737308355472.launch | 60 +++ 111 files changed, 4617 insertions(+), 3154 deletions(-) delete mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1/25-01-19-16-40-15/MC-0.st delete mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1/25-01-19-16-40-15/MC-1.st delete mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1/25-01-19-16-40-15/MC-2.st delete mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1/25-01-19-16-40-15/MC-3.st create mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1/states/25-01-19-18-52-55/0 create mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1/states/25-01-19-18-52-55/MC-0.st rename storage_broker/spec/replicated/replicated.toolbox/Model_1/{25-01-19-16-40-15 => states/25-01-19-18-52-55}/MC.st (100%) rename storage_broker/spec/replicated/replicated.toolbox/Model_1/{25-01-19-16-40-15 => states/25-01-19-18-52-55}/MC_0.fp (100%) rename storage_broker/spec/replicated/replicated.toolbox/Model_1/{25-01-19-16-40-15 => states/25-01-19-18-52-55}/MC_1.fp (100%) rename storage_broker/spec/replicated/replicated.toolbox/Model_1/{25-01-19-16-40-15 => states/25-01-19-18-52-55}/nodes_0 (100%) rename storage_broker/spec/replicated/replicated.toolbox/Model_1/{25-01-19-16-40-15 => states/25-01-19-18-52-55}/ptrs_0 (100%) delete mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737296416956/MC.cfg delete mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737296416956/MC.out delete mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737296416956/MC.tla delete mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737296416956/MC_TE.out delete mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737296416956/fullmesh.tla delete mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737297534393/MC.cfg delete mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737297534393/MC.out delete mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737297534393/MC_TE.out delete mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737297534393/fullmesh.tla delete mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737297999722/MC.cfg delete mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737297999722/MC.out delete mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737297999722/MC.tla delete mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737297999722/MC_TE.out delete mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737297999722/fullmesh.tla delete mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299352762/fullmesh.tla delete mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299381423/MC.tla delete mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299381423/fullmesh.tla delete mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299469039/MC.out delete mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299469039/MC.tla delete mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299469039/MC_TE.out delete mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299542008/MC.out delete mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299542008/MC.tla delete mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299542008/MC_TE.out delete mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299744229/MC.cfg delete mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299744229/MC.out delete mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299744229/MC.tla delete mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299744229/MC_TE.out rename storage_broker/spec/replicated/replicated.toolbox/{Model_1_SnapShot_1737301172627 => Model_1_SnapShot_1737307595008}/MC.cfg (67%) create mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307595008/MC.out rename storage_broker/spec/replicated/replicated.toolbox/{Model_1_SnapShot_1737301172627 => Model_1_SnapShot_1737307595008}/MC.tla (69%) create mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307595008/MC_TE.out rename storage_broker/spec/replicated/replicated.toolbox/{Model_1_SnapShot_1737301223409 => Model_1_SnapShot_1737307595008}/replicated.tla (82%) rename storage_broker/spec/replicated/replicated.toolbox/{Model_1_SnapShot_1737301223409 => Model_1_SnapShot_1737307621596}/MC.cfg (66%) create mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307621596/MC.out rename storage_broker/spec/replicated/replicated.toolbox/{Model_1_SnapShot_1737301223409 => Model_1_SnapShot_1737307621596}/MC.tla (68%) create mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307621596/MC_TE.out rename storage_broker/spec/replicated/replicated.toolbox/{Model_1_SnapShot_1737301172627 => Model_1_SnapShot_1737307621596}/replicated.tla (81%) rename storage_broker/spec/replicated/replicated.toolbox/{Model_1_SnapShot_1737299469039 => Model_1_SnapShot_1737307660221}/MC.cfg (66%) rename storage_broker/spec/replicated/replicated.toolbox/{Model_1_SnapShot_1737299381423 => Model_1_SnapShot_1737307660221}/MC.out (58%) rename storage_broker/spec/replicated/replicated.toolbox/{Model_1_SnapShot_1737297534393 => Model_1_SnapShot_1737307660221}/MC.tla (66%) rename storage_broker/spec/replicated/replicated.toolbox/{Model_1_SnapShot_1737299381423 => Model_1_SnapShot_1737307660221}/MC_TE.out (58%) rename storage_broker/spec/replicated/replicated.toolbox/{Model_1_SnapShot_1737299744229/fullmesh.tla => Model_1_SnapShot_1737307660221/replicated.tla} (80%) rename storage_broker/spec/replicated/replicated.toolbox/{Model_1_SnapShot_1737299542008 => Model_1_SnapShot_1737307704621}/MC.cfg (66%) create mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307704621/MC.out rename storage_broker/spec/replicated/replicated.toolbox/{Model_1_SnapShot_1737299352762 => Model_1_SnapShot_1737307704621}/MC.tla (66%) create mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307704621/MC_TE.out create mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307704621/replicated.tla create mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307769810/MC.cfg rename storage_broker/spec/replicated/replicated.toolbox/{Model_1_SnapShot_1737301223409 => Model_1_SnapShot_1737307769810}/MC.out (80%) create mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307769810/MC.tla rename storage_broker/spec/replicated/replicated.toolbox/{Model_1_SnapShot_1737301223409 => Model_1_SnapShot_1737307769810}/MC_TE.out (80%) rename storage_broker/spec/replicated/replicated.toolbox/{Model_1_SnapShot_1737299469039/fullmesh.tla => Model_1_SnapShot_1737307769810/replicated.tla} (75%) create mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307828738/MC.cfg rename storage_broker/spec/replicated/replicated.toolbox/{Model_1_SnapShot_1737301172627 => Model_1_SnapShot_1737307828738}/MC.out (75%) create mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307828738/MC.tla rename storage_broker/spec/replicated/replicated.toolbox/{Model_1_SnapShot_1737301172627 => Model_1_SnapShot_1737307828738}/MC_TE.out (75%) rename storage_broker/spec/replicated/replicated.toolbox/{Model_1_SnapShot_1737299542008/fullmesh.tla => Model_1_SnapShot_1737307828738/replicated.tla} (75%) rename storage_broker/spec/replicated/replicated.toolbox/{Model_1_SnapShot_1737299352762 => Model_1_SnapShot_1737308024914}/MC.cfg (63%) rename storage_broker/spec/replicated/replicated.toolbox/{Model_1_SnapShot_1737299352762 => Model_1_SnapShot_1737308024914}/MC.out (67%) create mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308024914/MC.tla rename storage_broker/spec/replicated/replicated.toolbox/{Model_1_SnapShot_1737299352762 => Model_1_SnapShot_1737308024914}/MC_TE.out (67%) create mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308024914/replicated.tla rename storage_broker/spec/replicated/replicated.toolbox/{Model_1_SnapShot_1737299381423 => Model_1_SnapShot_1737308183077}/MC.cfg (63%) create mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308183077/MC.out create mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308183077/MC.tla create mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308183077/MC_TE.out create mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308183077/replicated.tla create mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308216766/MC.cfg create mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308216766/MC.out create mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308216766/MC.tla create mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308216766/MC_TE.out create mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308216766/replicated.tla create mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308355472/MC.cfg create mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308355472/MC.out create mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308355472/MC.tla create mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308355472/MC_TE.out create mode 100644 storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308355472/replicated.tla delete mode 100644 storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737296416956.launch delete mode 100644 storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737297534393.launch delete mode 100644 storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737297999722.launch delete mode 100644 storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737299352762.launch delete mode 100644 storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737301172627.launch delete mode 100644 storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737301223409.launch rename storage_broker/spec/replicated/replicated.toolbox/{replicated___Model_1_SnapShot_1737299381423.launch => replicated___Model_1_SnapShot_1737307595008.launch} (99%) rename storage_broker/spec/replicated/replicated.toolbox/{replicated___Model_1_SnapShot_1737299469039.launch => replicated___Model_1_SnapShot_1737307621596.launch} (99%) rename storage_broker/spec/replicated/replicated.toolbox/{replicated___Model_1_SnapShot_1737299542008.launch => replicated___Model_1_SnapShot_1737307660221.launch} (99%) rename storage_broker/spec/replicated/replicated.toolbox/{replicated___Model_1_SnapShot_1737299744229.launch => replicated___Model_1_SnapShot_1737307704621.launch} (99%) create mode 100644 storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737307769810.launch create mode 100644 storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737307828738.launch create mode 100644 storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737308024914.launch create mode 100644 storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737308183077.launch create mode 100644 storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737308216766.launch create mode 100644 storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737308355472.launch diff --git a/storage_broker/spec/replicated/replicated.tla b/storage_broker/spec/replicated/replicated.tla index 14910364fe..33971e3071 100644 --- a/storage_broker/spec/replicated/replicated.tla +++ b/storage_broker/spec/replicated/replicated.tla @@ -1,8 +1,8 @@ ---- MODULE replicated ---- -EXTENDS Integers +EXTENDS Integers, FiniteSets -VARIABLES broker_state, safekeeper_state, pageserver_state +VARIABLES broker_state, safekeeper_state, pageserver_state, online CONSTANT @@ -29,14 +29,23 @@ StateConstraint == InitSafekeeper == [pruned_lsn |-> 0, commit_lsn |-> 0] InitBroker == [sk |-> [s \in safekeepers |-> [commit_lsn |-> 0]]] InitPageserver == [last_record_lsn |-> 0, preferred_sk |-> NULL, sk |-> [s \in safekeepers |-> [commit_lsn |-> 0]]] +InitOnline == safekeepers \cup brokers \cup pageservers Init == /\ broker_state = [b \in brokers |-> InitBroker] /\ safekeeper_state = [s \in safekeepers |-> InitSafekeeper] /\ pageserver_state = [p \in pageservers |-> InitPageserver] + /\ online = InitOnline +NodeOnlineOffline == + /\ online' = CHOOSE ss \in SUBSET InitOnline: + /\ Cardinality(ss \cap safekeepers) >= 2 + /\ Cardinality(ss \cap brokers) >= 2 + /\ ss \cap pageservers = pageservers \* assume no PS failures for now + /\ UNCHANGED <> SkCommit(s1, s2) == + /\ {s1, s2} \subseteq online /\ s1 # s2 /\ safekeeper_state[s1].commit_lsn = safekeeper_state[s2].commit_lsn /\ LET @@ -45,14 +54,16 @@ SkCommit(s1, s2) == safekeeper_state' = [safekeeper_state EXCEPT ![s1].commit_lsn = new_commit_lsn, ![s2].commit_lsn = new_commit_lsn] - /\ UNCHANGED <> + /\ UNCHANGED <> SkPeerRecovery(s1,s2) == + /\ {s1, s2} \subseteq online /\ safekeeper_state[s1].commit_lsn < safekeeper_state[s2].commit_lsn /\ safekeeper_state' = [safekeeper_state EXCEPT![s1].commit_lsn = safekeeper_state[s2].commit_lsn] - /\ UNCHANGED <> + /\ UNCHANGED <> SkPushToBroker(s,b) == + /\ {s, b} \subseteq online /\ broker_state' = IF broker_state[b].sk[s].commit_lsn < safekeeper_state[s].commit_lsn THEN LET @@ -61,9 +72,10 @@ SkPushToBroker(s,b) == IN [broker_state EXCEPT ![b].sk = updbsk] ELSE broker_state - /\ UNCHANGED <> + /\ UNCHANGED <> PsRecvBroker(b,p,s) == + /\ {b,p,s} \subseteq online /\ LET bsk == broker_state[b].sk[s] psk == pageserver_state[p].sk[s] @@ -72,7 +84,7 @@ PsRecvBroker(b,p,s) == pageserver_state' = IF bsk.commit_lsn > psk.commit_lsn THEN [pageserver_state EXCEPT ![p].sk[s] = updpsk] ELSE pageserver_state - /\ UNCHANGED <> + /\ UNCHANGED <> SksWithNewerWal(p) == @@ -82,13 +94,14 @@ SksWithNewerWal(p) == {s \in DOMAIN ps.sk: ps.sk[s].commit_lsn > ps.last_record_lsn} PsChooseSk(p) == + /\ {p} \subseteq online /\ SksWithNewerWal(p) # {} /\ pageserver_state' = [pageserver_state EXCEPT![p].preferred_sk = CHOOSE s \in SksWithNewerWal(p): TRUE] - /\ UNCHANGED <> + /\ UNCHANGED <> Next == - + \/ NodeOnlineOffline \/ \E s1 \in safekeepers: \E s2 \in safekeepers: \/ SkCommit(s1, s2) \/ SkPeerRecovery(s1, s2) @@ -97,11 +110,15 @@ Next == \/ \E p \in pageservers: PsChooseSk(p) -Spec == Init /\ [][Next]_<< broker_state, safekeeper_state, pageserver_state >> +Spec == Init /\ [][Next]_<< broker_state, safekeeper_state, pageserver_state,online>> \* invariants +PsLagsSk == \A p \in pageservers: \A s \in DOMAIN pageserver_state[p].sk: + /\ pageserver_state[p].sk[s].commit_lsn <= safekeeper_state[s].commit_lsn + + EventuallyLaggingSkIsNotPreferredSk == <>( LET sks == safekeeper_state diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1/25-01-19-16-40-15/MC-0.st b/storage_broker/spec/replicated/replicated.toolbox/Model_1/25-01-19-16-40-15/MC-0.st deleted file mode 100644 index ea733796c7821122a6c0f72853b184cfd44b6ea3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 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 X4KFp4>gW(wc6eA$e}5_T#%1_FWU6FO diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1/25-01-19-16-40-15/MC-1.st b/storage_broker/spec/replicated/replicated.toolbox/Model_1/25-01-19-16-40-15/MC-1.st deleted file mode 100644 index 0b468bb25373bae87e01de2e6a1df88093046901..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 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 z zctcBrdU1r-(fJ*_4qLo~uFXi{Z)?PVi%V4iSv>1gm_crD9~4M{B6mame#X6&5y;{p zrSkceLwfxPtJ?K38%f!xp|>@n+A}n9@U_4_gt3XII`{5g@quP$IIV&BY3pLPw+JlV zdcO;NJD{vXgzq!_KK$oT^a!FC3iq3fKYs>r$I~v4L{>A8?LhcwMeqB0>kCLEh)BM! zlgU_ig*@Q6hmWm3(Fl810DBG~t8^u5-8CH66mUvM73tEI3D4- z_o>&f_6iav^S zHx_U~crY{DaGLi@B7Dy{xx3B$TIT2jC^cJI@XsyypFm@!T?p&RMmii)OG*gLX(P$$ z+C#PoAJR4_V)hE8B4{$db`9qt{{Z;#e)|`e_ECQxBZycihW4$Dv?ApErkV1==AqO; zvs`uW@!K=RDnJoWxOnN!q5L0^E`Yebk%8jD46t$lNgkfP)*+?vhb};)oqF-;{$sFm z?B9tdO>w61&7!ji4ADXUzr8%>5jKlivaR?np+rNo=|N#W9`#Fw2>RHsAAXmX;F86` zP1Fhdcl@lP4jovlN3f8G8MVSe|c7i{_YkZ%w<#?HibF_&!+ zA&JPlYh=dChaj^5pwLc>f@TC?mo1}{?&8*z&&EzpUC3oRZ|jDT{bAg_ozCW!pa z`f}4aH2)LA)~~~noRq(@rbMjM{n?cCvAnSUEaUG;!nr90gmW@E|?S zUPJmCMudnDBA0Up?Jpsy@04}hvEA z+rcDqTqL;a8DvGg+~N2Dv@dls-;lF}@c^#9GRtI?`3au@(5kgD4wxKSh7R777Ncin z&DA3;5!f%Pj&*hYJp|2mVW%t#8|}nRpt=C8N_f6rW_khZ1DLR+8&woB+X>IClD|1z zr7<=K7!Ic(eyd*j?esG?Q)m`|DK&n*s9XGP6C%dAY1ly%`EMt-BRC`!ZQ0fP$qwOk zaHi+6c0X|hc_~4e7DsCMQjP{2^a0;4FcN7PD)!p2aE?!v6UB zsg;Eg__GW|h7FGj?D(z?8xRo5<;~?>U$ixMoX14knh=uv4dAQw!nEtWm;l zsX!cog?pd-LsFIp;is&%$QNfxNPl?dtkHP%Yx<8A3=(}U*O=bU2hJh{z&`?Bx*~ZF z(23Q4S!-~(Y($0N6md1H?_v)JLc2z*RY&VdI3%DM-J*!Xnjq!>{{R%X>i7hSXMP6^ zVwT|!ZghWRbP(jvFNCnO>cC|IBHNu!XYU%^UPM?F@9~-*csB`HB2<_Ei*2C^fVl=Z zEQfE*mETT7K;x{%hgB`)EC}BxcS7Qx~VzR6QRxI*o%}Y=U8~g zg>0|lWDypQZb#_K;Ok{IJ5q-b-*eJ*M>9KIBcR#S=}+}>8hO)z8|2-_R8OT*Z>YV1 z=EJYk%UD>rpld};X`<$RGP3c0J+PFSFHlqSOK*p$0%QSN1?nc z!mSr=Y6H>lVQWHUm#c46quePdoq#XR4-1!iwJGnZB}aDs{dRXaV+!7L5_=H5Z>*S; zkOz1XhAvrIm2^8&}>!#j1URq8j;6ut9Vm@ed>=_8ZEBRLU?w2pRL{T$COczV0t~5 zbI7#>b_7EWx#k^Ri=hbG{KoZD--5m1rDsUx``a8JeiC^OupXalFPEnLw~KA%WWRAkns=ZUq(8ua*(Wy0`m*QX z5rv?3>#h>$xJ9P>_*_)ExSklAiWiW^Yrpu z6zks*gs|1{W_kDxCwS>1na`#qT>aKl58-Zm4^1WS#{lS>8Q0pkcI33-NeP6>dzu>M z*XW@GE@slEU15CY;0iN>h)<|#{U1SC5{T@-|NE%_=UGTG0KlO5GqVmq~A$L`9TLc7e?h176Nv0k6F&?Vd#(*$U_d=a1 ztCkbcO~%oVD1|>$xQtM9C8~P&=R~ zeek3E=^k9yw1KNT!0lexn~zoMup7B7iH1T>!IwX7L2=;nB&bg&__fKm*g&&TGB@{q zsP|Jlk-WVatItlbpf`E&e}8YTNbi!%KgY0ZP}iI|Jt^OaGgELOZLkO?4~`nn~mN YTl-A@8oEP<0G^*)nXYy};z_~(01`_xb^rhX diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1/25-01-19-16-40-15/MC-3.st b/storage_broker/spec/replicated/replicated.toolbox/Model_1/25-01-19-16-40-15/MC-3.st deleted file mode 100644 index 2eece7fbb554a3c052f12119c50586c5a9b192c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 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 {b1,s1,p1} , az2 |-> {b2,s2,p2} , az3 |-> {b3,s3}] +const_1737309054555169000 == +[ az1 |-> {b1,s1,p1} , az2 |-> {b2,s2} , az3 |-> {b3,s3}] ---- \* CONSTRAINT definition @modelParameterContraint:0 -constr_17373012151769000 == +constr_1737309054555170000 == StateConstraint ---- ============================================================================= \* Modification History -\* Created Sun Jan 19 16:40:15 CET 2025 by cs +\* Created Sun Jan 19 18:50:54 CET 2025 by cs diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1/MC_TE.out b/storage_broker/spec/replicated/replicated.toolbox/Model_1/MC_TE.out index ab92cbb3d7..72ebe05b45 100644 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1/MC_TE.out +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1/MC_TE.out @@ -2,7 +2,7 @@ TLC2 Version 2.19 of 08 August 2024 (rev: 5a47802) @!@!@ENDMSG 2262 @!@!@ @!@!@STARTMSG 2187:0 @!@!@ -Running breadth-first search Model-Checking with fp 20 and seed 6372772458573668883 with 4 workers on 8 cores with 2428MB heap and 5460MB offheap memory [pid: 9898] (Mac OS X 10.16 x86_64, AdoptOpenJDK 14.0.1 x86_64, OffHeapDiskFPSet, DiskStateQueue). +Running breadth-first search Model-Checking with fp 96 and seed 147884281130356166 with 4 workers on 8 cores with 2428MB heap and 5460MB offheap memory [pid: 12007] (Mac OS X 10.16 x86_64, AdoptOpenJDK 14.0.1 x86_64, OffHeapDiskFPSet, DiskStateQueue). @!@!@ENDMSG 2187 @!@!@ @!@!@STARTMSG 2220:0 @!@!@ Starting SANY... @@ -11,21 +11,21 @@ Parsing file /Users/cs/src/neon/storage_broker/spec/replicated/replicated.toolbo Parsing file /Users/cs/src/neon/storage_broker/spec/replicated/replicated.toolbox/Model_1/replicated.tla Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/TLC.tla Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Integers.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/FiniteSets.tla Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Naturals.tla Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Sequences.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/FiniteSets.tla Semantic processing of module Naturals Semantic processing of module Integers -Semantic processing of module replicated Semantic processing of module Sequences Semantic processing of module FiniteSets +Semantic processing of module replicated Semantic processing of module TLC Semantic processing of module MC @!@!@STARTMSG 2219:0 @!@!@ SANY finished. @!@!@ENDMSG 2219 @!@!@ @!@!@STARTMSG 2185:0 @!@!@ -Starting... (2025-01-19 16:40:16) +Starting... (2025-01-19 18:38:05) @!@!@ENDMSG 2185 @!@!@ @!@!@STARTMSG 2279:3 @!@!@ Declaring symmetry during liveness checking is dangerous. It might cause TLC to miss violations of the stated liveness properties. Please check liveness without symmetry defined. @@ -40,14 +40,315 @@ Implied-temporal checking--satisfiability problem has 1 branches. Computing initial states... @!@!@ENDMSG 2189 @!@!@ @!@!@STARTMSG 2190:0 @!@!@ -Finished computing initial states: 1 distinct state generated at 2025-01-19 16:40:18. +Finished computing initial states: 1 distinct state generated at 2025-01-19 18:38:06. @!@!@ENDMSG 2190 @!@!@ @!@!@STARTMSG 2192:0 @!@!@ -Checking temporal properties for the current state space with 1217 total distinct states at (2025-01-19 16:40:21) +Checking temporal properties for the current state space with 3861 total distinct states at (2025-01-19 18:38:09) @!@!@ENDMSG 2192 @!@!@ @!@!@STARTMSG 2267:0 @!@!@ -Finished checking temporal properties in 00s at 2025-01-19 16:40:21 +Finished checking temporal properties in 00s at 2025-01-19 18:38:09 @!@!@ENDMSG 2267 @!@!@ @!@!@STARTMSG 2200:0 @!@!@ -Progress(11) at 2025-01-19 16:40:21: 39.816 states generated (39.816 s/min), 3.288 distinct states found (3.288 ds/min), 2.067 states left on queue. +Progress(11) at 2025-01-19 18:38:09: 77.856 states generated (77.856 s/min), 8.653 distinct states found (8.653 ds/min), 4.790 states left on queue. @!@!@ENDMSG 2200 @!@!@ +@!@!@STARTMSG 2192:0 @!@!@ +Checking temporal properties for the current state space with 197257 total distinct states at (2025-01-19 18:39:09) +@!@!@ENDMSG 2192 @!@!@ +@!@!@STARTMSG 2267:0 @!@!@ +Finished checking temporal properties in 00s at 2025-01-19 18:39:09 +@!@!@ENDMSG 2267 @!@!@ +@!@!@STARTMSG 2200:0 @!@!@ +Progress(20) at 2025-01-19 18:39:09: 3.084.377 states generated (3.006.521 s/min), 204.964 distinct states found (196.311 ds/min), 7.704 states left on queue. +@!@!@ENDMSG 2200 @!@!@ +@!@!@STARTMSG 2200:0 @!@!@ +Progress(25) at 2025-01-19 18:39:12: 3.224.329 states generated, 208.868 distinct states found, 0 states left on queue. +@!@!@ENDMSG 2200 @!@!@ +@!@!@STARTMSG 2192:0 @!@!@ +Checking temporal properties for the complete state space with 208868 total distinct states at (2025-01-19 18:39:12) +@!@!@ENDMSG 2192 @!@!@ +@!@!@STARTMSG 2267:0 @!@!@ +Finished checking temporal properties in 00s at 2025-01-19 18:39:12 +@!@!@ENDMSG 2267 @!@!@ +@!@!@STARTMSG 2193:0 @!@!@ +Model checking completed. No error has been found. + Estimates of the probability that TLC did not check all reachable states + because two distinct states had the same fingerprint: + calculated (optimistic): val = 3.4E-8 + based on the actual fingerprints: val = 6.3E-10 +@!@!@ENDMSG 2193 @!@!@ +@!@!@STARTMSG 2201:0 @!@!@ +The coverage statistics at 2025-01-19 18:39:14 +@!@!@ENDMSG 2201 @!@!@ +@!@!@STARTMSG 2773:0 @!@!@ +: 1:1 +@!@!@ENDMSG 2773 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 35, col 5 to line 38, col 26 of module replicated: 1 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 14290:208868 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 41, col 8 to line 44, col 44 of module replicated: 208868 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 41, col 18 to line 44, col 44 of module replicated: 208868 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 42, col 9 to line 44, col 44 of module replicated: 22348876 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||line 42, col 12 to line 42, col 48 of module replicated: 22348876 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||line 43, col 12 to line 43, col 44 of module replicated: 8981324 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||line 44, col 12 to line 44, col 44 of module replicated: 2924152 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 41, col 32 to line 41, col 48 of module replicated: 208868 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 45, col 8 to line 45, col 67 of module replicated: 208868 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 84:530666 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 48, col 8 to line 48, col 32 of module replicated: 2410478 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2775:0 @!@!@ + |line 48, col 8 to line 48, col 15 of module replicated: 1879812:4246157 +@!@!@ENDMSG 2775 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 48, col 27 to line 48, col 32 of module replicated: 1879812 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 49, col 8 to line 49, col 14 of module replicated: 1643803 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 49, col 8 to line 49, col 9 of module replicated: 1113137 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 49, col 13 to line 49, col 14 of module replicated: 1113137 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 50, col 8 to line 50, col 72 of module replicated: 1170534 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 50, col 8 to line 50, col 38 of module replicated: 639868 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 50, col 42 to line 50, col 72 of module replicated: 639868 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 54, col 13 to line 56, col 50 of module replicated: 530666 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 57, col 8 to line 57, col 58 of module replicated: 530666 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 682:54601 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 60, col 8 to line 60, col 32 of module replicated: 1934413 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2775:0 @!@!@ + |line 60, col 8 to line 60, col 15 of module replicated: 1879812:4246157 +@!@!@ENDMSG 2775 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 60, col 27 to line 60, col 32 of module replicated: 1879812 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 61, col 8 to line 61, col 72 of module replicated: 54601 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 61, col 8 to line 61, col 38 of module replicated: 1113137 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 61, col 42 to line 61, col 72 of module replicated: 1113137 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 62, col 8 to line 62, col 102 of module replicated: 54601 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 63, col 8 to line 63, col 58 of module replicated: 54601 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 45241:1113137 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 66, col 8 to line 66, col 30 of module replicated: 2992949 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2775:0 @!@!@ + |line 66, col 8 to line 66, col 13 of module replicated: 1879812:4412756 +@!@!@ENDMSG 2775 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 66, col 25 to line 66, col 30 of module replicated: 1879812 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 67, col 8 to line 74, col 29 of module replicated: 1113137 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 67, col 24 to line 74, col 29 of module replicated: 1113137 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 67, col 27 to line 67, col 91 of module replicated: 1113137 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 70, col 28 to line 70, col 45 of module replicated: 611653 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 71, col 31 to line 71, col 91 of module replicated: 611653 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 73, col 17 to line 73, col 54 of module replicated: 611653 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 74, col 18 to line 74, col 29 of module replicated: 501484 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 75, col 8 to line 75, col 62 of module replicated: 1113137 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 90643:1113137 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 78, col 8 to line 78, col 31 of module replicated: 2992949 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2775:0 @!@!@ + |line 78, col 8 to line 78, col 14 of module replicated: 1879812:5525893 +@!@!@ENDMSG 2775 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 78, col 26 to line 78, col 31 of module replicated: 1879812 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 84, col 13 to line 86, col 37 of module replicated: 1113137 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 84, col 33 to line 86, col 37 of module replicated: 1113137 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 84, col 36 to line 84, col 66 of module replicated: 1113137 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 85, col 22 to line 85, col 66 of module replicated: 406880 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 86, col 22 to line 86, col 37 of module replicated: 706257 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 87, col 8 to line 87, col 58 of module replicated: 1113137 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 57927:203919 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 97, col 8 to line 97, col 27 of module replicated: 412787 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2775:0 @!@!@ + |line 97, col 8 to line 97, col 10 of module replicated: 208868:417736 +@!@!@ENDMSG 2775 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 97, col 22 to line 97, col 27 of module replicated: 208868 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 98, col 8 to line 98, col 30 of module replicated: 412787 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 98, col 8 to line 98, col 25 of module replicated: 208868 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 92, col 15 to line 92, col 33 of module replicated: 208868 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 94, col 5 to line 94, col 66 of module replicated: 208868 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||line 94, col 26 to line 94, col 65 of module replicated: 626604 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||line 94, col 12 to line 94, col 23 of module replicated: 208868 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 98, col 24 to line 98, col 24 of module replicated: 208868 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 98, col 29 to line 98, col 30 of module replicated: 208868 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 99, col 8 to line 99, col 109 of module replicated: 203919 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 99, col 28 to line 99, col 109 of module replicated: 203919 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 99, col 29 to line 99, col 44 of module replicated: 203919 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 99, col 52 to line 99, col 108 of module replicated: 203919 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 99, col 72 to line 99, col 108 of module replicated: 203919 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||line 99, col 105 to line 99, col 108 of module replicated: 203919 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||line 99, col 85 to line 99, col 102 of module replicated: 203919 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||||line 92, col 15 to line 92, col 33 of module replicated: 203919 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2775:0 @!@!@ + ||||line 94, col 5 to line 94, col 66 of module replicated: 203919:203919 +@!@!@ENDMSG 2775 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||||line 94, col 26 to line 94, col 65 of module replicated: 611757 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||||line 94, col 12 to line 94, col 23 of module replicated: 203919 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||||line 99, col 101 to line 99, col 101 of module replicated: 203919 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 100, col 8 to line 100, col 58 of module replicated: 203919 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2774:0 @!@!@ + +@!@!@ENDMSG 2774 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 118, col 13 to line 119, col 81 of module replicated: 736274 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 118, col 35 to line 119, col 81 of module replicated: 736274 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 119, col 9 to line 119, col 81 of module replicated: 2208822 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 118, col 44 to line 118, col 72 of module replicated: 736274 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 118, col 22 to line 118, col 32 of module replicated: 736274 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2202:0 @!@!@ +End of statistics. +@!@!@ENDMSG 2202 @!@!@ +@!@!@STARTMSG 2200:0 @!@!@ +Progress(25) at 2025-01-19 18:39:14: 3.224.329 states generated (2.761.383 s/min), 208.868 distinct states found (178.878 ds/min), 0 states left on queue. +@!@!@ENDMSG 2200 @!@!@ +@!@!@STARTMSG 2199:0 @!@!@ +3224329 states generated, 208868 distinct states found, 0 states left on queue. +@!@!@ENDMSG 2199 @!@!@ +@!@!@STARTMSG 2194:0 @!@!@ +The depth of the complete state graph search is 25. +@!@!@ENDMSG 2194 @!@!@ +@!@!@STARTMSG 2268:0 @!@!@ +The average outdegree of the complete state graph is 1 (minimum is 0, the maximum 9 and the 95th percentile is 3). +@!@!@ENDMSG 2268 @!@!@ +@!@!@STARTMSG 2186:0 @!@!@ +Finished in 70074ms at (2025-01-19 18:39:14) +@!@!@ENDMSG 2186 @!@!@ diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1/replicated.tla b/storage_broker/spec/replicated/replicated.toolbox/Model_1/replicated.tla index 14910364fe..33971e3071 100644 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1/replicated.tla +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1/replicated.tla @@ -1,8 +1,8 @@ ---- MODULE replicated ---- -EXTENDS Integers +EXTENDS Integers, FiniteSets -VARIABLES broker_state, safekeeper_state, pageserver_state +VARIABLES broker_state, safekeeper_state, pageserver_state, online CONSTANT @@ -29,14 +29,23 @@ StateConstraint == InitSafekeeper == [pruned_lsn |-> 0, commit_lsn |-> 0] InitBroker == [sk |-> [s \in safekeepers |-> [commit_lsn |-> 0]]] InitPageserver == [last_record_lsn |-> 0, preferred_sk |-> NULL, sk |-> [s \in safekeepers |-> [commit_lsn |-> 0]]] +InitOnline == safekeepers \cup brokers \cup pageservers Init == /\ broker_state = [b \in brokers |-> InitBroker] /\ safekeeper_state = [s \in safekeepers |-> InitSafekeeper] /\ pageserver_state = [p \in pageservers |-> InitPageserver] + /\ online = InitOnline +NodeOnlineOffline == + /\ online' = CHOOSE ss \in SUBSET InitOnline: + /\ Cardinality(ss \cap safekeepers) >= 2 + /\ Cardinality(ss \cap brokers) >= 2 + /\ ss \cap pageservers = pageservers \* assume no PS failures for now + /\ UNCHANGED <> SkCommit(s1, s2) == + /\ {s1, s2} \subseteq online /\ s1 # s2 /\ safekeeper_state[s1].commit_lsn = safekeeper_state[s2].commit_lsn /\ LET @@ -45,14 +54,16 @@ SkCommit(s1, s2) == safekeeper_state' = [safekeeper_state EXCEPT ![s1].commit_lsn = new_commit_lsn, ![s2].commit_lsn = new_commit_lsn] - /\ UNCHANGED <> + /\ UNCHANGED <> SkPeerRecovery(s1,s2) == + /\ {s1, s2} \subseteq online /\ safekeeper_state[s1].commit_lsn < safekeeper_state[s2].commit_lsn /\ safekeeper_state' = [safekeeper_state EXCEPT![s1].commit_lsn = safekeeper_state[s2].commit_lsn] - /\ UNCHANGED <> + /\ UNCHANGED <> SkPushToBroker(s,b) == + /\ {s, b} \subseteq online /\ broker_state' = IF broker_state[b].sk[s].commit_lsn < safekeeper_state[s].commit_lsn THEN LET @@ -61,9 +72,10 @@ SkPushToBroker(s,b) == IN [broker_state EXCEPT ![b].sk = updbsk] ELSE broker_state - /\ UNCHANGED <> + /\ UNCHANGED <> PsRecvBroker(b,p,s) == + /\ {b,p,s} \subseteq online /\ LET bsk == broker_state[b].sk[s] psk == pageserver_state[p].sk[s] @@ -72,7 +84,7 @@ PsRecvBroker(b,p,s) == pageserver_state' = IF bsk.commit_lsn > psk.commit_lsn THEN [pageserver_state EXCEPT ![p].sk[s] = updpsk] ELSE pageserver_state - /\ UNCHANGED <> + /\ UNCHANGED <> SksWithNewerWal(p) == @@ -82,13 +94,14 @@ SksWithNewerWal(p) == {s \in DOMAIN ps.sk: ps.sk[s].commit_lsn > ps.last_record_lsn} PsChooseSk(p) == + /\ {p} \subseteq online /\ SksWithNewerWal(p) # {} /\ pageserver_state' = [pageserver_state EXCEPT![p].preferred_sk = CHOOSE s \in SksWithNewerWal(p): TRUE] - /\ UNCHANGED <> + /\ UNCHANGED <> Next == - + \/ NodeOnlineOffline \/ \E s1 \in safekeepers: \E s2 \in safekeepers: \/ SkCommit(s1, s2) \/ SkPeerRecovery(s1, s2) @@ -97,11 +110,15 @@ Next == \/ \E p \in pageservers: PsChooseSk(p) -Spec == Init /\ [][Next]_<< broker_state, safekeeper_state, pageserver_state >> +Spec == Init /\ [][Next]_<< broker_state, safekeeper_state, pageserver_state,online>> \* invariants +PsLagsSk == \A p \in pageservers: \A s \in DOMAIN pageserver_state[p].sk: + /\ pageserver_state[p].sk[s].commit_lsn <= safekeeper_state[s].commit_lsn + + EventuallyLaggingSkIsNotPreferredSk == <>( LET sks == safekeeper_state diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1/states/25-01-19-18-52-55/0 b/storage_broker/spec/replicated/replicated.toolbox/Model_1/states/25-01-19-18-52-55/0 new file mode 100644 index 0000000000000000000000000000000000000000..589450a97d72a90bb5a8ea1b0bc6a7a5aeb3901b GIT binary patch literal 720007 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

D2g()%+kW~35X$1p5LE?U(C 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�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%0Dg2Ue7Veg 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 literal 0 HcmV?d00001 diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1/states/25-01-19-18-52-55/MC-0.st b/storage_broker/spec/replicated/replicated.toolbox/Model_1/states/25-01-19-18-52-55/MC-0.st new file mode 100644 index 0000000000000000000000000000000000000000..662525646c0a80016ef9a25c411dc9ddf0f50221 GIT binary patch literal 270336 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%0D{<`i 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�gNb6E^!;IE?#;h+%^bJZ$j8XF4YLwh&x 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⪙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νQITk=z*6~u*7`J5Yg{urU#2}AOQh$Cbz8p6!T$? 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�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с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 literal 0 HcmV?d00001 diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1/25-01-19-16-40-15/MC.st b/storage_broker/spec/replicated/replicated.toolbox/Model_1/states/25-01-19-18-52-55/MC.st similarity index 100% rename from storage_broker/spec/replicated/replicated.toolbox/Model_1/25-01-19-16-40-15/MC.st rename to storage_broker/spec/replicated/replicated.toolbox/Model_1/states/25-01-19-18-52-55/MC.st diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1/25-01-19-16-40-15/MC_0.fp b/storage_broker/spec/replicated/replicated.toolbox/Model_1/states/25-01-19-18-52-55/MC_0.fp similarity index 100% rename from storage_broker/spec/replicated/replicated.toolbox/Model_1/25-01-19-16-40-15/MC_0.fp rename to storage_broker/spec/replicated/replicated.toolbox/Model_1/states/25-01-19-18-52-55/MC_0.fp diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1/25-01-19-16-40-15/MC_1.fp b/storage_broker/spec/replicated/replicated.toolbox/Model_1/states/25-01-19-18-52-55/MC_1.fp similarity index 100% rename from storage_broker/spec/replicated/replicated.toolbox/Model_1/25-01-19-16-40-15/MC_1.fp rename to storage_broker/spec/replicated/replicated.toolbox/Model_1/states/25-01-19-18-52-55/MC_1.fp diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1/25-01-19-16-40-15/nodes_0 b/storage_broker/spec/replicated/replicated.toolbox/Model_1/states/25-01-19-18-52-55/nodes_0 similarity index 100% rename from storage_broker/spec/replicated/replicated.toolbox/Model_1/25-01-19-16-40-15/nodes_0 rename to storage_broker/spec/replicated/replicated.toolbox/Model_1/states/25-01-19-18-52-55/nodes_0 diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1/25-01-19-16-40-15/ptrs_0 b/storage_broker/spec/replicated/replicated.toolbox/Model_1/states/25-01-19-18-52-55/ptrs_0 similarity index 100% rename from storage_broker/spec/replicated/replicated.toolbox/Model_1/25-01-19-16-40-15/ptrs_0 rename to storage_broker/spec/replicated/replicated.toolbox/Model_1/states/25-01-19-18-52-55/ptrs_0 diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737296416956/MC.cfg b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737296416956/MC.cfg deleted file mode 100644 index 315dcb696c..0000000000 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737296416956/MC.cfg +++ /dev/null @@ -1,37 +0,0 @@ -\* MV CONSTANT declarations -CONSTANTS -b1 = b1 -b2 = b2 -b3 = b3 -\* MV CONSTANT declarations -CONSTANTS -s1 = s1 -s2 = s2 -s3 = s3 -\* MV CONSTANT declarations -CONSTANTS -p1 = p1 -p2 = p2 -\* MV CONSTANT definitions -CONSTANT -brokers <- const_1737296402193120000 -\* CONSTANT declarations -CONSTANT NULL = NULL -\* MV CONSTANT definitions -CONSTANT -safekeepers <- const_1737296402194121000 -\* MV CONSTANT definitions -CONSTANT -pageservers <- const_1737296402194122000 -\* SYMMETRY definition -SYMMETRY symm_1737296402194123000 -\* CONSTANT definitions -CONSTANT -max_commit_lsn <- const_1737296402194124000 -\* CONSTRAINT definition -CONSTRAINT -constr_1737296402194125000 -\* SPECIFICATION definition -SPECIFICATION -Spec -\* Generated on Sun Jan 19 15:20:02 CET 2025 \ No newline at end of file diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737296416956/MC.out b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737296416956/MC.out deleted file mode 100644 index 696943b056..0000000000 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737296416956/MC.out +++ /dev/null @@ -1,38 +0,0 @@ -@!@!@STARTMSG 2262:0 @!@!@ -TLC2 Version 2.19 of 08 August 2024 (rev: 5a47802) -@!@!@ENDMSG 2262 @!@!@ -@!@!@STARTMSG 2187:0 @!@!@ -Running breadth-first search Model-Checking with fp 60 and seed 6751784514943401101 with 4 workers on 8 cores with 2428MB heap and 5460MB offheap memory [pid: 5476] (Mac OS X 10.16 x86_64, AdoptOpenJDK 14.0.1 x86_64, OffHeapDiskFPSet, DiskStateQueue). -@!@!@ENDMSG 2187 @!@!@ -@!@!@STARTMSG 2220:0 @!@!@ -Starting SANY... -@!@!@ENDMSG 2220 @!@!@ -Parsing file /Users/cs/Desktop/broker/fullmesh/fullmesh.toolbox/Model_1/MC.tla -Parsing file /Users/cs/Desktop/broker/fullmesh/fullmesh.toolbox/Model_1/fullmesh.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/TLC.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Integers.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Naturals.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Sequences.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/FiniteSets.tla -Semantic processing of module Naturals -Semantic processing of module Integers -Semantic processing of module fullmesh -Semantic processing of module Sequences -Semantic processing of module FiniteSets -Semantic processing of module TLC -Semantic processing of module MC -@!@!@STARTMSG 2219:0 @!@!@ -SANY finished. -@!@!@ENDMSG 2219 @!@!@ -@!@!@STARTMSG 2185:0 @!@!@ -Starting... (2025-01-19 15:20:03) -@!@!@ENDMSG 2185 @!@!@ -@!@!@STARTMSG 2189:0 @!@!@ -Computing initial states... -@!@!@ENDMSG 2189 @!@!@ -@!@!@STARTMSG 2190:0 @!@!@ -Finished computing initial states: 1 distinct state generated at 2025-01-19 15:20:04. -@!@!@ENDMSG 2190 @!@!@ -@!@!@STARTMSG 2200:0 @!@!@ -Progress(12) at 2025-01-19 15:20:07: 163.015 states generated (163.015 s/min), 12.588 distinct states found (12.588 ds/min), 7.372 states left on queue. -@!@!@ENDMSG 2200 @!@!@ diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737296416956/MC.tla b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737296416956/MC.tla deleted file mode 100644 index d30390320b..0000000000 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737296416956/MC.tla +++ /dev/null @@ -1,50 +0,0 @@ ----- MODULE MC ---- -EXTENDS fullmesh, TLC - -\* MV CONSTANT declarations@modelParameterConstants -CONSTANTS -b1, b2, b3 ----- - -\* MV CONSTANT declarations@modelParameterConstants -CONSTANTS -s1, s2, s3 ----- - -\* MV CONSTANT declarations@modelParameterConstants -CONSTANTS -p1, p2 ----- - -\* MV CONSTANT definitions brokers -const_1737296402193120000 == -{b1, b2, b3} ----- - -\* MV CONSTANT definitions safekeepers -const_1737296402194121000 == -{s1, s2, s3} ----- - -\* MV CONSTANT definitions pageservers -const_1737296402194122000 == -{p1, p2} ----- - -\* SYMMETRY definition -symm_1737296402194123000 == -Permutations(const_1737296402193120000) \union Permutations(const_1737296402194121000) \union Permutations(const_1737296402194122000) ----- - -\* CONSTANT definitions @modelParameterConstants:4max_commit_lsn -const_1737296402194124000 == -2 ----- - -\* CONSTRAINT definition @modelParameterContraint:0 -constr_1737296402194125000 == -StateConstraint ----- -============================================================================= -\* Modification History -\* Created Sun Jan 19 15:20:02 CET 2025 by cs diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737296416956/MC_TE.out b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737296416956/MC_TE.out deleted file mode 100644 index 696943b056..0000000000 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737296416956/MC_TE.out +++ /dev/null @@ -1,38 +0,0 @@ -@!@!@STARTMSG 2262:0 @!@!@ -TLC2 Version 2.19 of 08 August 2024 (rev: 5a47802) -@!@!@ENDMSG 2262 @!@!@ -@!@!@STARTMSG 2187:0 @!@!@ -Running breadth-first search Model-Checking with fp 60 and seed 6751784514943401101 with 4 workers on 8 cores with 2428MB heap and 5460MB offheap memory [pid: 5476] (Mac OS X 10.16 x86_64, AdoptOpenJDK 14.0.1 x86_64, OffHeapDiskFPSet, DiskStateQueue). -@!@!@ENDMSG 2187 @!@!@ -@!@!@STARTMSG 2220:0 @!@!@ -Starting SANY... -@!@!@ENDMSG 2220 @!@!@ -Parsing file /Users/cs/Desktop/broker/fullmesh/fullmesh.toolbox/Model_1/MC.tla -Parsing file /Users/cs/Desktop/broker/fullmesh/fullmesh.toolbox/Model_1/fullmesh.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/TLC.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Integers.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Naturals.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Sequences.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/FiniteSets.tla -Semantic processing of module Naturals -Semantic processing of module Integers -Semantic processing of module fullmesh -Semantic processing of module Sequences -Semantic processing of module FiniteSets -Semantic processing of module TLC -Semantic processing of module MC -@!@!@STARTMSG 2219:0 @!@!@ -SANY finished. -@!@!@ENDMSG 2219 @!@!@ -@!@!@STARTMSG 2185:0 @!@!@ -Starting... (2025-01-19 15:20:03) -@!@!@ENDMSG 2185 @!@!@ -@!@!@STARTMSG 2189:0 @!@!@ -Computing initial states... -@!@!@ENDMSG 2189 @!@!@ -@!@!@STARTMSG 2190:0 @!@!@ -Finished computing initial states: 1 distinct state generated at 2025-01-19 15:20:04. -@!@!@ENDMSG 2190 @!@!@ -@!@!@STARTMSG 2200:0 @!@!@ -Progress(12) at 2025-01-19 15:20:07: 163.015 states generated (163.015 s/min), 12.588 distinct states found (12.588 ds/min), 7.372 states left on queue. -@!@!@ENDMSG 2200 @!@!@ diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737296416956/fullmesh.tla b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737296416956/fullmesh.tla deleted file mode 100644 index a70d3aeb85..0000000000 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737296416956/fullmesh.tla +++ /dev/null @@ -1,85 +0,0 @@ ----- MODULE fullmesh ---- - -EXTENDS Integers - -VARIABLES broker_state, safekeeper_state, pageserver_state - -vars == << broker_state, safekeeper_state, pageserver_state >> - -CONSTANT - brokers, - safekeepers, - pageservers - -CONSTANT - NULL - -CONSTANT - max_commit_lsn - -StateConstraint == - /\ \A s \in safekeepers: - /\ safekeeper_state[s].commit_lsn <= max_commit_lsn - /\ \A b \in brokers: - /\ \A s \in DOMAIN broker_state[b].sk: - /\ broker_state[b].sk[s].commit_lsn <= max_commit_lsn - - -InitSafekeeper == [pruned_lsn |-> 0, commit_lsn |-> 0] -InitBroker == [sk |-> [s \in safekeepers |-> [commit_lsn |-> 0]]] -InitPageserver == [last_record_lsn |-> 0, preferred_sk |-> NULL, sk |-> [s \in safekeepers |-> [commit_lsn |-> 0]]] - -Init == - /\ broker_state = [b \in brokers |-> InitBroker] - /\ safekeeper_state = [s \in safekeepers |-> InitSafekeeper] - /\ pageserver_state = [p \in pageservers |-> InitPageserver] - -SkCommit(s) == - /\ safekeeper_state' = [safekeeper_state EXCEPT ![s].commit_lsn = safekeeper_state[s].commit_lsn + 1] - /\ UNCHANGED <> - -SkPushToBroker(s,b) == - /\ broker_state' = IF broker_state[b].sk[s].commit_lsn < safekeeper_state[s].commit_lsn - THEN - LET - bsk == broker_state[b].sk - updbsk == [bsk EXCEPT ![s].commit_lsn = safekeeper_state[s].commit_lsn] - IN - [broker_state EXCEPT ![b].sk = updbsk] - ELSE broker_state - /\ UNCHANGED <> - -PsRecvBroker(b,p,s) == - /\ LET - bsk == broker_state[b].sk[s] - psk == pageserver_state[p].sk[s] - updpsk == [psk EXCEPT !["commit_lsn"] = bsk.commit_lsn] - IN - pageserver_state' = IF bsk.commit_lsn > psk.commit_lsn - THEN [pageserver_state EXCEPT ![p].sk[s] = updpsk] - ELSE pageserver_state - /\ UNCHANGED <> - - -SksWithNewerWal(p) == - LET - ps == pageserver_state[p] - IN - {s \in DOMAIN ps.sk: ps.sk[s].commit_lsn > ps.last_record_lsn} - -PsChooseSk(p) == - /\ SksWithNewerWal(p) # {} - /\ pageserver_state' = [pageserver_state EXCEPT![p].preferred_sk = CHOOSE s \in SksWithNewerWal(p): TRUE] - /\ UNCHANGED <> - - -Next == - \/ \E s \in safekeepers: SkCommit(s) - \/ \E s \in safekeepers: \E b \in brokers: SkPushToBroker(s, b) - \/ \E s \in safekeepers: \E b \in brokers: \E p \in pageservers: PsRecvBroker(b,p,s) - \/ \E p \in pageservers: PsChooseSk(p) - - -Spec == Init /\ [][Next]_vars - -==== \ No newline at end of file diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737297534393/MC.cfg b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737297534393/MC.cfg deleted file mode 100644 index 5d0e77461a..0000000000 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737297534393/MC.cfg +++ /dev/null @@ -1,48 +0,0 @@ -\* MV CONSTANT declarations -CONSTANTS -b1 = b1 -b2 = b2 -b3 = b3 -\* MV CONSTANT declarations -CONSTANTS -s1 = s1 -s2 = s2 -s3 = s3 -\* MV CONSTANT declarations -CONSTANTS -p1 = p1 -p2 = p2 -\* MV CONSTANT declarations -CONSTANTS -az1 = az1 -az2 = az2 -az3 = az3 -\* MV CONSTANT definitions -CONSTANT -brokers <- const_1737297530693169000 -\* CONSTANT declarations -CONSTANT NULL = NULL -\* MV CONSTANT definitions -CONSTANT -safekeepers <- const_1737297530694170000 -\* MV CONSTANT definitions -CONSTANT -pageservers <- const_1737297530694171000 -\* MV CONSTANT definitions -CONSTANT -azs <- const_1737297530694172000 -\* SYMMETRY definition -SYMMETRY symm_1737297530694173000 -\* CONSTANT definitions -CONSTANT -max_commit_lsn <- const_1737297530694174000 -\* CONSTANT definitions -CONSTANT -az_mapping <- const_1737297530694175000 -\* CONSTRAINT definition -CONSTRAINT -constr_1737297530694176000 -\* SPECIFICATION definition -SPECIFICATION -Spec -\* Generated on Sun Jan 19 15:38:50 CET 2025 \ No newline at end of file diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737297534393/MC.out b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737297534393/MC.out deleted file mode 100644 index 6ab9f0e5e4..0000000000 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737297534393/MC.out +++ /dev/null @@ -1,35 +0,0 @@ -@!@!@STARTMSG 2262:0 @!@!@ -TLC2 Version 2.19 of 08 August 2024 (rev: 5a47802) -@!@!@ENDMSG 2262 @!@!@ -@!@!@STARTMSG 2187:0 @!@!@ -Running breadth-first search Model-Checking with fp 130 and seed 4267255892797165884 with 4 workers on 8 cores with 2428MB heap and 5460MB offheap memory [pid: 6327] (Mac OS X 10.16 x86_64, AdoptOpenJDK 14.0.1 x86_64, OffHeapDiskFPSet, DiskStateQueue). -@!@!@ENDMSG 2187 @!@!@ -@!@!@STARTMSG 2220:0 @!@!@ -Starting SANY... -@!@!@ENDMSG 2220 @!@!@ -Parsing file /Users/cs/Desktop/broker/fullmesh/fullmesh.toolbox/Model_1/MC.tla -Parsing file /Users/cs/Desktop/broker/fullmesh/fullmesh.toolbox/Model_1/fullmesh.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/TLC.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Integers.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Naturals.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Sequences.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/FiniteSets.tla -Semantic processing of module Naturals -Semantic processing of module Integers -Semantic processing of module fullmesh -Semantic processing of module Sequences -Semantic processing of module FiniteSets -Semantic processing of module TLC -Semantic processing of module MC -@!@!@STARTMSG 2219:0 @!@!@ -SANY finished. -@!@!@ENDMSG 2219 @!@!@ -@!@!@STARTMSG 2185:0 @!@!@ -Starting... (2025-01-19 15:38:51) -@!@!@ENDMSG 2185 @!@!@ -@!@!@STARTMSG 2189:0 @!@!@ -Computing initial states... -@!@!@ENDMSG 2189 @!@!@ -@!@!@STARTMSG 2190:0 @!@!@ -Finished computing initial states: 1 distinct state generated at 2025-01-19 15:38:53. -@!@!@ENDMSG 2190 @!@!@ diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737297534393/MC_TE.out b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737297534393/MC_TE.out deleted file mode 100644 index 6ab9f0e5e4..0000000000 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737297534393/MC_TE.out +++ /dev/null @@ -1,35 +0,0 @@ -@!@!@STARTMSG 2262:0 @!@!@ -TLC2 Version 2.19 of 08 August 2024 (rev: 5a47802) -@!@!@ENDMSG 2262 @!@!@ -@!@!@STARTMSG 2187:0 @!@!@ -Running breadth-first search Model-Checking with fp 130 and seed 4267255892797165884 with 4 workers on 8 cores with 2428MB heap and 5460MB offheap memory [pid: 6327] (Mac OS X 10.16 x86_64, AdoptOpenJDK 14.0.1 x86_64, OffHeapDiskFPSet, DiskStateQueue). -@!@!@ENDMSG 2187 @!@!@ -@!@!@STARTMSG 2220:0 @!@!@ -Starting SANY... -@!@!@ENDMSG 2220 @!@!@ -Parsing file /Users/cs/Desktop/broker/fullmesh/fullmesh.toolbox/Model_1/MC.tla -Parsing file /Users/cs/Desktop/broker/fullmesh/fullmesh.toolbox/Model_1/fullmesh.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/TLC.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Integers.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Naturals.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Sequences.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/FiniteSets.tla -Semantic processing of module Naturals -Semantic processing of module Integers -Semantic processing of module fullmesh -Semantic processing of module Sequences -Semantic processing of module FiniteSets -Semantic processing of module TLC -Semantic processing of module MC -@!@!@STARTMSG 2219:0 @!@!@ -SANY finished. -@!@!@ENDMSG 2219 @!@!@ -@!@!@STARTMSG 2185:0 @!@!@ -Starting... (2025-01-19 15:38:51) -@!@!@ENDMSG 2185 @!@!@ -@!@!@STARTMSG 2189:0 @!@!@ -Computing initial states... -@!@!@ENDMSG 2189 @!@!@ -@!@!@STARTMSG 2190:0 @!@!@ -Finished computing initial states: 1 distinct state generated at 2025-01-19 15:38:53. -@!@!@ENDMSG 2190 @!@!@ diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737297534393/fullmesh.tla b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737297534393/fullmesh.tla deleted file mode 100644 index 9346db0d45..0000000000 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737297534393/fullmesh.tla +++ /dev/null @@ -1,91 +0,0 @@ ----- MODULE fullmesh ---- - -EXTENDS Integers - -VARIABLES broker_state, safekeeper_state, pageserver_state - - -CONSTANT - brokers, - safekeepers, - pageservers, - azs, - az_mapping - -CONSTANT - NULL - -CONSTANT - max_commit_lsn - -StateConstraint == - /\ \A s \in safekeepers: - /\ safekeeper_state[s].commit_lsn <= max_commit_lsn - /\ \A b \in brokers: - /\ \A s \in DOMAIN broker_state[b].sk: - /\ broker_state[b].sk[s].commit_lsn <= max_commit_lsn - - -InitSafekeeper == [pruned_lsn |-> 0, commit_lsn |-> 0] -InitBroker == [sk |-> [s \in safekeepers |-> [commit_lsn |-> 0]]] -InitPageserver == [last_record_lsn |-> 0, preferred_sk |-> NULL, sk |-> [s \in safekeepers |-> [commit_lsn |-> 0]]] - -Init == - /\ broker_state = [b \in brokers |-> InitBroker] - /\ safekeeper_state = [s \in safekeepers |-> InitSafekeeper] - /\ pageserver_state = [p \in pageservers |-> InitPageserver] - -SkCommit(s) == - /\ safekeeper_state' = [safekeeper_state EXCEPT ![s].commit_lsn = safekeeper_state[s].commit_lsn + 1] - /\ UNCHANGED <> - -SkPushToBroker(s,b) == - /\ broker_state' = IF broker_state[b].sk[s].commit_lsn < safekeeper_state[s].commit_lsn - THEN - LET - bsk == broker_state[b].sk - updbsk == [bsk EXCEPT ![s].commit_lsn = safekeeper_state[s].commit_lsn] - IN - [broker_state EXCEPT ![b].sk = updbsk] - ELSE broker_state - /\ UNCHANGED <> - -PsRecvBroker(b,p,s) == - /\ LET - bsk == broker_state[b].sk[s] - psk == pageserver_state[p].sk[s] - updpsk == [psk EXCEPT !["commit_lsn"] = bsk.commit_lsn] - IN - pageserver_state' = IF bsk.commit_lsn > psk.commit_lsn - THEN [pageserver_state EXCEPT ![p].sk[s] = updpsk] - ELSE pageserver_state - /\ UNCHANGED <> - - -SksWithNewerWal(p) == - LET - ps == pageserver_state[p] - IN - {s \in DOMAIN ps.sk: ps.sk[s].commit_lsn > ps.last_record_lsn} - -PsChooseSk(p) == - /\ SksWithNewerWal(p) # {} - /\ pageserver_state' = [pageserver_state EXCEPT![p].preferred_sk = CHOOSE s \in SksWithNewerWal(p): TRUE] - /\ UNCHANGED <> - - -Next == - \/ \E s \in safekeepers: SkCommit(s) - \/ \E s \in safekeepers: \E b \in brokers: SkPushToBroker(s, b) - \/ \E s \in safekeepers: \E b \in brokers: \E p \in pageservers: PsRecvBroker(b,p,s) - \/ \E p \in pageservers: PsChooseSk(p) - - -Spec == Init /\ [][Next]_<< broker_state, safekeeper_state, pageserver_state >> - - -\* invariants - - - -==== \ No newline at end of file diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737297999722/MC.cfg b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737297999722/MC.cfg deleted file mode 100644 index 317368faaf..0000000000 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737297999722/MC.cfg +++ /dev/null @@ -1,48 +0,0 @@ -\* MV CONSTANT declarations -CONSTANTS -b1 = b1 -b2 = b2 -b3 = b3 -\* MV CONSTANT declarations -CONSTANTS -s1 = s1 -s2 = s2 -s3 = s3 -\* MV CONSTANT declarations -CONSTANTS -p1 = p1 -p2 = p2 -\* MV CONSTANT declarations -CONSTANTS -az1 = az1 -az2 = az2 -az3 = az3 -\* MV CONSTANT definitions -CONSTANT -brokers <- const_1737297992949177000 -\* CONSTANT declarations -CONSTANT NULL = NULL -\* MV CONSTANT definitions -CONSTANT -safekeepers <- const_1737297992949178000 -\* MV CONSTANT definitions -CONSTANT -pageservers <- const_1737297992949179000 -\* MV CONSTANT definitions -CONSTANT -azs <- const_1737297992949180000 -\* SYMMETRY definition -SYMMETRY symm_1737297992949181000 -\* CONSTANT definitions -CONSTANT -max_commit_lsn <- const_1737297992949182000 -\* CONSTANT definitions -CONSTANT -az_mapping <- const_1737297992949183000 -\* CONSTRAINT definition -CONSTRAINT -constr_1737297992949184000 -\* SPECIFICATION definition -SPECIFICATION -Spec -\* Generated on Sun Jan 19 15:46:32 CET 2025 \ No newline at end of file diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737297999722/MC.out b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737297999722/MC.out deleted file mode 100644 index be1df74b07..0000000000 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737297999722/MC.out +++ /dev/null @@ -1,38 +0,0 @@ -@!@!@STARTMSG 2262:0 @!@!@ -TLC2 Version 2.19 of 08 August 2024 (rev: 5a47802) -@!@!@ENDMSG 2262 @!@!@ -@!@!@STARTMSG 2187:0 @!@!@ -Running breadth-first search Model-Checking with fp 0 and seed -5924036830053169413 with 4 workers on 8 cores with 2428MB heap and 5460MB offheap memory [pid: 6690] (Mac OS X 10.16 x86_64, AdoptOpenJDK 14.0.1 x86_64, OffHeapDiskFPSet, DiskStateQueue). -@!@!@ENDMSG 2187 @!@!@ -@!@!@STARTMSG 2220:0 @!@!@ -Starting SANY... -@!@!@ENDMSG 2220 @!@!@ -Parsing file /Users/cs/Desktop/broker/fullmesh/fullmesh.toolbox/Model_1/MC.tla -Parsing file /Users/cs/Desktop/broker/fullmesh/fullmesh.toolbox/Model_1/fullmesh.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/TLC.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Integers.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Naturals.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Sequences.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/FiniteSets.tla -Semantic processing of module Naturals -Semantic processing of module Integers -Semantic processing of module fullmesh -Semantic processing of module Sequences -Semantic processing of module FiniteSets -Semantic processing of module TLC -Semantic processing of module MC -@!@!@STARTMSG 2219:0 @!@!@ -SANY finished. -@!@!@ENDMSG 2219 @!@!@ -@!@!@STARTMSG 2185:0 @!@!@ -Starting... (2025-01-19 15:46:33) -@!@!@ENDMSG 2185 @!@!@ -@!@!@STARTMSG 2189:0 @!@!@ -Computing initial states... -@!@!@ENDMSG 2189 @!@!@ -@!@!@STARTMSG 2190:0 @!@!@ -Finished computing initial states: 1 distinct state generated at 2025-01-19 15:46:35. -@!@!@ENDMSG 2190 @!@!@ -@!@!@STARTMSG 2200:0 @!@!@ -Progress(10) at 2025-01-19 15:46:38: 41.300 states generated (41.300 s/min), 3.445 distinct states found (3.445 ds/min), 2.202 states left on queue. -@!@!@ENDMSG 2200 @!@!@ diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737297999722/MC.tla b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737297999722/MC.tla deleted file mode 100644 index ee8e18c7a3..0000000000 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737297999722/MC.tla +++ /dev/null @@ -1,65 +0,0 @@ ----- MODULE MC ---- -EXTENDS fullmesh, TLC - -\* MV CONSTANT declarations@modelParameterConstants -CONSTANTS -b1, b2, b3 ----- - -\* MV CONSTANT declarations@modelParameterConstants -CONSTANTS -s1, s2, s3 ----- - -\* MV CONSTANT declarations@modelParameterConstants -CONSTANTS -p1, p2 ----- - -\* MV CONSTANT declarations@modelParameterConstants -CONSTANTS -az1, az2, az3 ----- - -\* MV CONSTANT definitions brokers -const_1737297992949177000 == -{b1, b2, b3} ----- - -\* MV CONSTANT definitions safekeepers -const_1737297992949178000 == -{s1, s2, s3} ----- - -\* MV CONSTANT definitions pageservers -const_1737297992949179000 == -{p1, p2} ----- - -\* MV CONSTANT definitions azs -const_1737297992949180000 == -{az1, az2, az3} ----- - -\* SYMMETRY definition -symm_1737297992949181000 == -Permutations(const_1737297992949177000) \union Permutations(const_1737297992949178000) \union Permutations(const_1737297992949179000) \union Permutations(const_1737297992949180000) ----- - -\* CONSTANT definitions @modelParameterConstants:4max_commit_lsn -const_1737297992949182000 == -2 ----- - -\* CONSTANT definitions @modelParameterConstants:5az_mapping -const_1737297992949183000 == -[ az1 |-> {b1,s1,p1} , az2 |-> {b2,s2,p2} , az3 |-> {b3,s3}] ----- - -\* CONSTRAINT definition @modelParameterContraint:0 -constr_1737297992949184000 == -StateConstraint ----- -============================================================================= -\* Modification History -\* Created Sun Jan 19 15:46:32 CET 2025 by cs diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737297999722/MC_TE.out b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737297999722/MC_TE.out deleted file mode 100644 index be1df74b07..0000000000 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737297999722/MC_TE.out +++ /dev/null @@ -1,38 +0,0 @@ -@!@!@STARTMSG 2262:0 @!@!@ -TLC2 Version 2.19 of 08 August 2024 (rev: 5a47802) -@!@!@ENDMSG 2262 @!@!@ -@!@!@STARTMSG 2187:0 @!@!@ -Running breadth-first search Model-Checking with fp 0 and seed -5924036830053169413 with 4 workers on 8 cores with 2428MB heap and 5460MB offheap memory [pid: 6690] (Mac OS X 10.16 x86_64, AdoptOpenJDK 14.0.1 x86_64, OffHeapDiskFPSet, DiskStateQueue). -@!@!@ENDMSG 2187 @!@!@ -@!@!@STARTMSG 2220:0 @!@!@ -Starting SANY... -@!@!@ENDMSG 2220 @!@!@ -Parsing file /Users/cs/Desktop/broker/fullmesh/fullmesh.toolbox/Model_1/MC.tla -Parsing file /Users/cs/Desktop/broker/fullmesh/fullmesh.toolbox/Model_1/fullmesh.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/TLC.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Integers.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Naturals.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Sequences.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/FiniteSets.tla -Semantic processing of module Naturals -Semantic processing of module Integers -Semantic processing of module fullmesh -Semantic processing of module Sequences -Semantic processing of module FiniteSets -Semantic processing of module TLC -Semantic processing of module MC -@!@!@STARTMSG 2219:0 @!@!@ -SANY finished. -@!@!@ENDMSG 2219 @!@!@ -@!@!@STARTMSG 2185:0 @!@!@ -Starting... (2025-01-19 15:46:33) -@!@!@ENDMSG 2185 @!@!@ -@!@!@STARTMSG 2189:0 @!@!@ -Computing initial states... -@!@!@ENDMSG 2189 @!@!@ -@!@!@STARTMSG 2190:0 @!@!@ -Finished computing initial states: 1 distinct state generated at 2025-01-19 15:46:35. -@!@!@ENDMSG 2190 @!@!@ -@!@!@STARTMSG 2200:0 @!@!@ -Progress(10) at 2025-01-19 15:46:38: 41.300 states generated (41.300 s/min), 3.445 distinct states found (3.445 ds/min), 2.202 states left on queue. -@!@!@ENDMSG 2200 @!@!@ diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737297999722/fullmesh.tla b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737297999722/fullmesh.tla deleted file mode 100644 index b752cd48e2..0000000000 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737297999722/fullmesh.tla +++ /dev/null @@ -1,97 +0,0 @@ ----- MODULE fullmesh ---- - -EXTENDS Integers - -VARIABLES broker_state, safekeeper_state, pageserver_state - - -CONSTANT - brokers, - safekeepers, - pageservers, - azs, - az_mapping - -CONSTANT - NULL - -CONSTANT - max_commit_lsn - -StateConstraint == - /\ \A s \in safekeepers: - /\ safekeeper_state[s].commit_lsn <= max_commit_lsn - /\ \A b \in brokers: - /\ \A s \in DOMAIN broker_state[b].sk: - /\ broker_state[b].sk[s].commit_lsn <= max_commit_lsn - - -InitSafekeeper == [pruned_lsn |-> 0, commit_lsn |-> 0] -InitBroker == [sk |-> [s \in safekeepers |-> [commit_lsn |-> 0]]] -InitPageserver == [last_record_lsn |-> 0, preferred_sk |-> NULL, sk |-> [s \in safekeepers |-> [commit_lsn |-> 0]]] - -Init == - /\ broker_state = [b \in brokers |-> InitBroker] - /\ safekeeper_state = [s \in safekeepers |-> InitSafekeeper] - /\ pageserver_state = [p \in pageservers |-> InitPageserver] - -SkCommit(s1, s2) == - /\ safekeeper_state[s1].commit_lsn = safekeeper_state[s2].commit_lsn - /\ LET - new_commit_lsn == safekeeper_state[s1].commit_lsn + 1 - IN - safekeeper_state' = [safekeeper_state EXCEPT - ![s1].commit_lsn = new_commit_lsn, - ![s2].commit_lsn = new_commit_lsn] - /\ UNCHANGED <> - -SkPushToBroker(s,b) == - /\ broker_state' = IF broker_state[b].sk[s].commit_lsn < safekeeper_state[s].commit_lsn - THEN - LET - bsk == broker_state[b].sk - updbsk == [bsk EXCEPT ![s].commit_lsn = safekeeper_state[s].commit_lsn] - IN - [broker_state EXCEPT ![b].sk = updbsk] - ELSE broker_state - /\ UNCHANGED <> - -PsRecvBroker(b,p,s) == - /\ LET - bsk == broker_state[b].sk[s] - psk == pageserver_state[p].sk[s] - updpsk == [psk EXCEPT !["commit_lsn"] = bsk.commit_lsn] - IN - pageserver_state' = IF bsk.commit_lsn > psk.commit_lsn - THEN [pageserver_state EXCEPT ![p].sk[s] = updpsk] - ELSE pageserver_state - /\ UNCHANGED <> - - -SksWithNewerWal(p) == - LET - ps == pageserver_state[p] - IN - {s \in DOMAIN ps.sk: ps.sk[s].commit_lsn > ps.last_record_lsn} - -PsChooseSk(p) == - /\ SksWithNewerWal(p) # {} - /\ pageserver_state' = [pageserver_state EXCEPT![p].preferred_sk = CHOOSE s \in SksWithNewerWal(p): TRUE] - /\ UNCHANGED <> - - -Next == - \/ \E s1 \in safekeepers: \E s2 \in safekeepers: SkCommit(s1, s2) - \/ \E s \in safekeepers: \E b \in brokers: SkPushToBroker(s, b) - \/ \E s \in safekeepers: \E b \in brokers: \E p \in pageservers: PsRecvBroker(b,p,s) - \/ \E p \in pageservers: PsChooseSk(p) - - -Spec == Init /\ [][Next]_<< broker_state, safekeeper_state, pageserver_state >> - - -\* invariants - - - -==== \ No newline at end of file diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299352762/fullmesh.tla b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299352762/fullmesh.tla deleted file mode 100644 index a6c5e2ea3f..0000000000 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299352762/fullmesh.tla +++ /dev/null @@ -1,115 +0,0 @@ ----- MODULE fullmesh ---- - -EXTENDS Integers - -VARIABLES broker_state, safekeeper_state, pageserver_state - - -CONSTANT - brokers, - safekeepers, - pageservers, - azs, - az_mapping - -CONSTANT - NULL - -CONSTANT - max_commit_lsn - -StateConstraint == - /\ \A s \in safekeepers: - /\ safekeeper_state[s].commit_lsn <= max_commit_lsn - /\ \A b \in brokers: - /\ \A s \in DOMAIN broker_state[b].sk: - /\ broker_state[b].sk[s].commit_lsn <= max_commit_lsn - - -InitSafekeeper == [pruned_lsn |-> 0, commit_lsn |-> 0] -InitBroker == [sk |-> [s \in safekeepers |-> [commit_lsn |-> 0]]] -InitPageserver == [last_record_lsn |-> 0, preferred_sk |-> NULL, sk |-> [s \in safekeepers |-> [commit_lsn |-> 0]]] - -Init == - /\ broker_state = [b \in brokers |-> InitBroker] - /\ safekeeper_state = [s \in safekeepers |-> InitSafekeeper] - /\ pageserver_state = [p \in pageservers |-> InitPageserver] - - -SkCommit(s1, s2) == - /\ safekeeper_state[s1].commit_lsn = safekeeper_state[s2].commit_lsn - /\ LET - new_commit_lsn == safekeeper_state[s1].commit_lsn + 1 - IN - safekeeper_state' = [safekeeper_state EXCEPT - ![s1].commit_lsn = new_commit_lsn, - ![s2].commit_lsn = new_commit_lsn] - /\ UNCHANGED <> - -SkPeerRecovery(s1,s2) == - /\ safekeeper_state[s1].commit_lsn < safekeeper_state[s2].commit_lsn - /\ safekeeper_state' = [safekeeper_state EXCEPT![s1].commit_lsn = safekeeper_state[s2].commit_lsn] - -SkPushToBroker(s,b) == - /\ broker_state' = IF broker_state[b].sk[s].commit_lsn < safekeeper_state[s].commit_lsn - THEN - LET - bsk == broker_state[b].sk - updbsk == [bsk EXCEPT ![s].commit_lsn = safekeeper_state[s].commit_lsn] - IN - [broker_state EXCEPT ![b].sk = updbsk] - ELSE broker_state - /\ UNCHANGED <> - -PsRecvBroker(b,p,s) == - /\ LET - bsk == broker_state[b].sk[s] - psk == pageserver_state[p].sk[s] - updpsk == [psk EXCEPT !["commit_lsn"] = bsk.commit_lsn] - IN - pageserver_state' = IF bsk.commit_lsn > psk.commit_lsn - THEN [pageserver_state EXCEPT ![p].sk[s] = updpsk] - ELSE pageserver_state - /\ UNCHANGED <> - - -SksWithNewerWal(p) == - LET - ps == pageserver_state[p] - IN - {s \in DOMAIN ps.sk: ps.sk[s].commit_lsn > ps.last_record_lsn} - -PsChooseSk(p) == - /\ SksWithNewerWal(p) # {} - /\ pageserver_state' = [pageserver_state EXCEPT![p].preferred_sk = CHOOSE s \in SksWithNewerWal(p): TRUE] - /\ UNCHANGED <> - - -Next == - - \/ \E s1 \in safekeepers: \E s2 \in safekeepers: - \/ SkCommit(s1, s2) - \/ SkPeerRecovery(s1, s2) - \/ \E s \in safekeepers: \E b \in brokers: SkPushToBroker(s, b) - \/ \E s \in safekeepers: \E b \in brokers: \E p \in pageservers: PsRecvBroker(b,p,s) - \/ \E p \in pageservers: PsChooseSk(p) - - -Spec == Init /\ [][Next]_<< broker_state, safekeeper_state, pageserver_state >> - - -\* invariants - -EventuallyLaggingSkIsNotPreferredSk == <>( - LET - sks == safekeeper_state - lagging_sks == { s \in safekeepers: \A s2 \in safekeepers: sks[s].commit_lsn <= sks[s2].commit_lsn } - preferred_sks == {pageserver_state[p].preferred_sk: p \in pageservers} - IN - preferred_sks \cap lagging_sks = {} - - ) - - - -==== \ No newline at end of file diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299381423/MC.tla b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299381423/MC.tla deleted file mode 100644 index 9df26a2fc9..0000000000 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299381423/MC.tla +++ /dev/null @@ -1,65 +0,0 @@ ----- MODULE MC ---- -EXTENDS fullmesh, TLC - -\* MV CONSTANT declarations@modelParameterConstants -CONSTANTS -b1, b2, b3 ----- - -\* MV CONSTANT declarations@modelParameterConstants -CONSTANTS -s1, s2, s3 ----- - -\* MV CONSTANT declarations@modelParameterConstants -CONSTANTS -p1, p2 ----- - -\* MV CONSTANT declarations@modelParameterConstants -CONSTANTS -az1, az2, az3 ----- - -\* MV CONSTANT definitions brokers -const_1737299377376212000 == -{b1, b2, b3} ----- - -\* MV CONSTANT definitions safekeepers -const_1737299377376213000 == -{s1, s2, s3} ----- - -\* MV CONSTANT definitions pageservers -const_1737299377376214000 == -{p1, p2} ----- - -\* MV CONSTANT definitions azs -const_1737299377376215000 == -{az1, az2, az3} ----- - -\* SYMMETRY definition -symm_1737299377376216000 == -Permutations(const_1737299377376212000) \union Permutations(const_1737299377376213000) \union Permutations(const_1737299377376214000) \union Permutations(const_1737299377376215000) ----- - -\* CONSTANT definitions @modelParameterConstants:4max_commit_lsn -const_1737299377376217000 == -2 ----- - -\* CONSTANT definitions @modelParameterConstants:5az_mapping -const_1737299377376218000 == -[ az1 |-> {b1,s1,p1} , az2 |-> {b2,s2,p2} , az3 |-> {b3,s3}] ----- - -\* CONSTRAINT definition @modelParameterContraint:0 -constr_1737299377376219000 == -StateConstraint ----- -============================================================================= -\* Modification History -\* Created Sun Jan 19 16:09:37 CET 2025 by cs diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299381423/fullmesh.tla b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299381423/fullmesh.tla deleted file mode 100644 index a6c5e2ea3f..0000000000 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299381423/fullmesh.tla +++ /dev/null @@ -1,115 +0,0 @@ ----- MODULE fullmesh ---- - -EXTENDS Integers - -VARIABLES broker_state, safekeeper_state, pageserver_state - - -CONSTANT - brokers, - safekeepers, - pageservers, - azs, - az_mapping - -CONSTANT - NULL - -CONSTANT - max_commit_lsn - -StateConstraint == - /\ \A s \in safekeepers: - /\ safekeeper_state[s].commit_lsn <= max_commit_lsn - /\ \A b \in brokers: - /\ \A s \in DOMAIN broker_state[b].sk: - /\ broker_state[b].sk[s].commit_lsn <= max_commit_lsn - - -InitSafekeeper == [pruned_lsn |-> 0, commit_lsn |-> 0] -InitBroker == [sk |-> [s \in safekeepers |-> [commit_lsn |-> 0]]] -InitPageserver == [last_record_lsn |-> 0, preferred_sk |-> NULL, sk |-> [s \in safekeepers |-> [commit_lsn |-> 0]]] - -Init == - /\ broker_state = [b \in brokers |-> InitBroker] - /\ safekeeper_state = [s \in safekeepers |-> InitSafekeeper] - /\ pageserver_state = [p \in pageservers |-> InitPageserver] - - -SkCommit(s1, s2) == - /\ safekeeper_state[s1].commit_lsn = safekeeper_state[s2].commit_lsn - /\ LET - new_commit_lsn == safekeeper_state[s1].commit_lsn + 1 - IN - safekeeper_state' = [safekeeper_state EXCEPT - ![s1].commit_lsn = new_commit_lsn, - ![s2].commit_lsn = new_commit_lsn] - /\ UNCHANGED <> - -SkPeerRecovery(s1,s2) == - /\ safekeeper_state[s1].commit_lsn < safekeeper_state[s2].commit_lsn - /\ safekeeper_state' = [safekeeper_state EXCEPT![s1].commit_lsn = safekeeper_state[s2].commit_lsn] - -SkPushToBroker(s,b) == - /\ broker_state' = IF broker_state[b].sk[s].commit_lsn < safekeeper_state[s].commit_lsn - THEN - LET - bsk == broker_state[b].sk - updbsk == [bsk EXCEPT ![s].commit_lsn = safekeeper_state[s].commit_lsn] - IN - [broker_state EXCEPT ![b].sk = updbsk] - ELSE broker_state - /\ UNCHANGED <> - -PsRecvBroker(b,p,s) == - /\ LET - bsk == broker_state[b].sk[s] - psk == pageserver_state[p].sk[s] - updpsk == [psk EXCEPT !["commit_lsn"] = bsk.commit_lsn] - IN - pageserver_state' = IF bsk.commit_lsn > psk.commit_lsn - THEN [pageserver_state EXCEPT ![p].sk[s] = updpsk] - ELSE pageserver_state - /\ UNCHANGED <> - - -SksWithNewerWal(p) == - LET - ps == pageserver_state[p] - IN - {s \in DOMAIN ps.sk: ps.sk[s].commit_lsn > ps.last_record_lsn} - -PsChooseSk(p) == - /\ SksWithNewerWal(p) # {} - /\ pageserver_state' = [pageserver_state EXCEPT![p].preferred_sk = CHOOSE s \in SksWithNewerWal(p): TRUE] - /\ UNCHANGED <> - - -Next == - - \/ \E s1 \in safekeepers: \E s2 \in safekeepers: - \/ SkCommit(s1, s2) - \/ SkPeerRecovery(s1, s2) - \/ \E s \in safekeepers: \E b \in brokers: SkPushToBroker(s, b) - \/ \E s \in safekeepers: \E b \in brokers: \E p \in pageservers: PsRecvBroker(b,p,s) - \/ \E p \in pageservers: PsChooseSk(p) - - -Spec == Init /\ [][Next]_<< broker_state, safekeeper_state, pageserver_state >> - - -\* invariants - -EventuallyLaggingSkIsNotPreferredSk == <>( - LET - sks == safekeeper_state - lagging_sks == { s \in safekeepers: \A s2 \in safekeepers: sks[s].commit_lsn <= sks[s2].commit_lsn } - preferred_sks == {pageserver_state[p].preferred_sk: p \in pageservers} - IN - preferred_sks \cap lagging_sks = {} - - ) - - - -==== \ No newline at end of file diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299469039/MC.out b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299469039/MC.out deleted file mode 100644 index 3299ac8cfa..0000000000 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299469039/MC.out +++ /dev/null @@ -1,202 +0,0 @@ -@!@!@STARTMSG 2262:0 @!@!@ -TLC2 Version 2.19 of 08 August 2024 (rev: 5a47802) -@!@!@ENDMSG 2262 @!@!@ -@!@!@STARTMSG 2187:0 @!@!@ -Running breadth-first search Model-Checking with fp 105 and seed 4277674636266930199 with 4 workers on 8 cores with 2428MB heap and 5460MB offheap memory [pid: 7749] (Mac OS X 10.16 x86_64, AdoptOpenJDK 14.0.1 x86_64, OffHeapDiskFPSet, DiskStateQueue). -@!@!@ENDMSG 2187 @!@!@ -@!@!@STARTMSG 2220:0 @!@!@ -Starting SANY... -@!@!@ENDMSG 2220 @!@!@ -Parsing file /Users/cs/Desktop/broker/fullmesh/fullmesh.toolbox/Model_1/MC.tla -Parsing file /Users/cs/Desktop/broker/fullmesh/fullmesh.toolbox/Model_1/fullmesh.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/TLC.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Integers.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Naturals.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Sequences.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/FiniteSets.tla -Semantic processing of module Naturals -Semantic processing of module Integers -Semantic processing of module fullmesh -Semantic processing of module Sequences -Semantic processing of module FiniteSets -Semantic processing of module TLC -Semantic processing of module MC -@!@!@STARTMSG 2219:0 @!@!@ -SANY finished. -@!@!@ENDMSG 2219 @!@!@ -@!@!@STARTMSG 2185:0 @!@!@ -Starting... (2025-01-19 16:11:06) -@!@!@ENDMSG 2185 @!@!@ -@!@!@STARTMSG 2279:3 @!@!@ -Declaring symmetry during liveness checking is dangerous. It might cause TLC to miss violations of the stated liveness properties. Please check liveness without symmetry defined. -@!@!@ENDMSG 2279 @!@!@ -@!@!@STARTMSG 2284:3 @!@!@ -Declaring state or action constraints during liveness checking is dangerous: Please read section 14.3.5 on page 247 of Specifying Systems (https://lamport.azurewebsites.net/tla/book.html) and optionally the discussion at https://discuss.tlapl.us/msg00994.html for more details. -@!@!@ENDMSG 2284 @!@!@ -@!@!@STARTMSG 2212:0 @!@!@ -Implied-temporal checking--satisfiability problem has 1 branches. -@!@!@ENDMSG 2212 @!@!@ -@!@!@STARTMSG 2189:0 @!@!@ -Computing initial states... -@!@!@ENDMSG 2189 @!@!@ -@!@!@STARTMSG 2190:0 @!@!@ -Finished computing initial states: 1 distinct state generated at 2025-01-19 16:11:07. -@!@!@ENDMSG 2190 @!@!@ -@!@!@STARTMSG 2109:1 @!@!@ -Successor state is not completely specified by action SkPeerRecovery of the next-state relation. The following variables are not assigned: broker_state, pageserver_state. - -@!@!@ENDMSG 2109 @!@!@ -@!@!@STARTMSG 2121:1 @!@!@ -The behavior up to this point is: -@!@!@ENDMSG 2121 @!@!@ -@!@!@STARTMSG 2217:4 @!@!@ -1: -/\ pageserver_state = (p1 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0]), last_record_lsn |-> 0, preferred_sk |-> NULL] @@ p2 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0]), last_record_lsn |-> 0, preferred_sk |-> NULL]) -/\ broker_state = (b1 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])] @@ b2 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])] @@ b3 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])]) -/\ safekeeper_state = (s1 :> [commit_lsn |-> 0, pruned_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0, pruned_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0, pruned_lsn |-> 0]) - -@!@!@ENDMSG 2217 @!@!@ -@!@!@STARTMSG 2217:4 @!@!@ -2: -/\ pageserver_state = (p1 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0]), last_record_lsn |-> 0, preferred_sk |-> NULL] @@ p2 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0]), last_record_lsn |-> 0, preferred_sk |-> NULL]) -/\ broker_state = (b1 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])] @@ b2 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])] @@ b3 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])]) -/\ safekeeper_state = (s1 :> [commit_lsn |-> 1, pruned_lsn |-> 0] @@ s2 :> [commit_lsn |-> 1, pruned_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0, pruned_lsn |-> 0]) - -@!@!@ENDMSG 2217 @!@!@ -@!@!@STARTMSG 2217:4 @!@!@ -3: -/\ pageserver_state = (p1 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0]), last_record_lsn |-> 0, preferred_sk |-> NULL] @@ p2 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0]), last_record_lsn |-> 0, preferred_sk |-> NULL]) -/\ broker_state = (b1 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])] @@ b2 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])] @@ b3 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])]) -/\ safekeeper_state = (s1 :> [commit_lsn |-> 2, pruned_lsn |-> 0] @@ s2 :> [commit_lsn |-> 2, pruned_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0, pruned_lsn |-> 0]) - -@!@!@ENDMSG 2217 @!@!@ -@!@!@STARTMSG 2217:4 @!@!@ -4: -/\ pageserver_state = null -/\ broker_state = null -/\ safekeeper_state = (s1 :> [commit_lsn |-> 2, pruned_lsn |-> 0] @@ s2 :> [commit_lsn |-> 2, pruned_lsn |-> 0] @@ s3 :> [commit_lsn |-> 2, pruned_lsn |-> 0]) - -@!@!@ENDMSG 2217 @!@!@ -@!@!@STARTMSG 2201:0 @!@!@ -The coverage statistics at 2025-01-19 16:11:07 -@!@!@ENDMSG 2201 @!@!@ -@!@!@STARTMSG 2773:0 @!@!@ -: 2:2 -@!@!@ENDMSG 2773 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 34, col 5 to line 36, col 64 of module fullmesh: 2 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2772:0 @!@!@ -: 2:14 -@!@!@ENDMSG 2772 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 40, col 8 to line 40, col 14 of module fullmesh: 48 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |line 40, col 8 to line 40, col 9 of module fullmesh: 34 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |line 40, col 13 to line 40, col 14 of module fullmesh: 34 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 41, col 8 to line 41, col 72 of module fullmesh: 37 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |line 41, col 8 to line 41, col 38 of module fullmesh: 23 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |line 41, col 42 to line 41, col 72 of module fullmesh: 23 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 45, col 13 to line 47, col 50 of module fullmesh: 14 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 48, col 8 to line 48, col 51 of module fullmesh: 14 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2772:0 @!@!@ -: 0:3 -@!@!@ENDMSG 2772 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 51, col 8 to line 51, col 72 of module fullmesh: 1 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |line 51, col 8 to line 51, col 38 of module fullmesh: 32 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |line 51, col 42 to line 51, col 72 of module fullmesh: 32 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 52, col 8 to line 52, col 102 of module fullmesh: 1 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |line 52, col 28 to line 52, col 102 of module fullmesh: 3 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2772:0 @!@!@ -: 0:9 -@!@!@ENDMSG 2772 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 55, col 8 to line 62, col 29 of module fullmesh: 9 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 63, col 8 to line 63, col 55 of module fullmesh: 9 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2772:0 @!@!@ -: 0:18 -@!@!@ENDMSG 2772 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 71, col 13 to line 73, col 37 of module fullmesh: 18 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 74, col 8 to line 74, col 51 of module fullmesh: 18 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2772:0 @!@!@ -: 0:0 -@!@!@ENDMSG 2772 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 84, col 8 to line 84, col 30 of module fullmesh: 2 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |line 84, col 8 to line 84, col 25 of module fullmesh: 2 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||line 79, col 15 to line 79, col 33 of module fullmesh: 2 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||line 81, col 5 to line 81, col 66 of module fullmesh: 2 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||line 81, col 26 to line 81, col 65 of module fullmesh: 6 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||line 81, col 12 to line 81, col 23 of module fullmesh: 2 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||line 84, col 24 to line 84, col 24 of module fullmesh: 2 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |line 84, col 29 to line 84, col 30 of module fullmesh: 2 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 85, col 8 to line 85, col 109 of module fullmesh: 0 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 86, col 8 to line 86, col 51 of module fullmesh: 0 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2202:0 @!@!@ -End of statistics. -@!@!@ENDMSG 2202 @!@!@ -@!@!@STARTMSG 2200:0 @!@!@ -Progress(3) at 2025-01-19 16:11:07: 40 states generated (992 s/min), 3 distinct states found (74 ds/min), 0 states left on queue. -@!@!@ENDMSG 2200 @!@!@ -@!@!@STARTMSG 2199:0 @!@!@ -40 states generated, 3 distinct states found, 0 states left on queue. -@!@!@ENDMSG 2199 @!@!@ -@!@!@STARTMSG 2194:0 @!@!@ -The depth of the complete state graph search is 3. -@!@!@ENDMSG 2194 @!@!@ -@!@!@STARTMSG 2268:0 @!@!@ -The average outdegree of the complete state graph is 1 (minimum is 1, the maximum 1 and the 95th percentile is 1). -@!@!@ENDMSG 2268 @!@!@ -@!@!@STARTMSG 2186:0 @!@!@ -Finished in 2440ms at (2025-01-19 16:11:07) -@!@!@ENDMSG 2186 @!@!@ diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299469039/MC.tla b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299469039/MC.tla deleted file mode 100644 index eceb21dd0b..0000000000 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299469039/MC.tla +++ /dev/null @@ -1,65 +0,0 @@ ----- MODULE MC ---- -EXTENDS fullmesh, TLC - -\* MV CONSTANT declarations@modelParameterConstants -CONSTANTS -b1, b2, b3 ----- - -\* MV CONSTANT declarations@modelParameterConstants -CONSTANTS -s1, s2, s3 ----- - -\* MV CONSTANT declarations@modelParameterConstants -CONSTANTS -p1, p2 ----- - -\* MV CONSTANT declarations@modelParameterConstants -CONSTANTS -az1, az2, az3 ----- - -\* MV CONSTANT definitions brokers -const_1737299464992221000 == -{b1, b2, b3} ----- - -\* MV CONSTANT definitions safekeepers -const_1737299464992222000 == -{s1, s2, s3} ----- - -\* MV CONSTANT definitions pageservers -const_1737299464992223000 == -{p1, p2} ----- - -\* MV CONSTANT definitions azs -const_1737299464992224000 == -{az1, az2, az3} ----- - -\* SYMMETRY definition -symm_1737299464992225000 == -Permutations(const_1737299464992221000) \union Permutations(const_1737299464992222000) \union Permutations(const_1737299464992223000) \union Permutations(const_1737299464992224000) ----- - -\* CONSTANT definitions @modelParameterConstants:4max_commit_lsn -const_1737299464992226000 == -2 ----- - -\* CONSTANT definitions @modelParameterConstants:5az_mapping -const_1737299464992227000 == -[ az1 |-> {b1,s1,p1} , az2 |-> {b2,s2,p2} , az3 |-> {b3,s3}] ----- - -\* CONSTRAINT definition @modelParameterContraint:0 -constr_1737299464992228000 == -StateConstraint ----- -============================================================================= -\* Modification History -\* Created Sun Jan 19 16:11:04 CET 2025 by cs diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299469039/MC_TE.out b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299469039/MC_TE.out deleted file mode 100644 index 3299ac8cfa..0000000000 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299469039/MC_TE.out +++ /dev/null @@ -1,202 +0,0 @@ -@!@!@STARTMSG 2262:0 @!@!@ -TLC2 Version 2.19 of 08 August 2024 (rev: 5a47802) -@!@!@ENDMSG 2262 @!@!@ -@!@!@STARTMSG 2187:0 @!@!@ -Running breadth-first search Model-Checking with fp 105 and seed 4277674636266930199 with 4 workers on 8 cores with 2428MB heap and 5460MB offheap memory [pid: 7749] (Mac OS X 10.16 x86_64, AdoptOpenJDK 14.0.1 x86_64, OffHeapDiskFPSet, DiskStateQueue). -@!@!@ENDMSG 2187 @!@!@ -@!@!@STARTMSG 2220:0 @!@!@ -Starting SANY... -@!@!@ENDMSG 2220 @!@!@ -Parsing file /Users/cs/Desktop/broker/fullmesh/fullmesh.toolbox/Model_1/MC.tla -Parsing file /Users/cs/Desktop/broker/fullmesh/fullmesh.toolbox/Model_1/fullmesh.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/TLC.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Integers.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Naturals.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Sequences.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/FiniteSets.tla -Semantic processing of module Naturals -Semantic processing of module Integers -Semantic processing of module fullmesh -Semantic processing of module Sequences -Semantic processing of module FiniteSets -Semantic processing of module TLC -Semantic processing of module MC -@!@!@STARTMSG 2219:0 @!@!@ -SANY finished. -@!@!@ENDMSG 2219 @!@!@ -@!@!@STARTMSG 2185:0 @!@!@ -Starting... (2025-01-19 16:11:06) -@!@!@ENDMSG 2185 @!@!@ -@!@!@STARTMSG 2279:3 @!@!@ -Declaring symmetry during liveness checking is dangerous. It might cause TLC to miss violations of the stated liveness properties. Please check liveness without symmetry defined. -@!@!@ENDMSG 2279 @!@!@ -@!@!@STARTMSG 2284:3 @!@!@ -Declaring state or action constraints during liveness checking is dangerous: Please read section 14.3.5 on page 247 of Specifying Systems (https://lamport.azurewebsites.net/tla/book.html) and optionally the discussion at https://discuss.tlapl.us/msg00994.html for more details. -@!@!@ENDMSG 2284 @!@!@ -@!@!@STARTMSG 2212:0 @!@!@ -Implied-temporal checking--satisfiability problem has 1 branches. -@!@!@ENDMSG 2212 @!@!@ -@!@!@STARTMSG 2189:0 @!@!@ -Computing initial states... -@!@!@ENDMSG 2189 @!@!@ -@!@!@STARTMSG 2190:0 @!@!@ -Finished computing initial states: 1 distinct state generated at 2025-01-19 16:11:07. -@!@!@ENDMSG 2190 @!@!@ -@!@!@STARTMSG 2109:1 @!@!@ -Successor state is not completely specified by action SkPeerRecovery of the next-state relation. The following variables are not assigned: broker_state, pageserver_state. - -@!@!@ENDMSG 2109 @!@!@ -@!@!@STARTMSG 2121:1 @!@!@ -The behavior up to this point is: -@!@!@ENDMSG 2121 @!@!@ -@!@!@STARTMSG 2217:4 @!@!@ -1: -/\ pageserver_state = (p1 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0]), last_record_lsn |-> 0, preferred_sk |-> NULL] @@ p2 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0]), last_record_lsn |-> 0, preferred_sk |-> NULL]) -/\ broker_state = (b1 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])] @@ b2 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])] @@ b3 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])]) -/\ safekeeper_state = (s1 :> [commit_lsn |-> 0, pruned_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0, pruned_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0, pruned_lsn |-> 0]) - -@!@!@ENDMSG 2217 @!@!@ -@!@!@STARTMSG 2217:4 @!@!@ -2: -/\ pageserver_state = (p1 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0]), last_record_lsn |-> 0, preferred_sk |-> NULL] @@ p2 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0]), last_record_lsn |-> 0, preferred_sk |-> NULL]) -/\ broker_state = (b1 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])] @@ b2 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])] @@ b3 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])]) -/\ safekeeper_state = (s1 :> [commit_lsn |-> 1, pruned_lsn |-> 0] @@ s2 :> [commit_lsn |-> 1, pruned_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0, pruned_lsn |-> 0]) - -@!@!@ENDMSG 2217 @!@!@ -@!@!@STARTMSG 2217:4 @!@!@ -3: -/\ pageserver_state = (p1 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0]), last_record_lsn |-> 0, preferred_sk |-> NULL] @@ p2 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0]), last_record_lsn |-> 0, preferred_sk |-> NULL]) -/\ broker_state = (b1 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])] @@ b2 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])] @@ b3 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])]) -/\ safekeeper_state = (s1 :> [commit_lsn |-> 2, pruned_lsn |-> 0] @@ s2 :> [commit_lsn |-> 2, pruned_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0, pruned_lsn |-> 0]) - -@!@!@ENDMSG 2217 @!@!@ -@!@!@STARTMSG 2217:4 @!@!@ -4: -/\ pageserver_state = null -/\ broker_state = null -/\ safekeeper_state = (s1 :> [commit_lsn |-> 2, pruned_lsn |-> 0] @@ s2 :> [commit_lsn |-> 2, pruned_lsn |-> 0] @@ s3 :> [commit_lsn |-> 2, pruned_lsn |-> 0]) - -@!@!@ENDMSG 2217 @!@!@ -@!@!@STARTMSG 2201:0 @!@!@ -The coverage statistics at 2025-01-19 16:11:07 -@!@!@ENDMSG 2201 @!@!@ -@!@!@STARTMSG 2773:0 @!@!@ -: 2:2 -@!@!@ENDMSG 2773 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 34, col 5 to line 36, col 64 of module fullmesh: 2 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2772:0 @!@!@ -: 2:14 -@!@!@ENDMSG 2772 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 40, col 8 to line 40, col 14 of module fullmesh: 48 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |line 40, col 8 to line 40, col 9 of module fullmesh: 34 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |line 40, col 13 to line 40, col 14 of module fullmesh: 34 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 41, col 8 to line 41, col 72 of module fullmesh: 37 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |line 41, col 8 to line 41, col 38 of module fullmesh: 23 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |line 41, col 42 to line 41, col 72 of module fullmesh: 23 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 45, col 13 to line 47, col 50 of module fullmesh: 14 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 48, col 8 to line 48, col 51 of module fullmesh: 14 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2772:0 @!@!@ -: 0:3 -@!@!@ENDMSG 2772 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 51, col 8 to line 51, col 72 of module fullmesh: 1 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |line 51, col 8 to line 51, col 38 of module fullmesh: 32 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |line 51, col 42 to line 51, col 72 of module fullmesh: 32 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 52, col 8 to line 52, col 102 of module fullmesh: 1 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |line 52, col 28 to line 52, col 102 of module fullmesh: 3 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2772:0 @!@!@ -: 0:9 -@!@!@ENDMSG 2772 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 55, col 8 to line 62, col 29 of module fullmesh: 9 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 63, col 8 to line 63, col 55 of module fullmesh: 9 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2772:0 @!@!@ -: 0:18 -@!@!@ENDMSG 2772 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 71, col 13 to line 73, col 37 of module fullmesh: 18 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 74, col 8 to line 74, col 51 of module fullmesh: 18 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2772:0 @!@!@ -: 0:0 -@!@!@ENDMSG 2772 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 84, col 8 to line 84, col 30 of module fullmesh: 2 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |line 84, col 8 to line 84, col 25 of module fullmesh: 2 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||line 79, col 15 to line 79, col 33 of module fullmesh: 2 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||line 81, col 5 to line 81, col 66 of module fullmesh: 2 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||line 81, col 26 to line 81, col 65 of module fullmesh: 6 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||line 81, col 12 to line 81, col 23 of module fullmesh: 2 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||line 84, col 24 to line 84, col 24 of module fullmesh: 2 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |line 84, col 29 to line 84, col 30 of module fullmesh: 2 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 85, col 8 to line 85, col 109 of module fullmesh: 0 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 86, col 8 to line 86, col 51 of module fullmesh: 0 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2202:0 @!@!@ -End of statistics. -@!@!@ENDMSG 2202 @!@!@ -@!@!@STARTMSG 2200:0 @!@!@ -Progress(3) at 2025-01-19 16:11:07: 40 states generated (992 s/min), 3 distinct states found (74 ds/min), 0 states left on queue. -@!@!@ENDMSG 2200 @!@!@ -@!@!@STARTMSG 2199:0 @!@!@ -40 states generated, 3 distinct states found, 0 states left on queue. -@!@!@ENDMSG 2199 @!@!@ -@!@!@STARTMSG 2194:0 @!@!@ -The depth of the complete state graph search is 3. -@!@!@ENDMSG 2194 @!@!@ -@!@!@STARTMSG 2268:0 @!@!@ -The average outdegree of the complete state graph is 1 (minimum is 1, the maximum 1 and the 95th percentile is 1). -@!@!@ENDMSG 2268 @!@!@ -@!@!@STARTMSG 2186:0 @!@!@ -Finished in 2440ms at (2025-01-19 16:11:07) -@!@!@ENDMSG 2186 @!@!@ diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299542008/MC.out b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299542008/MC.out deleted file mode 100644 index 50c1506166..0000000000 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299542008/MC.out +++ /dev/null @@ -1,57 +0,0 @@ -@!@!@STARTMSG 2262:0 @!@!@ -TLC2 Version 2.19 of 08 August 2024 (rev: 5a47802) -@!@!@ENDMSG 2262 @!@!@ -@!@!@STARTMSG 2187:0 @!@!@ -Running breadth-first search Model-Checking with fp 90 and seed -131482239732531000 with 4 workers on 8 cores with 2428MB heap and 5460MB offheap memory [pid: 7787] (Mac OS X 10.16 x86_64, AdoptOpenJDK 14.0.1 x86_64, OffHeapDiskFPSet, DiskStateQueue). -@!@!@ENDMSG 2187 @!@!@ -@!@!@STARTMSG 2220:0 @!@!@ -Starting SANY... -@!@!@ENDMSG 2220 @!@!@ -Parsing file /Users/cs/Desktop/broker/fullmesh/fullmesh.toolbox/Model_1/MC.tla -Parsing file /Users/cs/Desktop/broker/fullmesh/fullmesh.toolbox/Model_1/fullmesh.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/TLC.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Integers.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Naturals.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Sequences.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/FiniteSets.tla -Semantic processing of module Naturals -Semantic processing of module Integers -Semantic processing of module fullmesh -Semantic processing of module Sequences -Semantic processing of module FiniteSets -Semantic processing of module TLC -Semantic processing of module MC -@!@!@STARTMSG 2219:0 @!@!@ -SANY finished. -@!@!@ENDMSG 2219 @!@!@ -@!@!@STARTMSG 2185:0 @!@!@ -Starting... (2025-01-19 16:12:09) -@!@!@ENDMSG 2185 @!@!@ -@!@!@STARTMSG 2279:3 @!@!@ -Declaring symmetry during liveness checking is dangerous. It might cause TLC to miss violations of the stated liveness properties. Please check liveness without symmetry defined. -@!@!@ENDMSG 2279 @!@!@ -@!@!@STARTMSG 2284:3 @!@!@ -Declaring state or action constraints during liveness checking is dangerous: Please read section 14.3.5 on page 247 of Specifying Systems (https://lamport.azurewebsites.net/tla/book.html) and optionally the discussion at https://discuss.tlapl.us/msg00994.html for more details. -@!@!@ENDMSG 2284 @!@!@ -@!@!@STARTMSG 2212:0 @!@!@ -Implied-temporal checking--satisfiability problem has 1 branches. -@!@!@ENDMSG 2212 @!@!@ -@!@!@STARTMSG 2189:0 @!@!@ -Computing initial states... -@!@!@ENDMSG 2189 @!@!@ -@!@!@STARTMSG 2190:0 @!@!@ -Finished computing initial states: 1 distinct state generated at 2025-01-19 16:12:10. -@!@!@ENDMSG 2190 @!@!@ -@!@!@STARTMSG 2143:3 @!@!@ -The variable safekeeper_state was changed while it is specified as UNCHANGED at -line 53, col 34 to line 53, col 49 of module fullmesh -@!@!@ENDMSG 2143 @!@!@ -@!@!@STARTMSG 2192:0 @!@!@ -Checking temporal properties for the current state space with 1454 total distinct states at (2025-01-19 16:12:13) -@!@!@ENDMSG 2192 @!@!@ -@!@!@STARTMSG 2267:0 @!@!@ -Finished checking temporal properties in 00s at 2025-01-19 16:12:13 -@!@!@ENDMSG 2267 @!@!@ -@!@!@STARTMSG 2200:0 @!@!@ -Progress(11) at 2025-01-19 16:12:13: 44.264 states generated (44.264 s/min), 2.994 distinct states found (2.994 ds/min), 1.536 states left on queue. -@!@!@ENDMSG 2200 @!@!@ diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299542008/MC.tla b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299542008/MC.tla deleted file mode 100644 index c9a0a6f895..0000000000 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299542008/MC.tla +++ /dev/null @@ -1,65 +0,0 @@ ----- MODULE MC ---- -EXTENDS fullmesh, TLC - -\* MV CONSTANT declarations@modelParameterConstants -CONSTANTS -b1, b2, b3 ----- - -\* MV CONSTANT declarations@modelParameterConstants -CONSTANTS -s1, s2, s3 ----- - -\* MV CONSTANT declarations@modelParameterConstants -CONSTANTS -p1, p2 ----- - -\* MV CONSTANT declarations@modelParameterConstants -CONSTANTS -az1, az2, az3 ----- - -\* MV CONSTANT definitions brokers -const_1737299528165230000 == -{b1, b2, b3} ----- - -\* MV CONSTANT definitions safekeepers -const_1737299528166231000 == -{s1, s2, s3} ----- - -\* MV CONSTANT definitions pageservers -const_1737299528166232000 == -{p1, p2} ----- - -\* MV CONSTANT definitions azs -const_1737299528166233000 == -{az1, az2, az3} ----- - -\* SYMMETRY definition -symm_1737299528166234000 == -Permutations(const_1737299528165230000) \union Permutations(const_1737299528166231000) \union Permutations(const_1737299528166232000) \union Permutations(const_1737299528166233000) ----- - -\* CONSTANT definitions @modelParameterConstants:4max_commit_lsn -const_1737299528166235000 == -2 ----- - -\* CONSTANT definitions @modelParameterConstants:5az_mapping -const_1737299528166236000 == -[ az1 |-> {b1,s1,p1} , az2 |-> {b2,s2,p2} , az3 |-> {b3,s3}] ----- - -\* CONSTRAINT definition @modelParameterContraint:0 -constr_1737299528166237000 == -StateConstraint ----- -============================================================================= -\* Modification History -\* Created Sun Jan 19 16:12:08 CET 2025 by cs diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299542008/MC_TE.out b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299542008/MC_TE.out deleted file mode 100644 index 50c1506166..0000000000 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299542008/MC_TE.out +++ /dev/null @@ -1,57 +0,0 @@ -@!@!@STARTMSG 2262:0 @!@!@ -TLC2 Version 2.19 of 08 August 2024 (rev: 5a47802) -@!@!@ENDMSG 2262 @!@!@ -@!@!@STARTMSG 2187:0 @!@!@ -Running breadth-first search Model-Checking with fp 90 and seed -131482239732531000 with 4 workers on 8 cores with 2428MB heap and 5460MB offheap memory [pid: 7787] (Mac OS X 10.16 x86_64, AdoptOpenJDK 14.0.1 x86_64, OffHeapDiskFPSet, DiskStateQueue). -@!@!@ENDMSG 2187 @!@!@ -@!@!@STARTMSG 2220:0 @!@!@ -Starting SANY... -@!@!@ENDMSG 2220 @!@!@ -Parsing file /Users/cs/Desktop/broker/fullmesh/fullmesh.toolbox/Model_1/MC.tla -Parsing file /Users/cs/Desktop/broker/fullmesh/fullmesh.toolbox/Model_1/fullmesh.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/TLC.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Integers.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Naturals.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Sequences.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/FiniteSets.tla -Semantic processing of module Naturals -Semantic processing of module Integers -Semantic processing of module fullmesh -Semantic processing of module Sequences -Semantic processing of module FiniteSets -Semantic processing of module TLC -Semantic processing of module MC -@!@!@STARTMSG 2219:0 @!@!@ -SANY finished. -@!@!@ENDMSG 2219 @!@!@ -@!@!@STARTMSG 2185:0 @!@!@ -Starting... (2025-01-19 16:12:09) -@!@!@ENDMSG 2185 @!@!@ -@!@!@STARTMSG 2279:3 @!@!@ -Declaring symmetry during liveness checking is dangerous. It might cause TLC to miss violations of the stated liveness properties. Please check liveness without symmetry defined. -@!@!@ENDMSG 2279 @!@!@ -@!@!@STARTMSG 2284:3 @!@!@ -Declaring state or action constraints during liveness checking is dangerous: Please read section 14.3.5 on page 247 of Specifying Systems (https://lamport.azurewebsites.net/tla/book.html) and optionally the discussion at https://discuss.tlapl.us/msg00994.html for more details. -@!@!@ENDMSG 2284 @!@!@ -@!@!@STARTMSG 2212:0 @!@!@ -Implied-temporal checking--satisfiability problem has 1 branches. -@!@!@ENDMSG 2212 @!@!@ -@!@!@STARTMSG 2189:0 @!@!@ -Computing initial states... -@!@!@ENDMSG 2189 @!@!@ -@!@!@STARTMSG 2190:0 @!@!@ -Finished computing initial states: 1 distinct state generated at 2025-01-19 16:12:10. -@!@!@ENDMSG 2190 @!@!@ -@!@!@STARTMSG 2143:3 @!@!@ -The variable safekeeper_state was changed while it is specified as UNCHANGED at -line 53, col 34 to line 53, col 49 of module fullmesh -@!@!@ENDMSG 2143 @!@!@ -@!@!@STARTMSG 2192:0 @!@!@ -Checking temporal properties for the current state space with 1454 total distinct states at (2025-01-19 16:12:13) -@!@!@ENDMSG 2192 @!@!@ -@!@!@STARTMSG 2267:0 @!@!@ -Finished checking temporal properties in 00s at 2025-01-19 16:12:13 -@!@!@ENDMSG 2267 @!@!@ -@!@!@STARTMSG 2200:0 @!@!@ -Progress(11) at 2025-01-19 16:12:13: 44.264 states generated (44.264 s/min), 2.994 distinct states found (2.994 ds/min), 1.536 states left on queue. -@!@!@ENDMSG 2200 @!@!@ diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299744229/MC.cfg b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299744229/MC.cfg deleted file mode 100644 index a8b002b0f3..0000000000 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299744229/MC.cfg +++ /dev/null @@ -1,51 +0,0 @@ -\* MV CONSTANT declarations -CONSTANTS -b1 = b1 -b2 = b2 -b3 = b3 -\* MV CONSTANT declarations -CONSTANTS -s1 = s1 -s2 = s2 -s3 = s3 -\* MV CONSTANT declarations -CONSTANTS -p1 = p1 -p2 = p2 -\* MV CONSTANT declarations -CONSTANTS -az1 = az1 -az2 = az2 -az3 = az3 -\* MV CONSTANT definitions -CONSTANT -brokers <- const_1737299548592239000 -\* CONSTANT declarations -CONSTANT NULL = NULL -\* MV CONSTANT definitions -CONSTANT -safekeepers <- const_1737299548592240000 -\* MV CONSTANT definitions -CONSTANT -pageservers <- const_1737299548592241000 -\* MV CONSTANT definitions -CONSTANT -azs <- const_1737299548592242000 -\* SYMMETRY definition -SYMMETRY symm_1737299548592243000 -\* CONSTANT definitions -CONSTANT -max_commit_lsn <- const_1737299548592244000 -\* CONSTANT definitions -CONSTANT -az_mapping <- const_1737299548592245000 -\* CONSTRAINT definition -CONSTRAINT -constr_1737299548592246000 -\* SPECIFICATION definition -SPECIFICATION -Spec -\* PROPERTY definition -PROPERTY -EventuallyLaggingSkIsNotPreferredSk -\* Generated on Sun Jan 19 16:12:28 CET 2025 \ No newline at end of file diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299744229/MC.out b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299744229/MC.out deleted file mode 100644 index 071b6e732d..0000000000 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299744229/MC.out +++ /dev/null @@ -1,323 +0,0 @@ -@!@!@STARTMSG 2262:0 @!@!@ -TLC2 Version 2.19 of 08 August 2024 (rev: 5a47802) -@!@!@ENDMSG 2262 @!@!@ -@!@!@STARTMSG 2187:0 @!@!@ -Running breadth-first search Model-Checking with fp 7 and seed 1961239747497010948 with 4 workers on 8 cores with 2428MB heap and 5460MB offheap memory [pid: 7839] (Mac OS X 10.16 x86_64, AdoptOpenJDK 14.0.1 x86_64, OffHeapDiskFPSet, DiskStateQueue). -@!@!@ENDMSG 2187 @!@!@ -@!@!@STARTMSG 2220:0 @!@!@ -Starting SANY... -@!@!@ENDMSG 2220 @!@!@ -Parsing file /Users/cs/Desktop/broker/fullmesh/fullmesh.toolbox/Model_1/MC.tla -Parsing file /Users/cs/Desktop/broker/fullmesh/fullmesh.toolbox/Model_1/fullmesh.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/TLC.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Integers.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Naturals.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Sequences.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/FiniteSets.tla -Semantic processing of module Naturals -Semantic processing of module Integers -Semantic processing of module fullmesh -Semantic processing of module Sequences -Semantic processing of module FiniteSets -Semantic processing of module TLC -Semantic processing of module MC -@!@!@STARTMSG 2219:0 @!@!@ -SANY finished. -@!@!@ENDMSG 2219 @!@!@ -@!@!@STARTMSG 2185:0 @!@!@ -Starting... (2025-01-19 16:12:29) -@!@!@ENDMSG 2185 @!@!@ -@!@!@STARTMSG 2279:3 @!@!@ -Declaring symmetry during liveness checking is dangerous. It might cause TLC to miss violations of the stated liveness properties. Please check liveness without symmetry defined. -@!@!@ENDMSG 2279 @!@!@ -@!@!@STARTMSG 2284:3 @!@!@ -Declaring state or action constraints during liveness checking is dangerous: Please read section 14.3.5 on page 247 of Specifying Systems (https://lamport.azurewebsites.net/tla/book.html) and optionally the discussion at https://discuss.tlapl.us/msg00994.html for more details. -@!@!@ENDMSG 2284 @!@!@ -@!@!@STARTMSG 2212:0 @!@!@ -Implied-temporal checking--satisfiability problem has 1 branches. -@!@!@ENDMSG 2212 @!@!@ -@!@!@STARTMSG 2189:0 @!@!@ -Computing initial states... -@!@!@ENDMSG 2189 @!@!@ -@!@!@STARTMSG 2190:0 @!@!@ -Finished computing initial states: 1 distinct state generated at 2025-01-19 16:12:31. -@!@!@ENDMSG 2190 @!@!@ -@!@!@STARTMSG 2192:0 @!@!@ -Checking temporal properties for the current state space with 1175 total distinct states at (2025-01-19 16:12:34) -@!@!@ENDMSG 2192 @!@!@ -@!@!@STARTMSG 2267:0 @!@!@ -Finished checking temporal properties in 00s at 2025-01-19 16:12:34 -@!@!@ENDMSG 2267 @!@!@ -@!@!@STARTMSG 2200:0 @!@!@ -Progress(11) at 2025-01-19 16:12:34: 38.396 states generated (38.396 s/min), 3.250 distinct states found (3.250 ds/min), 2.071 states left on queue. -@!@!@ENDMSG 2200 @!@!@ -@!@!@STARTMSG 2192:0 @!@!@ -Checking temporal properties for the current state space with 45381 total distinct states at (2025-01-19 16:13:34) -@!@!@ENDMSG 2192 @!@!@ -@!@!@STARTMSG 2267:0 @!@!@ -Finished checking temporal properties in 00s at 2025-01-19 16:13:34 -@!@!@ENDMSG 2267 @!@!@ -@!@!@STARTMSG 2200:0 @!@!@ -Progress(15) at 2025-01-19 16:13:34: 1.510.623 states generated (1.472.227 s/min), 97.716 distinct states found (94.466 ds/min), 52.332 states left on queue. -@!@!@ENDMSG 2200 @!@!@ -@!@!@STARTMSG 2192:0 @!@!@ -Checking temporal properties for the current state space with 92513 total distinct states at (2025-01-19 16:14:34) -@!@!@ENDMSG 2192 @!@!@ -@!@!@STARTMSG 2267:0 @!@!@ -Finished checking temporal properties in 00s at 2025-01-19 16:14:34 -@!@!@ENDMSG 2267 @!@!@ -@!@!@STARTMSG 2200:0 @!@!@ -Progress(16) at 2025-01-19 16:14:34: 3.093.230 states generated (1.582.607 s/min), 182.372 distinct states found (84.656 ds/min), 89.855 states left on queue. -@!@!@ENDMSG 2200 @!@!@ -@!@!@STARTMSG 2192:0 @!@!@ -Checking temporal properties for the current state space with 140861 total distinct states at (2025-01-19 16:15:34) -@!@!@ENDMSG 2192 @!@!@ -@!@!@STARTMSG 2267:0 @!@!@ -Finished checking temporal properties in 00s at 2025-01-19 16:15:34 -@!@!@ENDMSG 2267 @!@!@ -@!@!@STARTMSG 2200:0 @!@!@ -Progress(17) at 2025-01-19 16:15:34: 4.742.508 states generated (1.649.278 s/min), 257.179 distinct states found (74.807 ds/min), 116.314 states left on queue. -@!@!@ENDMSG 2200 @!@!@ -@!@!@STARTMSG 2201:0 @!@!@ -The coverage statistics at 2025-01-19 16:15:34 -@!@!@ENDMSG 2201 @!@!@ -@!@!@STARTMSG 2773:0 @!@!@ -: 1:1 -@!@!@ENDMSG 2773 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 34, col 5 to line 36, col 64 of module fullmesh: 1 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2772:0 @!@!@ -: 54:531874 -@!@!@ENDMSG 2772 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 40, col 8 to line 40, col 14 of module fullmesh: 1799789 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |line 40, col 8 to line 40, col 9 of module fullmesh: 1267920 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |line 40, col 13 to line 40, col 14 of module fullmesh: 1267920 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 41, col 8 to line 41, col 72 of module fullmesh: 1377160 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |line 41, col 8 to line 41, col 38 of module fullmesh: 845280 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||line 41, col 8 to line 41, col 27 of module fullmesh: 845280 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||line 41, col 8 to line 41, col 23 of module fullmesh: 845280 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||line 41, col 25 to line 41, col 26 of module fullmesh: 845280 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |line 41, col 42 to line 41, col 72 of module fullmesh: 845280 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 45, col 13 to line 47, col 50 of module fullmesh: 531880 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 48, col 8 to line 48, col 51 of module fullmesh: 531878 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2772:0 @!@!@ -: 148:156702 -@!@!@ENDMSG 2772 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 51, col 8 to line 51, col 72 of module fullmesh: 156716 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |line 51, col 8 to line 51, col 38 of module fullmesh: 1267992 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||line 51, col 8 to line 51, col 27 of module fullmesh: 1267999 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||line 51, col 8 to line 51, col 23 of module fullmesh: 1268010 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||line 51, col 25 to line 51, col 26 of module fullmesh: 1268010 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |line 51, col 42 to line 51, col 72 of module fullmesh: 1268010 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 52, col 8 to line 52, col 102 of module fullmesh: 156720 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 53, col 8 to line 53, col 51 of module fullmesh: 156716 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2772:0 @!@!@ -: 13409:1268009 -@!@!@ENDMSG 2772 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 56, col 8 to line 63, col 29 of module fullmesh: 1268023 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |line 56, col 24 to line 63, col 29 of module fullmesh: 1268028 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||line 56, col 27 to line 56, col 91 of module fullmesh: 1268028 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||line 56, col 27 to line 56, col 58 of module fullmesh: 1268028 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||||line 56, col 27 to line 56, col 47 of module fullmesh: 1268028 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||||line 56, col 27 to line 56, col 44 of module fullmesh: 1268028 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||||||line 56, col 27 to line 56, col 41 of module fullmesh: 1268028 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||||||line 56, col 27 to line 56, col 38 of module fullmesh: 1268028 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||||||line 56, col 40 to line 56, col 40 of module fullmesh: 1268028 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||||line 56, col 46 to line 56, col 46 of module fullmesh: 1268028 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||line 56, col 62 to line 56, col 91 of module fullmesh: 1268028 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||line 59, col 28 to line 59, col 45 of module fullmesh: 793908 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||line 59, col 28 to line 59, col 42 of module fullmesh: 793908 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||line 60, col 31 to line 60, col 91 of module fullmesh: 793908 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||line 60, col 32 to line 60, col 34 of module fullmesh: 793908 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||line 60, col 43 to line 60, col 90 of module fullmesh: 793906 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||line 62, col 17 to line 62, col 54 of module fullmesh: 793908 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||line 63, col 18 to line 63, col 29 of module fullmesh: 474120 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 64, col 8 to line 64, col 55 of module fullmesh: 1268023 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2772:0 @!@!@ -: 130578:2536105 -@!@!@ENDMSG 2772 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 72, col 13 to line 74, col 37 of module fullmesh: 2536113 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |line 72, col 33 to line 74, col 37 of module fullmesh: 2536117 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||line 72, col 36 to line 72, col 66 of module fullmesh: 2536118 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||line 72, col 36 to line 72, col 49 of module fullmesh: 2536119 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||line 72, col 53 to line 72, col 66 of module fullmesh: 2536121 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||||line 72, col 53 to line 72, col 55 of module fullmesh: 2536122 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||||line 69, col 20 to line 69, col 44 of module fullmesh: 2536123 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||||||line 69, col 20 to line 69, col 41 of module fullmesh: 2536124 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||||||line 69, col 20 to line 69, col 38 of module fullmesh: 2536125 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||||||line 69, col 43 to line 69, col 43 of module fullmesh: 2536126 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||line 73, col 22 to line 73, col 66 of module fullmesh: 818090 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||line 74, col 22 to line 74, col 37 of module fullmesh: 1718038 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 75, col 8 to line 75, col 51 of module fullmesh: 2536113 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2772:0 @!@!@ -: 113018:250807 -@!@!@ENDMSG 2772 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 85, col 8 to line 85, col 30 of module fullmesh: 532607 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |line 85, col 8 to line 85, col 25 of module fullmesh: 281798 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||line 80, col 15 to line 80, col 33 of module fullmesh: 281798 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||line 82, col 5 to line 82, col 66 of module fullmesh: 281798 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||line 82, col 26 to line 82, col 65 of module fullmesh: 845394 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||line 82, col 12 to line 82, col 23 of module fullmesh: 281798 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||line 85, col 24 to line 85, col 24 of module fullmesh: 281798 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |line 85, col 29 to line 85, col 30 of module fullmesh: 281800 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 86, col 8 to line 86, col 109 of module fullmesh: 250813 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |line 86, col 28 to line 86, col 109 of module fullmesh: 250815 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||line 86, col 29 to line 86, col 44 of module fullmesh: 250815 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||line 86, col 52 to line 86, col 108 of module fullmesh: 250807 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||line 86, col 72 to line 86, col 108 of module fullmesh: 250815 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||line 86, col 105 to line 86, col 108 of module fullmesh: 250814 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||line 86, col 85 to line 86, col 102 of module fullmesh: 250815 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||||line 80, col 15 to line 80, col 33 of module fullmesh: 250814 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2775:0 @!@!@ - ||||line 82, col 5 to line 82, col 66 of module fullmesh: 250814:250814 -@!@!@ENDMSG 2775 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||||line 82, col 26 to line 82, col 65 of module fullmesh: 752442 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||||line 82, col 12 to line 82, col 23 of module fullmesh: 250814 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||||line 86, col 101 to line 86, col 101 of module fullmesh: 250814 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 87, col 8 to line 87, col 51 of module fullmesh: 250807 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2202:0 @!@!@ -End of statistics. -@!@!@ENDMSG 2202 @!@!@ diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299744229/MC.tla b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299744229/MC.tla deleted file mode 100644 index fc42ac157a..0000000000 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299744229/MC.tla +++ /dev/null @@ -1,65 +0,0 @@ ----- MODULE MC ---- -EXTENDS fullmesh, TLC - -\* MV CONSTANT declarations@modelParameterConstants -CONSTANTS -b1, b2, b3 ----- - -\* MV CONSTANT declarations@modelParameterConstants -CONSTANTS -s1, s2, s3 ----- - -\* MV CONSTANT declarations@modelParameterConstants -CONSTANTS -p1, p2 ----- - -\* MV CONSTANT declarations@modelParameterConstants -CONSTANTS -az1, az2, az3 ----- - -\* MV CONSTANT definitions brokers -const_1737299548592239000 == -{b1, b2, b3} ----- - -\* MV CONSTANT definitions safekeepers -const_1737299548592240000 == -{s1, s2, s3} ----- - -\* MV CONSTANT definitions pageservers -const_1737299548592241000 == -{p1, p2} ----- - -\* MV CONSTANT definitions azs -const_1737299548592242000 == -{az1, az2, az3} ----- - -\* SYMMETRY definition -symm_1737299548592243000 == -Permutations(const_1737299548592239000) \union Permutations(const_1737299548592240000) \union Permutations(const_1737299548592241000) \union Permutations(const_1737299548592242000) ----- - -\* CONSTANT definitions @modelParameterConstants:4max_commit_lsn -const_1737299548592244000 == -2 ----- - -\* CONSTANT definitions @modelParameterConstants:5az_mapping -const_1737299548592245000 == -[ az1 |-> {b1,s1,p1} , az2 |-> {b2,s2,p2} , az3 |-> {b3,s3}] ----- - -\* CONSTRAINT definition @modelParameterContraint:0 -constr_1737299548592246000 == -StateConstraint ----- -============================================================================= -\* Modification History -\* Created Sun Jan 19 16:12:28 CET 2025 by cs diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299744229/MC_TE.out b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299744229/MC_TE.out deleted file mode 100644 index 071b6e732d..0000000000 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299744229/MC_TE.out +++ /dev/null @@ -1,323 +0,0 @@ -@!@!@STARTMSG 2262:0 @!@!@ -TLC2 Version 2.19 of 08 August 2024 (rev: 5a47802) -@!@!@ENDMSG 2262 @!@!@ -@!@!@STARTMSG 2187:0 @!@!@ -Running breadth-first search Model-Checking with fp 7 and seed 1961239747497010948 with 4 workers on 8 cores with 2428MB heap and 5460MB offheap memory [pid: 7839] (Mac OS X 10.16 x86_64, AdoptOpenJDK 14.0.1 x86_64, OffHeapDiskFPSet, DiskStateQueue). -@!@!@ENDMSG 2187 @!@!@ -@!@!@STARTMSG 2220:0 @!@!@ -Starting SANY... -@!@!@ENDMSG 2220 @!@!@ -Parsing file /Users/cs/Desktop/broker/fullmesh/fullmesh.toolbox/Model_1/MC.tla -Parsing file /Users/cs/Desktop/broker/fullmesh/fullmesh.toolbox/Model_1/fullmesh.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/TLC.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Integers.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Naturals.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Sequences.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/FiniteSets.tla -Semantic processing of module Naturals -Semantic processing of module Integers -Semantic processing of module fullmesh -Semantic processing of module Sequences -Semantic processing of module FiniteSets -Semantic processing of module TLC -Semantic processing of module MC -@!@!@STARTMSG 2219:0 @!@!@ -SANY finished. -@!@!@ENDMSG 2219 @!@!@ -@!@!@STARTMSG 2185:0 @!@!@ -Starting... (2025-01-19 16:12:29) -@!@!@ENDMSG 2185 @!@!@ -@!@!@STARTMSG 2279:3 @!@!@ -Declaring symmetry during liveness checking is dangerous. It might cause TLC to miss violations of the stated liveness properties. Please check liveness without symmetry defined. -@!@!@ENDMSG 2279 @!@!@ -@!@!@STARTMSG 2284:3 @!@!@ -Declaring state or action constraints during liveness checking is dangerous: Please read section 14.3.5 on page 247 of Specifying Systems (https://lamport.azurewebsites.net/tla/book.html) and optionally the discussion at https://discuss.tlapl.us/msg00994.html for more details. -@!@!@ENDMSG 2284 @!@!@ -@!@!@STARTMSG 2212:0 @!@!@ -Implied-temporal checking--satisfiability problem has 1 branches. -@!@!@ENDMSG 2212 @!@!@ -@!@!@STARTMSG 2189:0 @!@!@ -Computing initial states... -@!@!@ENDMSG 2189 @!@!@ -@!@!@STARTMSG 2190:0 @!@!@ -Finished computing initial states: 1 distinct state generated at 2025-01-19 16:12:31. -@!@!@ENDMSG 2190 @!@!@ -@!@!@STARTMSG 2192:0 @!@!@ -Checking temporal properties for the current state space with 1175 total distinct states at (2025-01-19 16:12:34) -@!@!@ENDMSG 2192 @!@!@ -@!@!@STARTMSG 2267:0 @!@!@ -Finished checking temporal properties in 00s at 2025-01-19 16:12:34 -@!@!@ENDMSG 2267 @!@!@ -@!@!@STARTMSG 2200:0 @!@!@ -Progress(11) at 2025-01-19 16:12:34: 38.396 states generated (38.396 s/min), 3.250 distinct states found (3.250 ds/min), 2.071 states left on queue. -@!@!@ENDMSG 2200 @!@!@ -@!@!@STARTMSG 2192:0 @!@!@ -Checking temporal properties for the current state space with 45381 total distinct states at (2025-01-19 16:13:34) -@!@!@ENDMSG 2192 @!@!@ -@!@!@STARTMSG 2267:0 @!@!@ -Finished checking temporal properties in 00s at 2025-01-19 16:13:34 -@!@!@ENDMSG 2267 @!@!@ -@!@!@STARTMSG 2200:0 @!@!@ -Progress(15) at 2025-01-19 16:13:34: 1.510.623 states generated (1.472.227 s/min), 97.716 distinct states found (94.466 ds/min), 52.332 states left on queue. -@!@!@ENDMSG 2200 @!@!@ -@!@!@STARTMSG 2192:0 @!@!@ -Checking temporal properties for the current state space with 92513 total distinct states at (2025-01-19 16:14:34) -@!@!@ENDMSG 2192 @!@!@ -@!@!@STARTMSG 2267:0 @!@!@ -Finished checking temporal properties in 00s at 2025-01-19 16:14:34 -@!@!@ENDMSG 2267 @!@!@ -@!@!@STARTMSG 2200:0 @!@!@ -Progress(16) at 2025-01-19 16:14:34: 3.093.230 states generated (1.582.607 s/min), 182.372 distinct states found (84.656 ds/min), 89.855 states left on queue. -@!@!@ENDMSG 2200 @!@!@ -@!@!@STARTMSG 2192:0 @!@!@ -Checking temporal properties for the current state space with 140861 total distinct states at (2025-01-19 16:15:34) -@!@!@ENDMSG 2192 @!@!@ -@!@!@STARTMSG 2267:0 @!@!@ -Finished checking temporal properties in 00s at 2025-01-19 16:15:34 -@!@!@ENDMSG 2267 @!@!@ -@!@!@STARTMSG 2200:0 @!@!@ -Progress(17) at 2025-01-19 16:15:34: 4.742.508 states generated (1.649.278 s/min), 257.179 distinct states found (74.807 ds/min), 116.314 states left on queue. -@!@!@ENDMSG 2200 @!@!@ -@!@!@STARTMSG 2201:0 @!@!@ -The coverage statistics at 2025-01-19 16:15:34 -@!@!@ENDMSG 2201 @!@!@ -@!@!@STARTMSG 2773:0 @!@!@ -: 1:1 -@!@!@ENDMSG 2773 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 34, col 5 to line 36, col 64 of module fullmesh: 1 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2772:0 @!@!@ -: 54:531874 -@!@!@ENDMSG 2772 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 40, col 8 to line 40, col 14 of module fullmesh: 1799789 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |line 40, col 8 to line 40, col 9 of module fullmesh: 1267920 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |line 40, col 13 to line 40, col 14 of module fullmesh: 1267920 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 41, col 8 to line 41, col 72 of module fullmesh: 1377160 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |line 41, col 8 to line 41, col 38 of module fullmesh: 845280 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||line 41, col 8 to line 41, col 27 of module fullmesh: 845280 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||line 41, col 8 to line 41, col 23 of module fullmesh: 845280 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||line 41, col 25 to line 41, col 26 of module fullmesh: 845280 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |line 41, col 42 to line 41, col 72 of module fullmesh: 845280 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 45, col 13 to line 47, col 50 of module fullmesh: 531880 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 48, col 8 to line 48, col 51 of module fullmesh: 531878 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2772:0 @!@!@ -: 148:156702 -@!@!@ENDMSG 2772 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 51, col 8 to line 51, col 72 of module fullmesh: 156716 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |line 51, col 8 to line 51, col 38 of module fullmesh: 1267992 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||line 51, col 8 to line 51, col 27 of module fullmesh: 1267999 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||line 51, col 8 to line 51, col 23 of module fullmesh: 1268010 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||line 51, col 25 to line 51, col 26 of module fullmesh: 1268010 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |line 51, col 42 to line 51, col 72 of module fullmesh: 1268010 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 52, col 8 to line 52, col 102 of module fullmesh: 156720 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 53, col 8 to line 53, col 51 of module fullmesh: 156716 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2772:0 @!@!@ -: 13409:1268009 -@!@!@ENDMSG 2772 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 56, col 8 to line 63, col 29 of module fullmesh: 1268023 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |line 56, col 24 to line 63, col 29 of module fullmesh: 1268028 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||line 56, col 27 to line 56, col 91 of module fullmesh: 1268028 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||line 56, col 27 to line 56, col 58 of module fullmesh: 1268028 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||||line 56, col 27 to line 56, col 47 of module fullmesh: 1268028 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||||line 56, col 27 to line 56, col 44 of module fullmesh: 1268028 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||||||line 56, col 27 to line 56, col 41 of module fullmesh: 1268028 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||||||line 56, col 27 to line 56, col 38 of module fullmesh: 1268028 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||||||line 56, col 40 to line 56, col 40 of module fullmesh: 1268028 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||||line 56, col 46 to line 56, col 46 of module fullmesh: 1268028 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||line 56, col 62 to line 56, col 91 of module fullmesh: 1268028 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||line 59, col 28 to line 59, col 45 of module fullmesh: 793908 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||line 59, col 28 to line 59, col 42 of module fullmesh: 793908 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||line 60, col 31 to line 60, col 91 of module fullmesh: 793908 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||line 60, col 32 to line 60, col 34 of module fullmesh: 793908 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||line 60, col 43 to line 60, col 90 of module fullmesh: 793906 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||line 62, col 17 to line 62, col 54 of module fullmesh: 793908 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||line 63, col 18 to line 63, col 29 of module fullmesh: 474120 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 64, col 8 to line 64, col 55 of module fullmesh: 1268023 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2772:0 @!@!@ -: 130578:2536105 -@!@!@ENDMSG 2772 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 72, col 13 to line 74, col 37 of module fullmesh: 2536113 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |line 72, col 33 to line 74, col 37 of module fullmesh: 2536117 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||line 72, col 36 to line 72, col 66 of module fullmesh: 2536118 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||line 72, col 36 to line 72, col 49 of module fullmesh: 2536119 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||line 72, col 53 to line 72, col 66 of module fullmesh: 2536121 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||||line 72, col 53 to line 72, col 55 of module fullmesh: 2536122 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||||line 69, col 20 to line 69, col 44 of module fullmesh: 2536123 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||||||line 69, col 20 to line 69, col 41 of module fullmesh: 2536124 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||||||line 69, col 20 to line 69, col 38 of module fullmesh: 2536125 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||||||line 69, col 43 to line 69, col 43 of module fullmesh: 2536126 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||line 73, col 22 to line 73, col 66 of module fullmesh: 818090 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||line 74, col 22 to line 74, col 37 of module fullmesh: 1718038 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 75, col 8 to line 75, col 51 of module fullmesh: 2536113 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2772:0 @!@!@ -: 113018:250807 -@!@!@ENDMSG 2772 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 85, col 8 to line 85, col 30 of module fullmesh: 532607 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |line 85, col 8 to line 85, col 25 of module fullmesh: 281798 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||line 80, col 15 to line 80, col 33 of module fullmesh: 281798 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||line 82, col 5 to line 82, col 66 of module fullmesh: 281798 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||line 82, col 26 to line 82, col 65 of module fullmesh: 845394 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||line 82, col 12 to line 82, col 23 of module fullmesh: 281798 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||line 85, col 24 to line 85, col 24 of module fullmesh: 281798 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |line 85, col 29 to line 85, col 30 of module fullmesh: 281800 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 86, col 8 to line 86, col 109 of module fullmesh: 250813 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |line 86, col 28 to line 86, col 109 of module fullmesh: 250815 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||line 86, col 29 to line 86, col 44 of module fullmesh: 250815 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||line 86, col 52 to line 86, col 108 of module fullmesh: 250807 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||line 86, col 72 to line 86, col 108 of module fullmesh: 250815 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||line 86, col 105 to line 86, col 108 of module fullmesh: 250814 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||line 86, col 85 to line 86, col 102 of module fullmesh: 250815 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||||line 80, col 15 to line 80, col 33 of module fullmesh: 250814 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2775:0 @!@!@ - ||||line 82, col 5 to line 82, col 66 of module fullmesh: 250814:250814 -@!@!@ENDMSG 2775 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||||line 82, col 26 to line 82, col 65 of module fullmesh: 752442 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||||line 82, col 12 to line 82, col 23 of module fullmesh: 250814 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||||line 86, col 101 to line 86, col 101 of module fullmesh: 250814 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 87, col 8 to line 87, col 51 of module fullmesh: 250807 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2202:0 @!@!@ -End of statistics. -@!@!@ENDMSG 2202 @!@!@ diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737301172627/MC.cfg b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307595008/MC.cfg similarity index 67% rename from storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737301172627/MC.cfg rename to storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307595008/MC.cfg index 4963984e72..d030d28ac1 100644 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737301172627/MC.cfg +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307595008/MC.cfg @@ -19,33 +19,33 @@ az2 = az2 az3 = az3 \* MV CONSTANT definitions CONSTANT -brokers <- const_17373011685892000 +brokers <- const_17373075907692000 \* CONSTANT declarations CONSTANT NULL = NULL \* MV CONSTANT definitions CONSTANT -safekeepers <- const_17373011685893000 +safekeepers <- const_17373075907703000 \* MV CONSTANT definitions CONSTANT -pageservers <- const_17373011685894000 +pageservers <- const_17373075907704000 \* MV CONSTANT definitions CONSTANT -azs <- const_17373011685895000 +azs <- const_17373075907705000 \* SYMMETRY definition -SYMMETRY symm_17373011685896000 +SYMMETRY symm_17373075907706000 \* CONSTANT definitions CONSTANT -max_commit_lsn <- const_17373011685897000 +max_commit_lsn <- const_17373075907707000 \* CONSTANT definitions CONSTANT -az_mapping <- const_17373011685898000 +az_mapping <- const_17373075907708000 \* CONSTRAINT definition CONSTRAINT -constr_17373011685899000 +constr_17373075907709000 \* SPECIFICATION definition SPECIFICATION Spec \* PROPERTY definition PROPERTY EventuallyLaggingSkIsNotPreferredSk -\* Generated on Sun Jan 19 16:39:28 CET 2025 \ No newline at end of file +\* Generated on Sun Jan 19 18:26:30 CET 2025 \ No newline at end of file diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307595008/MC.out b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307595008/MC.out new file mode 100644 index 0000000000..cfe6177fe8 --- /dev/null +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307595008/MC.out @@ -0,0 +1,164 @@ +@!@!@STARTMSG 2262:0 @!@!@ +TLC2 Version 2.19 of 08 August 2024 (rev: 5a47802) +@!@!@ENDMSG 2262 @!@!@ +@!@!@STARTMSG 2187:0 @!@!@ +Running breadth-first search Model-Checking with fp 44 and seed -6447714091281296951 with 4 workers on 8 cores with 2428MB heap and 5460MB offheap memory [pid: 11418] (Mac OS X 10.16 x86_64, AdoptOpenJDK 14.0.1 x86_64, OffHeapDiskFPSet, DiskStateQueue). +@!@!@ENDMSG 2187 @!@!@ +@!@!@STARTMSG 2220:0 @!@!@ +Starting SANY... +@!@!@ENDMSG 2220 @!@!@ +Parsing file /Users/cs/src/neon/storage_broker/spec/replicated/replicated.toolbox/Model_1/MC.tla +Parsing file /Users/cs/src/neon/storage_broker/spec/replicated/replicated.toolbox/Model_1/replicated.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/TLC.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Integers.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/FiniteSets.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Naturals.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Sequences.tla +Semantic processing of module Naturals +Semantic processing of module Integers +Semantic processing of module Sequences +Semantic processing of module FiniteSets +Semantic processing of module replicated +Semantic processing of module TLC +Semantic processing of module MC +@!@!@STARTMSG 2219:0 @!@!@ +SANY finished. +@!@!@ENDMSG 2219 @!@!@ +@!@!@STARTMSG 2185:0 @!@!@ +Starting... (2025-01-19 18:26:32) +@!@!@ENDMSG 2185 @!@!@ +@!@!@STARTMSG 2140:3 @!@!@ +The subscript of the next-state relation specified by the specification +does not seem to contain the state variable online +@!@!@ENDMSG 2140 @!@!@ +@!@!@STARTMSG 2279:3 @!@!@ +Declaring symmetry during liveness checking is dangerous. It might cause TLC to miss violations of the stated liveness properties. Please check liveness without symmetry defined. +@!@!@ENDMSG 2279 @!@!@ +@!@!@STARTMSG 2284:3 @!@!@ +Declaring state or action constraints during liveness checking is dangerous: Please read section 14.3.5 on page 247 of Specifying Systems (https://lamport.azurewebsites.net/tla/book.html) and optionally the discussion at https://discuss.tlapl.us/msg00994.html for more details. +@!@!@ENDMSG 2284 @!@!@ +@!@!@STARTMSG 2212:0 @!@!@ +Implied-temporal checking--satisfiability problem has 1 branches. +@!@!@ENDMSG 2212 @!@!@ +@!@!@STARTMSG 2189:0 @!@!@ +Computing initial states... +@!@!@ENDMSG 2189 @!@!@ +@!@!@STARTMSG 2190:0 @!@!@ +Finished computing initial states: 1 distinct state generated at 2025-01-19 18:26:33. +@!@!@ENDMSG 2190 @!@!@ +@!@!@STARTMSG 2109:1 @!@!@ +Successor state is not completely specified by action NodeOnlineOffline of the next-state relation. The following variables are not assigned: broker_state, pageserver_state, safekeeper_state. + +@!@!@ENDMSG 2109 @!@!@ +@!@!@STARTMSG 2121:1 @!@!@ +The behavior up to this point is: +@!@!@ENDMSG 2121 @!@!@ +@!@!@STARTMSG 2217:4 @!@!@ +1: +/\ pageserver_state = (p1 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0]), last_record_lsn |-> 0, preferred_sk |-> NULL] @@ p2 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0]), last_record_lsn |-> 0, preferred_sk |-> NULL]) +/\ broker_state = (b1 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])] @@ b2 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])] @@ b3 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])]) +/\ online = {b1, b2, b3, s1, s2, s3, p1, p2} +/\ safekeeper_state = (s1 :> [commit_lsn |-> 0, pruned_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0, pruned_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0, pruned_lsn |-> 0]) + +@!@!@ENDMSG 2217 @!@!@ +@!@!@STARTMSG 2217:4 @!@!@ +2: +/\ pageserver_state = null +/\ broker_state = null +/\ online = {b1, b2, s1, s2, p1, p2} +/\ safekeeper_state = null + +@!@!@ENDMSG 2217 @!@!@ +@!@!@STARTMSG 2201:0 @!@!@ +The coverage statistics at 2025-01-19 18:26:33 +@!@!@ENDMSG 2201 @!@!@ +@!@!@STARTMSG 2773:0 @!@!@ +: 1:1 +@!@!@ENDMSG 2773 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 35, col 5 to line 38, col 26 of module replicated: 1 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 0:2 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 40, col 22 to line 43, col 44 of module replicated: 1 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 40, col 32 to line 43, col 44 of module replicated: 2 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 41, col 9 to line 43, col 44 of module replicated: 464 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||line 41, col 12 to line 41, col 48 of module replicated: 464 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||line 42, col 12 to line 42, col 44 of module replicated: 208 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||line 43, col 12 to line 43, col 44 of module replicated: 86 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 40, col 46 to line 40, col 62 of module replicated: 2 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 0:0 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 52, col 13 to line 54, col 50 of module replicated: 0 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 55, col 8 to line 55, col 51 of module replicated: 0 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 0:0 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 60, col 8 to line 60, col 102 of module replicated: 0 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 61, col 8 to line 61, col 51 of module replicated: 0 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 0:0 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 65, col 8 to line 72, col 29 of module replicated: 0 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 73, col 8 to line 73, col 55 of module replicated: 0 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 0:0 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 82, col 13 to line 84, col 37 of module replicated: 0 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 85, col 8 to line 85, col 51 of module replicated: 0 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 0:0 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 98, col 8 to line 98, col 109 of module replicated: 0 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 99, col 8 to line 99, col 51 of module replicated: 0 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2202:0 @!@!@ +End of statistics. +@!@!@ENDMSG 2202 @!@!@ +@!@!@STARTMSG 2200:0 @!@!@ +Progress(1) at 2025-01-19 18:26:33: 2 states generated (45 s/min), 1 distinct states found (22 ds/min), 0 states left on queue. +@!@!@ENDMSG 2200 @!@!@ +@!@!@STARTMSG 2199:0 @!@!@ +2 states generated, 1 distinct states found, 0 states left on queue. +@!@!@ENDMSG 2199 @!@!@ +@!@!@STARTMSG 2194:0 @!@!@ +The depth of the complete state graph search is 1. +@!@!@ENDMSG 2194 @!@!@ +@!@!@STARTMSG 2186:0 @!@!@ +Finished in 2685ms at (2025-01-19 18:26:33) +@!@!@ENDMSG 2186 @!@!@ diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737301172627/MC.tla b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307595008/MC.tla similarity index 69% rename from storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737301172627/MC.tla rename to storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307595008/MC.tla index a2397f5d47..be5c82d29b 100644 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737301172627/MC.tla +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307595008/MC.tla @@ -22,44 +22,44 @@ az1, az2, az3 ---- \* MV CONSTANT definitions brokers -const_17373011685892000 == +const_17373075907692000 == {b1, b2, b3} ---- \* MV CONSTANT definitions safekeepers -const_17373011685893000 == +const_17373075907703000 == {s1, s2, s3} ---- \* MV CONSTANT definitions pageservers -const_17373011685894000 == +const_17373075907704000 == {p1, p2} ---- \* MV CONSTANT definitions azs -const_17373011685895000 == +const_17373075907705000 == {az1, az2, az3} ---- \* SYMMETRY definition -symm_17373011685896000 == -Permutations(const_17373011685892000) \union Permutations(const_17373011685893000) \union Permutations(const_17373011685894000) \union Permutations(const_17373011685895000) +symm_17373075907706000 == +Permutations(const_17373075907692000) \union Permutations(const_17373075907703000) \union Permutations(const_17373075907704000) \union Permutations(const_17373075907705000) ---- \* CONSTANT definitions @modelParameterConstants:4max_commit_lsn -const_17373011685897000 == +const_17373075907707000 == 2 ---- \* CONSTANT definitions @modelParameterConstants:5az_mapping -const_17373011685898000 == +const_17373075907708000 == [ az1 |-> {b1,s1,p1} , az2 |-> {b2,s2,p2} , az3 |-> {b3,s3}] ---- \* CONSTRAINT definition @modelParameterContraint:0 -constr_17373011685899000 == +constr_17373075907709000 == StateConstraint ---- ============================================================================= \* Modification History -\* Created Sun Jan 19 16:39:28 CET 2025 by cs +\* Created Sun Jan 19 18:26:30 CET 2025 by cs diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307595008/MC_TE.out b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307595008/MC_TE.out new file mode 100644 index 0000000000..cfe6177fe8 --- /dev/null +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307595008/MC_TE.out @@ -0,0 +1,164 @@ +@!@!@STARTMSG 2262:0 @!@!@ +TLC2 Version 2.19 of 08 August 2024 (rev: 5a47802) +@!@!@ENDMSG 2262 @!@!@ +@!@!@STARTMSG 2187:0 @!@!@ +Running breadth-first search Model-Checking with fp 44 and seed -6447714091281296951 with 4 workers on 8 cores with 2428MB heap and 5460MB offheap memory [pid: 11418] (Mac OS X 10.16 x86_64, AdoptOpenJDK 14.0.1 x86_64, OffHeapDiskFPSet, DiskStateQueue). +@!@!@ENDMSG 2187 @!@!@ +@!@!@STARTMSG 2220:0 @!@!@ +Starting SANY... +@!@!@ENDMSG 2220 @!@!@ +Parsing file /Users/cs/src/neon/storage_broker/spec/replicated/replicated.toolbox/Model_1/MC.tla +Parsing file /Users/cs/src/neon/storage_broker/spec/replicated/replicated.toolbox/Model_1/replicated.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/TLC.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Integers.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/FiniteSets.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Naturals.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Sequences.tla +Semantic processing of module Naturals +Semantic processing of module Integers +Semantic processing of module Sequences +Semantic processing of module FiniteSets +Semantic processing of module replicated +Semantic processing of module TLC +Semantic processing of module MC +@!@!@STARTMSG 2219:0 @!@!@ +SANY finished. +@!@!@ENDMSG 2219 @!@!@ +@!@!@STARTMSG 2185:0 @!@!@ +Starting... (2025-01-19 18:26:32) +@!@!@ENDMSG 2185 @!@!@ +@!@!@STARTMSG 2140:3 @!@!@ +The subscript of the next-state relation specified by the specification +does not seem to contain the state variable online +@!@!@ENDMSG 2140 @!@!@ +@!@!@STARTMSG 2279:3 @!@!@ +Declaring symmetry during liveness checking is dangerous. It might cause TLC to miss violations of the stated liveness properties. Please check liveness without symmetry defined. +@!@!@ENDMSG 2279 @!@!@ +@!@!@STARTMSG 2284:3 @!@!@ +Declaring state or action constraints during liveness checking is dangerous: Please read section 14.3.5 on page 247 of Specifying Systems (https://lamport.azurewebsites.net/tla/book.html) and optionally the discussion at https://discuss.tlapl.us/msg00994.html for more details. +@!@!@ENDMSG 2284 @!@!@ +@!@!@STARTMSG 2212:0 @!@!@ +Implied-temporal checking--satisfiability problem has 1 branches. +@!@!@ENDMSG 2212 @!@!@ +@!@!@STARTMSG 2189:0 @!@!@ +Computing initial states... +@!@!@ENDMSG 2189 @!@!@ +@!@!@STARTMSG 2190:0 @!@!@ +Finished computing initial states: 1 distinct state generated at 2025-01-19 18:26:33. +@!@!@ENDMSG 2190 @!@!@ +@!@!@STARTMSG 2109:1 @!@!@ +Successor state is not completely specified by action NodeOnlineOffline of the next-state relation. The following variables are not assigned: broker_state, pageserver_state, safekeeper_state. + +@!@!@ENDMSG 2109 @!@!@ +@!@!@STARTMSG 2121:1 @!@!@ +The behavior up to this point is: +@!@!@ENDMSG 2121 @!@!@ +@!@!@STARTMSG 2217:4 @!@!@ +1: +/\ pageserver_state = (p1 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0]), last_record_lsn |-> 0, preferred_sk |-> NULL] @@ p2 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0]), last_record_lsn |-> 0, preferred_sk |-> NULL]) +/\ broker_state = (b1 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])] @@ b2 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])] @@ b3 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])]) +/\ online = {b1, b2, b3, s1, s2, s3, p1, p2} +/\ safekeeper_state = (s1 :> [commit_lsn |-> 0, pruned_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0, pruned_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0, pruned_lsn |-> 0]) + +@!@!@ENDMSG 2217 @!@!@ +@!@!@STARTMSG 2217:4 @!@!@ +2: +/\ pageserver_state = null +/\ broker_state = null +/\ online = {b1, b2, s1, s2, p1, p2} +/\ safekeeper_state = null + +@!@!@ENDMSG 2217 @!@!@ +@!@!@STARTMSG 2201:0 @!@!@ +The coverage statistics at 2025-01-19 18:26:33 +@!@!@ENDMSG 2201 @!@!@ +@!@!@STARTMSG 2773:0 @!@!@ +: 1:1 +@!@!@ENDMSG 2773 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 35, col 5 to line 38, col 26 of module replicated: 1 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 0:2 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 40, col 22 to line 43, col 44 of module replicated: 1 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 40, col 32 to line 43, col 44 of module replicated: 2 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 41, col 9 to line 43, col 44 of module replicated: 464 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||line 41, col 12 to line 41, col 48 of module replicated: 464 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||line 42, col 12 to line 42, col 44 of module replicated: 208 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||line 43, col 12 to line 43, col 44 of module replicated: 86 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 40, col 46 to line 40, col 62 of module replicated: 2 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 0:0 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 52, col 13 to line 54, col 50 of module replicated: 0 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 55, col 8 to line 55, col 51 of module replicated: 0 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 0:0 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 60, col 8 to line 60, col 102 of module replicated: 0 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 61, col 8 to line 61, col 51 of module replicated: 0 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 0:0 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 65, col 8 to line 72, col 29 of module replicated: 0 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 73, col 8 to line 73, col 55 of module replicated: 0 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 0:0 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 82, col 13 to line 84, col 37 of module replicated: 0 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 85, col 8 to line 85, col 51 of module replicated: 0 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 0:0 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 98, col 8 to line 98, col 109 of module replicated: 0 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 99, col 8 to line 99, col 51 of module replicated: 0 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2202:0 @!@!@ +End of statistics. +@!@!@ENDMSG 2202 @!@!@ +@!@!@STARTMSG 2200:0 @!@!@ +Progress(1) at 2025-01-19 18:26:33: 2 states generated (45 s/min), 1 distinct states found (22 ds/min), 0 states left on queue. +@!@!@ENDMSG 2200 @!@!@ +@!@!@STARTMSG 2199:0 @!@!@ +2 states generated, 1 distinct states found, 0 states left on queue. +@!@!@ENDMSG 2199 @!@!@ +@!@!@STARTMSG 2194:0 @!@!@ +The depth of the complete state graph search is 1. +@!@!@ENDMSG 2194 @!@!@ +@!@!@STARTMSG 2186:0 @!@!@ +Finished in 2685ms at (2025-01-19 18:26:33) +@!@!@ENDMSG 2186 @!@!@ diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737301223409/replicated.tla b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307595008/replicated.tla similarity index 82% rename from storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737301223409/replicated.tla rename to storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307595008/replicated.tla index 14910364fe..0bd0ed6d91 100644 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737301223409/replicated.tla +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307595008/replicated.tla @@ -1,8 +1,8 @@ ---- MODULE replicated ---- -EXTENDS Integers +EXTENDS Integers, FiniteSets -VARIABLES broker_state, safekeeper_state, pageserver_state +VARIABLES broker_state, safekeeper_state, pageserver_state, online CONSTANT @@ -29,14 +29,21 @@ StateConstraint == InitSafekeeper == [pruned_lsn |-> 0, commit_lsn |-> 0] InitBroker == [sk |-> [s \in safekeepers |-> [commit_lsn |-> 0]]] InitPageserver == [last_record_lsn |-> 0, preferred_sk |-> NULL, sk |-> [s \in safekeepers |-> [commit_lsn |-> 0]]] +InitOnline == safekeepers \cup brokers \cup pageservers Init == /\ broker_state = [b \in brokers |-> InitBroker] /\ safekeeper_state = [s \in safekeepers |-> InitSafekeeper] /\ pageserver_state = [p \in pageservers |-> InitPageserver] + /\ online = InitOnline +NodeOnlineOffline == online' = CHOOSE ss \in SUBSET InitOnline: + /\ Cardinality(ss \cap safekeepers) >= 2 + /\ Cardinality(ss \cap brokers) >= 2 + /\ ss \cap pageservers = pageservers \* assume no PS failures for now SkCommit(s1, s2) == + /\ {s1, s2} \subseteq online /\ s1 # s2 /\ safekeeper_state[s1].commit_lsn = safekeeper_state[s2].commit_lsn /\ LET @@ -48,11 +55,13 @@ SkCommit(s1, s2) == /\ UNCHANGED <> SkPeerRecovery(s1,s2) == + /\ {s1, s2} \subseteq online /\ safekeeper_state[s1].commit_lsn < safekeeper_state[s2].commit_lsn /\ safekeeper_state' = [safekeeper_state EXCEPT![s1].commit_lsn = safekeeper_state[s2].commit_lsn] /\ UNCHANGED <> SkPushToBroker(s,b) == + /\ {s, b} \subseteq online /\ broker_state' = IF broker_state[b].sk[s].commit_lsn < safekeeper_state[s].commit_lsn THEN LET @@ -64,6 +73,7 @@ SkPushToBroker(s,b) == /\ UNCHANGED <> PsRecvBroker(b,p,s) == + /\ {b,p,s} \subseteq online /\ LET bsk == broker_state[b].sk[s] psk == pageserver_state[p].sk[s] @@ -76,10 +86,12 @@ PsRecvBroker(b,p,s) == SksWithNewerWal(p) == - LET - ps == pageserver_state[p] - IN - {s \in DOMAIN ps.sk: ps.sk[s].commit_lsn > ps.last_record_lsn} + /\ {p} \subseteq online + /\ + LET + ps == pageserver_state[p] + IN + {s \in DOMAIN ps.sk: ps.sk[s].commit_lsn > ps.last_record_lsn} PsChooseSk(p) == /\ SksWithNewerWal(p) # {} @@ -88,7 +100,7 @@ PsChooseSk(p) == Next == - + \/ NodeOnlineOffline \/ \E s1 \in safekeepers: \E s2 \in safekeepers: \/ SkCommit(s1, s2) \/ SkPeerRecovery(s1, s2) diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737301223409/MC.cfg b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307621596/MC.cfg similarity index 66% rename from storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737301223409/MC.cfg rename to storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307621596/MC.cfg index 1dcac21267..c3df677c50 100644 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737301223409/MC.cfg +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307621596/MC.cfg @@ -19,33 +19,33 @@ az2 = az2 az3 = az3 \* MV CONSTANT definitions CONSTANT -brokers <- const_17373012151752000 +brokers <- const_173730761739711000 \* CONSTANT declarations CONSTANT NULL = NULL \* MV CONSTANT definitions CONSTANT -safekeepers <- const_17373012151763000 +safekeepers <- const_173730761739712000 \* MV CONSTANT definitions CONSTANT -pageservers <- const_17373012151764000 +pageservers <- const_173730761739713000 \* MV CONSTANT definitions CONSTANT -azs <- const_17373012151765000 +azs <- const_173730761739714000 \* SYMMETRY definition -SYMMETRY symm_17373012151766000 +SYMMETRY symm_173730761739715000 \* CONSTANT definitions CONSTANT -max_commit_lsn <- const_17373012151767000 +max_commit_lsn <- const_173730761739716000 \* CONSTANT definitions CONSTANT -az_mapping <- const_17373012151768000 +az_mapping <- const_173730761739717000 \* CONSTRAINT definition CONSTRAINT -constr_17373012151769000 +constr_173730761739718000 \* SPECIFICATION definition SPECIFICATION Spec \* PROPERTY definition PROPERTY EventuallyLaggingSkIsNotPreferredSk -\* Generated on Sun Jan 19 16:40:15 CET 2025 \ No newline at end of file +\* Generated on Sun Jan 19 18:26:57 CET 2025 \ No newline at end of file diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307621596/MC.out b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307621596/MC.out new file mode 100644 index 0000000000..a6e6eeecc3 --- /dev/null +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307621596/MC.out @@ -0,0 +1,174 @@ +@!@!@STARTMSG 2262:0 @!@!@ +TLC2 Version 2.19 of 08 August 2024 (rev: 5a47802) +@!@!@ENDMSG 2262 @!@!@ +@!@!@STARTMSG 2187:0 @!@!@ +Running breadth-first search Model-Checking with fp 92 and seed -7531418498003009516 with 4 workers on 8 cores with 2428MB heap and 5460MB offheap memory [pid: 11444] (Mac OS X 10.16 x86_64, AdoptOpenJDK 14.0.1 x86_64, OffHeapDiskFPSet, DiskStateQueue). +@!@!@ENDMSG 2187 @!@!@ +@!@!@STARTMSG 2220:0 @!@!@ +Starting SANY... +@!@!@ENDMSG 2220 @!@!@ +Parsing file /Users/cs/src/neon/storage_broker/spec/replicated/replicated.toolbox/Model_1/MC.tla +Parsing file /Users/cs/src/neon/storage_broker/spec/replicated/replicated.toolbox/Model_1/replicated.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/TLC.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Integers.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/FiniteSets.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Naturals.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Sequences.tla +Semantic processing of module Naturals +Semantic processing of module Integers +Semantic processing of module Sequences +Semantic processing of module FiniteSets +Semantic processing of module replicated +Semantic processing of module TLC +Semantic processing of module MC +@!@!@STARTMSG 2219:0 @!@!@ +SANY finished. +@!@!@ENDMSG 2219 @!@!@ +@!@!@STARTMSG 2185:0 @!@!@ +Starting... (2025-01-19 18:26:58) +@!@!@ENDMSG 2185 @!@!@ +@!@!@STARTMSG 2140:3 @!@!@ +The subscript of the next-state relation specified by the specification +does not seem to contain the state variable online +@!@!@ENDMSG 2140 @!@!@ +@!@!@STARTMSG 2279:3 @!@!@ +Declaring symmetry during liveness checking is dangerous. It might cause TLC to miss violations of the stated liveness properties. Please check liveness without symmetry defined. +@!@!@ENDMSG 2279 @!@!@ +@!@!@STARTMSG 2284:3 @!@!@ +Declaring state or action constraints during liveness checking is dangerous: Please read section 14.3.5 on page 247 of Specifying Systems (https://lamport.azurewebsites.net/tla/book.html) and optionally the discussion at https://discuss.tlapl.us/msg00994.html for more details. +@!@!@ENDMSG 2284 @!@!@ +@!@!@STARTMSG 2212:0 @!@!@ +Implied-temporal checking--satisfiability problem has 1 branches. +@!@!@ENDMSG 2212 @!@!@ +@!@!@STARTMSG 2189:0 @!@!@ +Computing initial states... +@!@!@ENDMSG 2189 @!@!@ +@!@!@STARTMSG 2190:0 @!@!@ +Finished computing initial states: 1 distinct state generated at 2025-01-19 18:27:00. +@!@!@ENDMSG 2190 @!@!@ +@!@!@STARTMSG 1000:1 @!@!@ +TLC threw an unexpected exception. +This was probably caused by an error in the spec or model. +See the User Output or TLC Console for clues to what happened. +The exception was a java.lang.RuntimeException +: @!@!@STARTMSG 2280:0 @!@!@ +In evaluation, the identifier safekeeper_state is either undefined or not an operator. +line 44, col 24 to line 44, col 39 of module replicated +@!@!@ENDMSG 2280 @!@!@ +@!@!@ENDMSG 1000 @!@!@ +@!@!@STARTMSG 2121:1 @!@!@ +The behavior up to this point is: +@!@!@ENDMSG 2121 @!@!@ +@!@!@STARTMSG 2217:4 @!@!@ +1: +/\ pageserver_state = (p1 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0]), last_record_lsn |-> 0, preferred_sk |-> NULL] @@ p2 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0]), last_record_lsn |-> 0, preferred_sk |-> NULL]) +/\ broker_state = (b1 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])] @@ b2 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])] @@ b3 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])]) +/\ online = {b1, b2, b3, s1, s2, s3, p1, p2} +/\ safekeeper_state = (s1 :> [commit_lsn |-> 0, pruned_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0, pruned_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0, pruned_lsn |-> 0]) + +@!@!@ENDMSG 2217 @!@!@ +@!@!@STARTMSG 2103:1 @!@!@ +The error occurred when TLC was evaluating the nested +expressions at the following positions: +0. Line 40, column 22 to line 44, column 71 in replicated +1. Line 40, column 32 to line 44, column 71 in replicated +2. Line 41, column 9 to line 44, column 71 in replicated +3. Line 44, column 12 to line 44, column 71 in replicated +4. Line 44, column 22 to line 44, column 71 in replicated +5. Line 44, column 24 to line 44, column 39 in replicated + + +@!@!@ENDMSG 2103 @!@!@ +@!@!@STARTMSG 2201:0 @!@!@ +The coverage statistics at 2025-01-19 18:27:00 +@!@!@ENDMSG 2201 @!@!@ +@!@!@STARTMSG 2773:0 @!@!@ +: 1:1 +@!@!@ENDMSG 2773 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 35, col 5 to line 38, col 26 of module replicated: 1 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 0:0 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 40, col 22 to line 44, col 71 of module replicated: 0 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 40, col 32 to line 44, col 71 of module replicated: 2 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 41, col 9 to line 44, col 71 of module replicated: 464 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||line 41, col 12 to line 41, col 48 of module replicated: 464 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||line 42, col 12 to line 42, col 44 of module replicated: 208 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||line 43, col 12 to line 43, col 44 of module replicated: 86 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||line 44, col 12 to line 44, col 71 of module replicated: 2 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 40, col 46 to line 40, col 62 of module replicated: 2 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 0:0 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 53, col 13 to line 55, col 50 of module replicated: 0 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 56, col 8 to line 56, col 51 of module replicated: 0 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 0:0 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 61, col 8 to line 61, col 102 of module replicated: 0 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 62, col 8 to line 62, col 51 of module replicated: 0 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 0:0 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 66, col 8 to line 73, col 29 of module replicated: 0 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 74, col 8 to line 74, col 55 of module replicated: 0 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 0:0 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 83, col 13 to line 85, col 37 of module replicated: 0 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 86, col 8 to line 86, col 51 of module replicated: 0 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 0:0 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 99, col 8 to line 99, col 109 of module replicated: 0 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 100, col 8 to line 100, col 51 of module replicated: 0 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2202:0 @!@!@ +End of statistics. +@!@!@ENDMSG 2202 @!@!@ +@!@!@STARTMSG 2200:0 @!@!@ +Progress(1) at 2025-01-19 18:27:00: 1 states generated (24 s/min), 1 distinct states found (24 ds/min), 0 states left on queue. +@!@!@ENDMSG 2200 @!@!@ +@!@!@STARTMSG 2199:0 @!@!@ +1 states generated, 1 distinct states found, 0 states left on queue. +@!@!@ENDMSG 2199 @!@!@ +@!@!@STARTMSG 2186:0 @!@!@ +Finished in 2483ms at (2025-01-19 18:27:00) +@!@!@ENDMSG 2186 @!@!@ diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737301223409/MC.tla b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307621596/MC.tla similarity index 68% rename from storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737301223409/MC.tla rename to storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307621596/MC.tla index 316c6f4df7..2e29df8219 100644 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737301223409/MC.tla +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307621596/MC.tla @@ -22,44 +22,44 @@ az1, az2, az3 ---- \* MV CONSTANT definitions brokers -const_17373012151752000 == +const_173730761739711000 == {b1, b2, b3} ---- \* MV CONSTANT definitions safekeepers -const_17373012151763000 == +const_173730761739712000 == {s1, s2, s3} ---- \* MV CONSTANT definitions pageservers -const_17373012151764000 == +const_173730761739713000 == {p1, p2} ---- \* MV CONSTANT definitions azs -const_17373012151765000 == +const_173730761739714000 == {az1, az2, az3} ---- \* SYMMETRY definition -symm_17373012151766000 == -Permutations(const_17373012151752000) \union Permutations(const_17373012151763000) \union Permutations(const_17373012151764000) \union Permutations(const_17373012151765000) +symm_173730761739715000 == +Permutations(const_173730761739711000) \union Permutations(const_173730761739712000) \union Permutations(const_173730761739713000) \union Permutations(const_173730761739714000) ---- \* CONSTANT definitions @modelParameterConstants:4max_commit_lsn -const_17373012151767000 == +const_173730761739716000 == 2 ---- \* CONSTANT definitions @modelParameterConstants:5az_mapping -const_17373012151768000 == +const_173730761739717000 == [ az1 |-> {b1,s1,p1} , az2 |-> {b2,s2,p2} , az3 |-> {b3,s3}] ---- \* CONSTRAINT definition @modelParameterContraint:0 -constr_17373012151769000 == +constr_173730761739718000 == StateConstraint ---- ============================================================================= \* Modification History -\* Created Sun Jan 19 16:40:15 CET 2025 by cs +\* Created Sun Jan 19 18:26:57 CET 2025 by cs diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307621596/MC_TE.out b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307621596/MC_TE.out new file mode 100644 index 0000000000..a6e6eeecc3 --- /dev/null +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307621596/MC_TE.out @@ -0,0 +1,174 @@ +@!@!@STARTMSG 2262:0 @!@!@ +TLC2 Version 2.19 of 08 August 2024 (rev: 5a47802) +@!@!@ENDMSG 2262 @!@!@ +@!@!@STARTMSG 2187:0 @!@!@ +Running breadth-first search Model-Checking with fp 92 and seed -7531418498003009516 with 4 workers on 8 cores with 2428MB heap and 5460MB offheap memory [pid: 11444] (Mac OS X 10.16 x86_64, AdoptOpenJDK 14.0.1 x86_64, OffHeapDiskFPSet, DiskStateQueue). +@!@!@ENDMSG 2187 @!@!@ +@!@!@STARTMSG 2220:0 @!@!@ +Starting SANY... +@!@!@ENDMSG 2220 @!@!@ +Parsing file /Users/cs/src/neon/storage_broker/spec/replicated/replicated.toolbox/Model_1/MC.tla +Parsing file /Users/cs/src/neon/storage_broker/spec/replicated/replicated.toolbox/Model_1/replicated.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/TLC.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Integers.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/FiniteSets.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Naturals.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Sequences.tla +Semantic processing of module Naturals +Semantic processing of module Integers +Semantic processing of module Sequences +Semantic processing of module FiniteSets +Semantic processing of module replicated +Semantic processing of module TLC +Semantic processing of module MC +@!@!@STARTMSG 2219:0 @!@!@ +SANY finished. +@!@!@ENDMSG 2219 @!@!@ +@!@!@STARTMSG 2185:0 @!@!@ +Starting... (2025-01-19 18:26:58) +@!@!@ENDMSG 2185 @!@!@ +@!@!@STARTMSG 2140:3 @!@!@ +The subscript of the next-state relation specified by the specification +does not seem to contain the state variable online +@!@!@ENDMSG 2140 @!@!@ +@!@!@STARTMSG 2279:3 @!@!@ +Declaring symmetry during liveness checking is dangerous. It might cause TLC to miss violations of the stated liveness properties. Please check liveness without symmetry defined. +@!@!@ENDMSG 2279 @!@!@ +@!@!@STARTMSG 2284:3 @!@!@ +Declaring state or action constraints during liveness checking is dangerous: Please read section 14.3.5 on page 247 of Specifying Systems (https://lamport.azurewebsites.net/tla/book.html) and optionally the discussion at https://discuss.tlapl.us/msg00994.html for more details. +@!@!@ENDMSG 2284 @!@!@ +@!@!@STARTMSG 2212:0 @!@!@ +Implied-temporal checking--satisfiability problem has 1 branches. +@!@!@ENDMSG 2212 @!@!@ +@!@!@STARTMSG 2189:0 @!@!@ +Computing initial states... +@!@!@ENDMSG 2189 @!@!@ +@!@!@STARTMSG 2190:0 @!@!@ +Finished computing initial states: 1 distinct state generated at 2025-01-19 18:27:00. +@!@!@ENDMSG 2190 @!@!@ +@!@!@STARTMSG 1000:1 @!@!@ +TLC threw an unexpected exception. +This was probably caused by an error in the spec or model. +See the User Output or TLC Console for clues to what happened. +The exception was a java.lang.RuntimeException +: @!@!@STARTMSG 2280:0 @!@!@ +In evaluation, the identifier safekeeper_state is either undefined or not an operator. +line 44, col 24 to line 44, col 39 of module replicated +@!@!@ENDMSG 2280 @!@!@ +@!@!@ENDMSG 1000 @!@!@ +@!@!@STARTMSG 2121:1 @!@!@ +The behavior up to this point is: +@!@!@ENDMSG 2121 @!@!@ +@!@!@STARTMSG 2217:4 @!@!@ +1: +/\ pageserver_state = (p1 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0]), last_record_lsn |-> 0, preferred_sk |-> NULL] @@ p2 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0]), last_record_lsn |-> 0, preferred_sk |-> NULL]) +/\ broker_state = (b1 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])] @@ b2 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])] @@ b3 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])]) +/\ online = {b1, b2, b3, s1, s2, s3, p1, p2} +/\ safekeeper_state = (s1 :> [commit_lsn |-> 0, pruned_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0, pruned_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0, pruned_lsn |-> 0]) + +@!@!@ENDMSG 2217 @!@!@ +@!@!@STARTMSG 2103:1 @!@!@ +The error occurred when TLC was evaluating the nested +expressions at the following positions: +0. Line 40, column 22 to line 44, column 71 in replicated +1. Line 40, column 32 to line 44, column 71 in replicated +2. Line 41, column 9 to line 44, column 71 in replicated +3. Line 44, column 12 to line 44, column 71 in replicated +4. Line 44, column 22 to line 44, column 71 in replicated +5. Line 44, column 24 to line 44, column 39 in replicated + + +@!@!@ENDMSG 2103 @!@!@ +@!@!@STARTMSG 2201:0 @!@!@ +The coverage statistics at 2025-01-19 18:27:00 +@!@!@ENDMSG 2201 @!@!@ +@!@!@STARTMSG 2773:0 @!@!@ +: 1:1 +@!@!@ENDMSG 2773 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 35, col 5 to line 38, col 26 of module replicated: 1 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 0:0 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 40, col 22 to line 44, col 71 of module replicated: 0 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 40, col 32 to line 44, col 71 of module replicated: 2 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 41, col 9 to line 44, col 71 of module replicated: 464 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||line 41, col 12 to line 41, col 48 of module replicated: 464 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||line 42, col 12 to line 42, col 44 of module replicated: 208 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||line 43, col 12 to line 43, col 44 of module replicated: 86 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||line 44, col 12 to line 44, col 71 of module replicated: 2 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 40, col 46 to line 40, col 62 of module replicated: 2 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 0:0 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 53, col 13 to line 55, col 50 of module replicated: 0 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 56, col 8 to line 56, col 51 of module replicated: 0 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 0:0 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 61, col 8 to line 61, col 102 of module replicated: 0 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 62, col 8 to line 62, col 51 of module replicated: 0 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 0:0 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 66, col 8 to line 73, col 29 of module replicated: 0 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 74, col 8 to line 74, col 55 of module replicated: 0 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 0:0 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 83, col 13 to line 85, col 37 of module replicated: 0 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 86, col 8 to line 86, col 51 of module replicated: 0 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 0:0 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 99, col 8 to line 99, col 109 of module replicated: 0 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 100, col 8 to line 100, col 51 of module replicated: 0 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2202:0 @!@!@ +End of statistics. +@!@!@ENDMSG 2202 @!@!@ +@!@!@STARTMSG 2200:0 @!@!@ +Progress(1) at 2025-01-19 18:27:00: 1 states generated (24 s/min), 1 distinct states found (24 ds/min), 0 states left on queue. +@!@!@ENDMSG 2200 @!@!@ +@!@!@STARTMSG 2199:0 @!@!@ +1 states generated, 1 distinct states found, 0 states left on queue. +@!@!@ENDMSG 2199 @!@!@ +@!@!@STARTMSG 2186:0 @!@!@ +Finished in 2483ms at (2025-01-19 18:27:00) +@!@!@ENDMSG 2186 @!@!@ diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737301172627/replicated.tla b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307621596/replicated.tla similarity index 81% rename from storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737301172627/replicated.tla rename to storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307621596/replicated.tla index 14910364fe..2b7501f8a1 100644 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737301172627/replicated.tla +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307621596/replicated.tla @@ -1,8 +1,8 @@ ---- MODULE replicated ---- -EXTENDS Integers +EXTENDS Integers, FiniteSets -VARIABLES broker_state, safekeeper_state, pageserver_state +VARIABLES broker_state, safekeeper_state, pageserver_state, online CONSTANT @@ -29,14 +29,22 @@ StateConstraint == InitSafekeeper == [pruned_lsn |-> 0, commit_lsn |-> 0] InitBroker == [sk |-> [s \in safekeepers |-> [commit_lsn |-> 0]]] InitPageserver == [last_record_lsn |-> 0, preferred_sk |-> NULL, sk |-> [s \in safekeepers |-> [commit_lsn |-> 0]]] +InitOnline == safekeepers \cup brokers \cup pageservers Init == /\ broker_state = [b \in brokers |-> InitBroker] /\ safekeeper_state = [s \in safekeepers |-> InitSafekeeper] /\ pageserver_state = [p \in pageservers |-> InitPageserver] + /\ online = InitOnline +NodeOnlineOffline == online' = CHOOSE ss \in SUBSET InitOnline: + /\ Cardinality(ss \cap safekeepers) >= 2 + /\ Cardinality(ss \cap brokers) >= 2 + /\ ss \cap pageservers = pageservers \* assume no PS failures for now + /\ UNCHANGED <> SkCommit(s1, s2) == + /\ {s1, s2} \subseteq online /\ s1 # s2 /\ safekeeper_state[s1].commit_lsn = safekeeper_state[s2].commit_lsn /\ LET @@ -48,11 +56,13 @@ SkCommit(s1, s2) == /\ UNCHANGED <> SkPeerRecovery(s1,s2) == + /\ {s1, s2} \subseteq online /\ safekeeper_state[s1].commit_lsn < safekeeper_state[s2].commit_lsn /\ safekeeper_state' = [safekeeper_state EXCEPT![s1].commit_lsn = safekeeper_state[s2].commit_lsn] /\ UNCHANGED <> SkPushToBroker(s,b) == + /\ {s, b} \subseteq online /\ broker_state' = IF broker_state[b].sk[s].commit_lsn < safekeeper_state[s].commit_lsn THEN LET @@ -64,6 +74,7 @@ SkPushToBroker(s,b) == /\ UNCHANGED <> PsRecvBroker(b,p,s) == + /\ {b,p,s} \subseteq online /\ LET bsk == broker_state[b].sk[s] psk == pageserver_state[p].sk[s] @@ -76,10 +87,12 @@ PsRecvBroker(b,p,s) == SksWithNewerWal(p) == - LET - ps == pageserver_state[p] - IN - {s \in DOMAIN ps.sk: ps.sk[s].commit_lsn > ps.last_record_lsn} + /\ {p} \subseteq online + /\ + LET + ps == pageserver_state[p] + IN + {s \in DOMAIN ps.sk: ps.sk[s].commit_lsn > ps.last_record_lsn} PsChooseSk(p) == /\ SksWithNewerWal(p) # {} @@ -88,7 +101,7 @@ PsChooseSk(p) == Next == - + \/ NodeOnlineOffline \/ \E s1 \in safekeepers: \E s2 \in safekeepers: \/ SkCommit(s1, s2) \/ SkPeerRecovery(s1, s2) diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299469039/MC.cfg b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307660221/MC.cfg similarity index 66% rename from storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299469039/MC.cfg rename to storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307660221/MC.cfg index 3de9dad2e7..d73d7b9017 100644 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299469039/MC.cfg +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307660221/MC.cfg @@ -19,33 +19,33 @@ az2 = az2 az3 = az3 \* MV CONSTANT definitions CONSTANT -brokers <- const_1737299464992221000 +brokers <- const_173730765610820000 \* CONSTANT declarations CONSTANT NULL = NULL \* MV CONSTANT definitions CONSTANT -safekeepers <- const_1737299464992222000 +safekeepers <- const_173730765610821000 \* MV CONSTANT definitions CONSTANT -pageservers <- const_1737299464992223000 +pageservers <- const_173730765610822000 \* MV CONSTANT definitions CONSTANT -azs <- const_1737299464992224000 +azs <- const_173730765610823000 \* SYMMETRY definition -SYMMETRY symm_1737299464992225000 +SYMMETRY symm_173730765610824000 \* CONSTANT definitions CONSTANT -max_commit_lsn <- const_1737299464992226000 +max_commit_lsn <- const_173730765610825000 \* CONSTANT definitions CONSTANT -az_mapping <- const_1737299464992227000 +az_mapping <- const_173730765610826000 \* CONSTRAINT definition CONSTRAINT -constr_1737299464992228000 +constr_173730765610827000 \* SPECIFICATION definition SPECIFICATION Spec \* PROPERTY definition PROPERTY EventuallyLaggingSkIsNotPreferredSk -\* Generated on Sun Jan 19 16:11:04 CET 2025 \ No newline at end of file +\* Generated on Sun Jan 19 18:27:36 CET 2025 \ No newline at end of file diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299381423/MC.out b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307660221/MC.out similarity index 58% rename from storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299381423/MC.out rename to storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307660221/MC.out index 7760635dfb..43fc616158 100644 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299381423/MC.out +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307660221/MC.out @@ -2,31 +2,35 @@ TLC2 Version 2.19 of 08 August 2024 (rev: 5a47802) @!@!@ENDMSG 2262 @!@!@ @!@!@STARTMSG 2187:0 @!@!@ -Running breadth-first search Model-Checking with fp 3 and seed -7432767478319300652 with 4 workers on 8 cores with 2428MB heap and 5460MB offheap memory [pid: 7681] (Mac OS X 10.16 x86_64, AdoptOpenJDK 14.0.1 x86_64, OffHeapDiskFPSet, DiskStateQueue). +Running breadth-first search Model-Checking with fp 70 and seed -383534902230932382 with 4 workers on 8 cores with 2428MB heap and 5460MB offheap memory [pid: 11483] (Mac OS X 10.16 x86_64, AdoptOpenJDK 14.0.1 x86_64, OffHeapDiskFPSet, DiskStateQueue). @!@!@ENDMSG 2187 @!@!@ @!@!@STARTMSG 2220:0 @!@!@ Starting SANY... @!@!@ENDMSG 2220 @!@!@ -Parsing file /Users/cs/Desktop/broker/fullmesh/fullmesh.toolbox/Model_1/MC.tla -Parsing file /Users/cs/Desktop/broker/fullmesh/fullmesh.toolbox/Model_1/fullmesh.tla +Parsing file /Users/cs/src/neon/storage_broker/spec/replicated/replicated.toolbox/Model_1/MC.tla +Parsing file /Users/cs/src/neon/storage_broker/spec/replicated/replicated.toolbox/Model_1/replicated.tla Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/TLC.tla Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Integers.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/FiniteSets.tla Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Naturals.tla Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Sequences.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/FiniteSets.tla Semantic processing of module Naturals Semantic processing of module Integers -Semantic processing of module fullmesh Semantic processing of module Sequences Semantic processing of module FiniteSets +Semantic processing of module replicated Semantic processing of module TLC Semantic processing of module MC @!@!@STARTMSG 2219:0 @!@!@ SANY finished. @!@!@ENDMSG 2219 @!@!@ @!@!@STARTMSG 2185:0 @!@!@ -Starting... (2025-01-19 16:09:38) +Starting... (2025-01-19 18:27:37) @!@!@ENDMSG 2185 @!@!@ +@!@!@STARTMSG 2140:3 @!@!@ +The subscript of the next-state relation specified by the specification +does not seem to contain the state variable online +@!@!@ENDMSG 2140 @!@!@ @!@!@STARTMSG 2279:3 @!@!@ Declaring symmetry during liveness checking is dangerous. It might cause TLC to miss violations of the stated liveness properties. Please check liveness without symmetry defined. @!@!@ENDMSG 2279 @!@!@ @@ -40,10 +44,10 @@ Implied-temporal checking--satisfiability problem has 1 branches. Computing initial states... @!@!@ENDMSG 2189 @!@!@ @!@!@STARTMSG 2190:0 @!@!@ -Finished computing initial states: 1 distinct state generated at 2025-01-19 16:09:40. +Finished computing initial states: 1 distinct state generated at 2025-01-19 18:27:38. @!@!@ENDMSG 2190 @!@!@ @!@!@STARTMSG 2109:1 @!@!@ -Successor state is not completely specified by action SkPeerRecovery of the next-state relation. The following variables are not assigned: broker_state, pageserver_state. +Successor state is not completely specified by action SkCommit of the next-state relation. The following variable is not assigned: online. @!@!@ENDMSG 2109 @!@!@ @!@!@STARTMSG 2121:1 @!@!@ @@ -53,134 +57,147 @@ The behavior up to this point is: 1: /\ pageserver_state = (p1 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0]), last_record_lsn |-> 0, preferred_sk |-> NULL] @@ p2 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0]), last_record_lsn |-> 0, preferred_sk |-> NULL]) /\ broker_state = (b1 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])] @@ b2 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])] @@ b3 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])]) +/\ online = {b1, b2, b3, s1, s2, s3, p1, p2} /\ safekeeper_state = (s1 :> [commit_lsn |-> 0, pruned_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0, pruned_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0, pruned_lsn |-> 0]) @!@!@ENDMSG 2217 @!@!@ @!@!@STARTMSG 2217:4 @!@!@ -2: +2: /\ pageserver_state = (p1 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0]), last_record_lsn |-> 0, preferred_sk |-> NULL] @@ p2 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0]), last_record_lsn |-> 0, preferred_sk |-> NULL]) /\ broker_state = (b1 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])] @@ b2 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])] @@ b3 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])]) -/\ safekeeper_state = (s1 :> [commit_lsn |-> 1, pruned_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0, pruned_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0, pruned_lsn |-> 0]) - -@!@!@ENDMSG 2217 @!@!@ -@!@!@STARTMSG 2217:4 @!@!@ -3: -/\ pageserver_state = null -/\ broker_state = null +/\ online = null /\ safekeeper_state = (s1 :> [commit_lsn |-> 1, pruned_lsn |-> 0] @@ s2 :> [commit_lsn |-> 1, pruned_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0, pruned_lsn |-> 0]) @!@!@ENDMSG 2217 @!@!@ @!@!@STARTMSG 2201:0 @!@!@ -The coverage statistics at 2025-01-19 16:09:40 +The coverage statistics at 2025-01-19 18:27:38 @!@!@ENDMSG 2201 @!@!@ @!@!@STARTMSG 2773:0 @!@!@ -: 2:2 +: 1:1 @!@!@ENDMSG 2773 @!@!@ @!@!@STARTMSG 2221:0 @!@!@ - line 34, col 5 to line 36, col 64 of module fullmesh: 2 + line 35, col 5 to line 38, col 26 of module replicated: 1 @!@!@ENDMSG 2221 @!@!@ @!@!@STARTMSG 2772:0 @!@!@ -: 5:17 +: 1:3 @!@!@ENDMSG 2772 @!@!@ @!@!@STARTMSG 2221:0 @!@!@ - line 40, col 8 to line 40, col 72 of module fullmesh: 46 + line 41, col 8 to line 44, col 44 of module replicated: 3 @!@!@ENDMSG 2221 @!@!@ @!@!@STARTMSG 2221:0 @!@!@ - |line 40, col 8 to line 40, col 38 of module fullmesh: 29 + |line 41, col 18 to line 44, col 44 of module replicated: 3 @!@!@ENDMSG 2221 @!@!@ @!@!@STARTMSG 2221:0 @!@!@ - |line 40, col 42 to line 40, col 72 of module fullmesh: 29 + ||line 42, col 9 to line 44, col 44 of module replicated: 696 @!@!@ENDMSG 2221 @!@!@ @!@!@STARTMSG 2221:0 @!@!@ - line 44, col 13 to line 46, col 50 of module fullmesh: 17 + |||line 42, col 12 to line 42, col 48 of module replicated: 696 @!@!@ENDMSG 2221 @!@!@ @!@!@STARTMSG 2221:0 @!@!@ - line 47, col 8 to line 47, col 51 of module fullmesh: 17 + |||line 43, col 12 to line 43, col 44 of module replicated: 312 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||line 44, col 12 to line 44, col 44 of module replicated: 129 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 41, col 32 to line 41, col 48 of module replicated: 3 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 45, col 8 to line 45, col 67 of module replicated: 3 @!@!@ENDMSG 2221 @!@!@ @!@!@STARTMSG 2772:0 @!@!@ -: 0:4 +: 0:3 @!@!@ENDMSG 2772 @!@!@ @!@!@STARTMSG 2221:0 @!@!@ - line 50, col 8 to line 50, col 72 of module fullmesh: 1 + line 48, col 8 to line 48, col 32 of module replicated: 7 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2775:0 @!@!@ + |line 48, col 8 to line 48, col 15 of module replicated: 6:15 +@!@!@ENDMSG 2775 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 48, col 27 to line 48, col 32 of module replicated: 6 @!@!@ENDMSG 2221 @!@!@ @!@!@STARTMSG 2221:0 @!@!@ - |line 50, col 8 to line 50, col 38 of module fullmesh: 28 + line 49, col 8 to line 49, col 14 of module replicated: 7 @!@!@ENDMSG 2221 @!@!@ @!@!@STARTMSG 2221:0 @!@!@ - |line 50, col 42 to line 50, col 72 of module fullmesh: 28 + |line 49, col 8 to line 49, col 9 of module replicated: 6 @!@!@ENDMSG 2221 @!@!@ @!@!@STARTMSG 2221:0 @!@!@ - line 51, col 8 to line 51, col 102 of module fullmesh: 1 + |line 49, col 13 to line 49, col 14 of module replicated: 6 @!@!@ENDMSG 2221 @!@!@ @!@!@STARTMSG 2221:0 @!@!@ - |line 51, col 28 to line 51, col 102 of module fullmesh: 4 + line 50, col 8 to line 50, col 72 of module replicated: 4 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 50, col 8 to line 50, col 38 of module replicated: 3 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 50, col 42 to line 50, col 72 of module replicated: 3 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 54, col 13 to line 56, col 50 of module replicated: 1 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 54, col 33 to line 56, col 50 of module replicated: 3 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 57, col 8 to line 57, col 51 of module replicated: 1 @!@!@ENDMSG 2221 @!@!@ @!@!@STARTMSG 2772:0 @!@!@ -: 0:9 +: 0:0 @!@!@ENDMSG 2772 @!@!@ @!@!@STARTMSG 2221:0 @!@!@ - line 54, col 8 to line 61, col 29 of module fullmesh: 9 + line 60, col 8 to line 60, col 32 of module replicated: 3 @!@!@ENDMSG 2221 @!@!@ @!@!@STARTMSG 2221:0 @!@!@ - line 62, col 8 to line 62, col 55 of module fullmesh: 9 + line 61, col 8 to line 61, col 72 of module replicated: 3 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 62, col 8 to line 62, col 102 of module replicated: 0 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 63, col 8 to line 63, col 51 of module replicated: 0 @!@!@ENDMSG 2221 @!@!@ @!@!@STARTMSG 2772:0 @!@!@ -: 0:18 +: 0:0 @!@!@ENDMSG 2772 @!@!@ @!@!@STARTMSG 2221:0 @!@!@ - line 70, col 13 to line 72, col 37 of module fullmesh: 18 + line 67, col 8 to line 74, col 29 of module replicated: 0 @!@!@ENDMSG 2221 @!@!@ @!@!@STARTMSG 2221:0 @!@!@ - line 73, col 8 to line 73, col 51 of module fullmesh: 18 + line 75, col 8 to line 75, col 55 of module replicated: 0 @!@!@ENDMSG 2221 @!@!@ @!@!@STARTMSG 2772:0 @!@!@ -: 0:0 +: 0:0 @!@!@ENDMSG 2772 @!@!@ @!@!@STARTMSG 2221:0 @!@!@ - line 83, col 8 to line 83, col 30 of module fullmesh: 2 + line 84, col 13 to line 86, col 37 of module replicated: 0 @!@!@ENDMSG 2221 @!@!@ @!@!@STARTMSG 2221:0 @!@!@ - |line 83, col 8 to line 83, col 25 of module fullmesh: 2 + line 87, col 8 to line 87, col 51 of module replicated: 0 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 0:0 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 100, col 8 to line 100, col 109 of module replicated: 0 @!@!@ENDMSG 2221 @!@!@ @!@!@STARTMSG 2221:0 @!@!@ - ||line 78, col 15 to line 78, col 33 of module fullmesh: 2 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||line 80, col 5 to line 80, col 66 of module fullmesh: 2 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||line 80, col 26 to line 80, col 65 of module fullmesh: 6 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||line 80, col 12 to line 80, col 23 of module fullmesh: 2 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||line 83, col 24 to line 83, col 24 of module fullmesh: 2 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |line 83, col 29 to line 83, col 30 of module fullmesh: 2 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 84, col 8 to line 84, col 109 of module fullmesh: 0 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 85, col 8 to line 85, col 51 of module fullmesh: 0 + line 101, col 8 to line 101, col 51 of module replicated: 0 @!@!@ENDMSG 2221 @!@!@ @!@!@STARTMSG 2202:0 @!@!@ End of statistics. @!@!@ENDMSG 2202 @!@!@ @!@!@STARTMSG 2200:0 @!@!@ -Progress(3) at 2025-01-19 16:09:40: 46 states generated (1.044 s/min), 6 distinct states found (136 ds/min), 2 states left on queue. +Progress(2) at 2025-01-19 18:27:38: 5 states generated (121 s/min), 2 distinct states found (48 ds/min), 0 states left on queue. @!@!@ENDMSG 2200 @!@!@ @!@!@STARTMSG 2199:0 @!@!@ -46 states generated, 6 distinct states found, 2 states left on queue. +5 states generated, 2 distinct states found, 0 states left on queue. @!@!@ENDMSG 2199 @!@!@ @!@!@STARTMSG 2194:0 @!@!@ -The depth of the complete state graph search is 3. +The depth of the complete state graph search is 2. @!@!@ENDMSG 2194 @!@!@ -@!@!@STARTMSG 2268:0 @!@!@ -The average outdegree of the complete state graph is 2 (minimum is 2, the maximum 2 and the 95th percentile is 2). -@!@!@ENDMSG 2268 @!@!@ @!@!@STARTMSG 2186:0 @!@!@ -Finished in 2658ms at (2025-01-19 16:09:40) +Finished in 2493ms at (2025-01-19 18:27:38) @!@!@ENDMSG 2186 @!@!@ diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737297534393/MC.tla b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307660221/MC.tla similarity index 66% rename from storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737297534393/MC.tla rename to storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307660221/MC.tla index ec7157637f..c30666e0ea 100644 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737297534393/MC.tla +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307660221/MC.tla @@ -1,5 +1,5 @@ ---- MODULE MC ---- -EXTENDS fullmesh, TLC +EXTENDS replicated, TLC \* MV CONSTANT declarations@modelParameterConstants CONSTANTS @@ -22,44 +22,44 @@ az1, az2, az3 ---- \* MV CONSTANT definitions brokers -const_1737297530693169000 == +const_173730765610820000 == {b1, b2, b3} ---- \* MV CONSTANT definitions safekeepers -const_1737297530694170000 == +const_173730765610821000 == {s1, s2, s3} ---- \* MV CONSTANT definitions pageservers -const_1737297530694171000 == +const_173730765610822000 == {p1, p2} ---- \* MV CONSTANT definitions azs -const_1737297530694172000 == +const_173730765610823000 == {az1, az2, az3} ---- \* SYMMETRY definition -symm_1737297530694173000 == -Permutations(const_1737297530693169000) \union Permutations(const_1737297530694170000) \union Permutations(const_1737297530694171000) \union Permutations(const_1737297530694172000) +symm_173730765610824000 == +Permutations(const_173730765610820000) \union Permutations(const_173730765610821000) \union Permutations(const_173730765610822000) \union Permutations(const_173730765610823000) ---- \* CONSTANT definitions @modelParameterConstants:4max_commit_lsn -const_1737297530694174000 == +const_173730765610825000 == 2 ---- \* CONSTANT definitions @modelParameterConstants:5az_mapping -const_1737297530694175000 == +const_173730765610826000 == [ az1 |-> {b1,s1,p1} , az2 |-> {b2,s2,p2} , az3 |-> {b3,s3}] ---- \* CONSTRAINT definition @modelParameterContraint:0 -constr_1737297530694176000 == +constr_173730765610827000 == StateConstraint ---- ============================================================================= \* Modification History -\* Created Sun Jan 19 15:38:50 CET 2025 by cs +\* Created Sun Jan 19 18:27:36 CET 2025 by cs diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299381423/MC_TE.out b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307660221/MC_TE.out similarity index 58% rename from storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299381423/MC_TE.out rename to storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307660221/MC_TE.out index 7760635dfb..43fc616158 100644 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299381423/MC_TE.out +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307660221/MC_TE.out @@ -2,31 +2,35 @@ TLC2 Version 2.19 of 08 August 2024 (rev: 5a47802) @!@!@ENDMSG 2262 @!@!@ @!@!@STARTMSG 2187:0 @!@!@ -Running breadth-first search Model-Checking with fp 3 and seed -7432767478319300652 with 4 workers on 8 cores with 2428MB heap and 5460MB offheap memory [pid: 7681] (Mac OS X 10.16 x86_64, AdoptOpenJDK 14.0.1 x86_64, OffHeapDiskFPSet, DiskStateQueue). +Running breadth-first search Model-Checking with fp 70 and seed -383534902230932382 with 4 workers on 8 cores with 2428MB heap and 5460MB offheap memory [pid: 11483] (Mac OS X 10.16 x86_64, AdoptOpenJDK 14.0.1 x86_64, OffHeapDiskFPSet, DiskStateQueue). @!@!@ENDMSG 2187 @!@!@ @!@!@STARTMSG 2220:0 @!@!@ Starting SANY... @!@!@ENDMSG 2220 @!@!@ -Parsing file /Users/cs/Desktop/broker/fullmesh/fullmesh.toolbox/Model_1/MC.tla -Parsing file /Users/cs/Desktop/broker/fullmesh/fullmesh.toolbox/Model_1/fullmesh.tla +Parsing file /Users/cs/src/neon/storage_broker/spec/replicated/replicated.toolbox/Model_1/MC.tla +Parsing file /Users/cs/src/neon/storage_broker/spec/replicated/replicated.toolbox/Model_1/replicated.tla Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/TLC.tla Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Integers.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/FiniteSets.tla Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Naturals.tla Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Sequences.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/FiniteSets.tla Semantic processing of module Naturals Semantic processing of module Integers -Semantic processing of module fullmesh Semantic processing of module Sequences Semantic processing of module FiniteSets +Semantic processing of module replicated Semantic processing of module TLC Semantic processing of module MC @!@!@STARTMSG 2219:0 @!@!@ SANY finished. @!@!@ENDMSG 2219 @!@!@ @!@!@STARTMSG 2185:0 @!@!@ -Starting... (2025-01-19 16:09:38) +Starting... (2025-01-19 18:27:37) @!@!@ENDMSG 2185 @!@!@ +@!@!@STARTMSG 2140:3 @!@!@ +The subscript of the next-state relation specified by the specification +does not seem to contain the state variable online +@!@!@ENDMSG 2140 @!@!@ @!@!@STARTMSG 2279:3 @!@!@ Declaring symmetry during liveness checking is dangerous. It might cause TLC to miss violations of the stated liveness properties. Please check liveness without symmetry defined. @!@!@ENDMSG 2279 @!@!@ @@ -40,10 +44,10 @@ Implied-temporal checking--satisfiability problem has 1 branches. Computing initial states... @!@!@ENDMSG 2189 @!@!@ @!@!@STARTMSG 2190:0 @!@!@ -Finished computing initial states: 1 distinct state generated at 2025-01-19 16:09:40. +Finished computing initial states: 1 distinct state generated at 2025-01-19 18:27:38. @!@!@ENDMSG 2190 @!@!@ @!@!@STARTMSG 2109:1 @!@!@ -Successor state is not completely specified by action SkPeerRecovery of the next-state relation. The following variables are not assigned: broker_state, pageserver_state. +Successor state is not completely specified by action SkCommit of the next-state relation. The following variable is not assigned: online. @!@!@ENDMSG 2109 @!@!@ @!@!@STARTMSG 2121:1 @!@!@ @@ -53,134 +57,147 @@ The behavior up to this point is: 1: /\ pageserver_state = (p1 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0]), last_record_lsn |-> 0, preferred_sk |-> NULL] @@ p2 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0]), last_record_lsn |-> 0, preferred_sk |-> NULL]) /\ broker_state = (b1 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])] @@ b2 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])] @@ b3 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])]) +/\ online = {b1, b2, b3, s1, s2, s3, p1, p2} /\ safekeeper_state = (s1 :> [commit_lsn |-> 0, pruned_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0, pruned_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0, pruned_lsn |-> 0]) @!@!@ENDMSG 2217 @!@!@ @!@!@STARTMSG 2217:4 @!@!@ -2: +2: /\ pageserver_state = (p1 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0]), last_record_lsn |-> 0, preferred_sk |-> NULL] @@ p2 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0]), last_record_lsn |-> 0, preferred_sk |-> NULL]) /\ broker_state = (b1 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])] @@ b2 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])] @@ b3 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])]) -/\ safekeeper_state = (s1 :> [commit_lsn |-> 1, pruned_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0, pruned_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0, pruned_lsn |-> 0]) - -@!@!@ENDMSG 2217 @!@!@ -@!@!@STARTMSG 2217:4 @!@!@ -3: -/\ pageserver_state = null -/\ broker_state = null +/\ online = null /\ safekeeper_state = (s1 :> [commit_lsn |-> 1, pruned_lsn |-> 0] @@ s2 :> [commit_lsn |-> 1, pruned_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0, pruned_lsn |-> 0]) @!@!@ENDMSG 2217 @!@!@ @!@!@STARTMSG 2201:0 @!@!@ -The coverage statistics at 2025-01-19 16:09:40 +The coverage statistics at 2025-01-19 18:27:38 @!@!@ENDMSG 2201 @!@!@ @!@!@STARTMSG 2773:0 @!@!@ -: 2:2 +: 1:1 @!@!@ENDMSG 2773 @!@!@ @!@!@STARTMSG 2221:0 @!@!@ - line 34, col 5 to line 36, col 64 of module fullmesh: 2 + line 35, col 5 to line 38, col 26 of module replicated: 1 @!@!@ENDMSG 2221 @!@!@ @!@!@STARTMSG 2772:0 @!@!@ -: 5:17 +: 1:3 @!@!@ENDMSG 2772 @!@!@ @!@!@STARTMSG 2221:0 @!@!@ - line 40, col 8 to line 40, col 72 of module fullmesh: 46 + line 41, col 8 to line 44, col 44 of module replicated: 3 @!@!@ENDMSG 2221 @!@!@ @!@!@STARTMSG 2221:0 @!@!@ - |line 40, col 8 to line 40, col 38 of module fullmesh: 29 + |line 41, col 18 to line 44, col 44 of module replicated: 3 @!@!@ENDMSG 2221 @!@!@ @!@!@STARTMSG 2221:0 @!@!@ - |line 40, col 42 to line 40, col 72 of module fullmesh: 29 + ||line 42, col 9 to line 44, col 44 of module replicated: 696 @!@!@ENDMSG 2221 @!@!@ @!@!@STARTMSG 2221:0 @!@!@ - line 44, col 13 to line 46, col 50 of module fullmesh: 17 + |||line 42, col 12 to line 42, col 48 of module replicated: 696 @!@!@ENDMSG 2221 @!@!@ @!@!@STARTMSG 2221:0 @!@!@ - line 47, col 8 to line 47, col 51 of module fullmesh: 17 + |||line 43, col 12 to line 43, col 44 of module replicated: 312 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||line 44, col 12 to line 44, col 44 of module replicated: 129 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 41, col 32 to line 41, col 48 of module replicated: 3 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 45, col 8 to line 45, col 67 of module replicated: 3 @!@!@ENDMSG 2221 @!@!@ @!@!@STARTMSG 2772:0 @!@!@ -: 0:4 +: 0:3 @!@!@ENDMSG 2772 @!@!@ @!@!@STARTMSG 2221:0 @!@!@ - line 50, col 8 to line 50, col 72 of module fullmesh: 1 + line 48, col 8 to line 48, col 32 of module replicated: 7 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2775:0 @!@!@ + |line 48, col 8 to line 48, col 15 of module replicated: 6:15 +@!@!@ENDMSG 2775 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 48, col 27 to line 48, col 32 of module replicated: 6 @!@!@ENDMSG 2221 @!@!@ @!@!@STARTMSG 2221:0 @!@!@ - |line 50, col 8 to line 50, col 38 of module fullmesh: 28 + line 49, col 8 to line 49, col 14 of module replicated: 7 @!@!@ENDMSG 2221 @!@!@ @!@!@STARTMSG 2221:0 @!@!@ - |line 50, col 42 to line 50, col 72 of module fullmesh: 28 + |line 49, col 8 to line 49, col 9 of module replicated: 6 @!@!@ENDMSG 2221 @!@!@ @!@!@STARTMSG 2221:0 @!@!@ - line 51, col 8 to line 51, col 102 of module fullmesh: 1 + |line 49, col 13 to line 49, col 14 of module replicated: 6 @!@!@ENDMSG 2221 @!@!@ @!@!@STARTMSG 2221:0 @!@!@ - |line 51, col 28 to line 51, col 102 of module fullmesh: 4 + line 50, col 8 to line 50, col 72 of module replicated: 4 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 50, col 8 to line 50, col 38 of module replicated: 3 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 50, col 42 to line 50, col 72 of module replicated: 3 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 54, col 13 to line 56, col 50 of module replicated: 1 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 54, col 33 to line 56, col 50 of module replicated: 3 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 57, col 8 to line 57, col 51 of module replicated: 1 @!@!@ENDMSG 2221 @!@!@ @!@!@STARTMSG 2772:0 @!@!@ -: 0:9 +: 0:0 @!@!@ENDMSG 2772 @!@!@ @!@!@STARTMSG 2221:0 @!@!@ - line 54, col 8 to line 61, col 29 of module fullmesh: 9 + line 60, col 8 to line 60, col 32 of module replicated: 3 @!@!@ENDMSG 2221 @!@!@ @!@!@STARTMSG 2221:0 @!@!@ - line 62, col 8 to line 62, col 55 of module fullmesh: 9 + line 61, col 8 to line 61, col 72 of module replicated: 3 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 62, col 8 to line 62, col 102 of module replicated: 0 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 63, col 8 to line 63, col 51 of module replicated: 0 @!@!@ENDMSG 2221 @!@!@ @!@!@STARTMSG 2772:0 @!@!@ -: 0:18 +: 0:0 @!@!@ENDMSG 2772 @!@!@ @!@!@STARTMSG 2221:0 @!@!@ - line 70, col 13 to line 72, col 37 of module fullmesh: 18 + line 67, col 8 to line 74, col 29 of module replicated: 0 @!@!@ENDMSG 2221 @!@!@ @!@!@STARTMSG 2221:0 @!@!@ - line 73, col 8 to line 73, col 51 of module fullmesh: 18 + line 75, col 8 to line 75, col 55 of module replicated: 0 @!@!@ENDMSG 2221 @!@!@ @!@!@STARTMSG 2772:0 @!@!@ -: 0:0 +: 0:0 @!@!@ENDMSG 2772 @!@!@ @!@!@STARTMSG 2221:0 @!@!@ - line 83, col 8 to line 83, col 30 of module fullmesh: 2 + line 84, col 13 to line 86, col 37 of module replicated: 0 @!@!@ENDMSG 2221 @!@!@ @!@!@STARTMSG 2221:0 @!@!@ - |line 83, col 8 to line 83, col 25 of module fullmesh: 2 + line 87, col 8 to line 87, col 51 of module replicated: 0 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 0:0 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 100, col 8 to line 100, col 109 of module replicated: 0 @!@!@ENDMSG 2221 @!@!@ @!@!@STARTMSG 2221:0 @!@!@ - ||line 78, col 15 to line 78, col 33 of module fullmesh: 2 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||line 80, col 5 to line 80, col 66 of module fullmesh: 2 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||line 80, col 26 to line 80, col 65 of module fullmesh: 6 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |||line 80, col 12 to line 80, col 23 of module fullmesh: 2 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - ||line 83, col 24 to line 83, col 24 of module fullmesh: 2 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - |line 83, col 29 to line 83, col 30 of module fullmesh: 2 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 84, col 8 to line 84, col 109 of module fullmesh: 0 -@!@!@ENDMSG 2221 @!@!@ -@!@!@STARTMSG 2221:0 @!@!@ - line 85, col 8 to line 85, col 51 of module fullmesh: 0 + line 101, col 8 to line 101, col 51 of module replicated: 0 @!@!@ENDMSG 2221 @!@!@ @!@!@STARTMSG 2202:0 @!@!@ End of statistics. @!@!@ENDMSG 2202 @!@!@ @!@!@STARTMSG 2200:0 @!@!@ -Progress(3) at 2025-01-19 16:09:40: 46 states generated (1.044 s/min), 6 distinct states found (136 ds/min), 2 states left on queue. +Progress(2) at 2025-01-19 18:27:38: 5 states generated (121 s/min), 2 distinct states found (48 ds/min), 0 states left on queue. @!@!@ENDMSG 2200 @!@!@ @!@!@STARTMSG 2199:0 @!@!@ -46 states generated, 6 distinct states found, 2 states left on queue. +5 states generated, 2 distinct states found, 0 states left on queue. @!@!@ENDMSG 2199 @!@!@ @!@!@STARTMSG 2194:0 @!@!@ -The depth of the complete state graph search is 3. +The depth of the complete state graph search is 2. @!@!@ENDMSG 2194 @!@!@ -@!@!@STARTMSG 2268:0 @!@!@ -The average outdegree of the complete state graph is 2 (minimum is 2, the maximum 2 and the 95th percentile is 2). -@!@!@ENDMSG 2268 @!@!@ @!@!@STARTMSG 2186:0 @!@!@ -Finished in 2658ms at (2025-01-19 16:09:40) +Finished in 2493ms at (2025-01-19 18:27:38) @!@!@ENDMSG 2186 @!@!@ diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299744229/fullmesh.tla b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307660221/replicated.tla similarity index 80% rename from storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299744229/fullmesh.tla rename to storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307660221/replicated.tla index b010e35f80..861110267e 100644 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299744229/fullmesh.tla +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307660221/replicated.tla @@ -1,8 +1,8 @@ ----- MODULE fullmesh ---- +---- MODULE replicated ---- -EXTENDS Integers +EXTENDS Integers, FiniteSets -VARIABLES broker_state, safekeeper_state, pageserver_state +VARIABLES broker_state, safekeeper_state, pageserver_state, online CONSTANT @@ -29,14 +29,23 @@ StateConstraint == InitSafekeeper == [pruned_lsn |-> 0, commit_lsn |-> 0] InitBroker == [sk |-> [s \in safekeepers |-> [commit_lsn |-> 0]]] InitPageserver == [last_record_lsn |-> 0, preferred_sk |-> NULL, sk |-> [s \in safekeepers |-> [commit_lsn |-> 0]]] +InitOnline == safekeepers \cup brokers \cup pageservers Init == /\ broker_state = [b \in brokers |-> InitBroker] /\ safekeeper_state = [s \in safekeepers |-> InitSafekeeper] /\ pageserver_state = [p \in pageservers |-> InitPageserver] + /\ online = InitOnline +NodeOnlineOffline == + /\ online' = CHOOSE ss \in SUBSET InitOnline: + /\ Cardinality(ss \cap safekeepers) >= 2 + /\ Cardinality(ss \cap brokers) >= 2 + /\ ss \cap pageservers = pageservers \* assume no PS failures for now + /\ UNCHANGED <> SkCommit(s1, s2) == + /\ {s1, s2} \subseteq online /\ s1 # s2 /\ safekeeper_state[s1].commit_lsn = safekeeper_state[s2].commit_lsn /\ LET @@ -48,11 +57,13 @@ SkCommit(s1, s2) == /\ UNCHANGED <> SkPeerRecovery(s1,s2) == + /\ {s1, s2} \subseteq online /\ safekeeper_state[s1].commit_lsn < safekeeper_state[s2].commit_lsn /\ safekeeper_state' = [safekeeper_state EXCEPT![s1].commit_lsn = safekeeper_state[s2].commit_lsn] /\ UNCHANGED <> SkPushToBroker(s,b) == + /\ {s, b} \subseteq online /\ broker_state' = IF broker_state[b].sk[s].commit_lsn < safekeeper_state[s].commit_lsn THEN LET @@ -64,6 +75,7 @@ SkPushToBroker(s,b) == /\ UNCHANGED <> PsRecvBroker(b,p,s) == + /\ {b,p,s} \subseteq online /\ LET bsk == broker_state[b].sk[s] psk == pageserver_state[p].sk[s] @@ -76,10 +88,12 @@ PsRecvBroker(b,p,s) == SksWithNewerWal(p) == - LET - ps == pageserver_state[p] - IN - {s \in DOMAIN ps.sk: ps.sk[s].commit_lsn > ps.last_record_lsn} + /\ {p} \subseteq online + /\ + LET + ps == pageserver_state[p] + IN + {s \in DOMAIN ps.sk: ps.sk[s].commit_lsn > ps.last_record_lsn} PsChooseSk(p) == /\ SksWithNewerWal(p) # {} @@ -88,7 +102,7 @@ PsChooseSk(p) == Next == - + \/ NodeOnlineOffline \/ \E s1 \in safekeepers: \E s2 \in safekeepers: \/ SkCommit(s1, s2) \/ SkPeerRecovery(s1, s2) diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299542008/MC.cfg b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307704621/MC.cfg similarity index 66% rename from storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299542008/MC.cfg rename to storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307704621/MC.cfg index 85f59f2a5a..17ae6b83c8 100644 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299542008/MC.cfg +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307704621/MC.cfg @@ -19,33 +19,33 @@ az2 = az2 az3 = az3 \* MV CONSTANT definitions CONSTANT -brokers <- const_1737299528165230000 +brokers <- const_173730770045629000 \* CONSTANT declarations CONSTANT NULL = NULL \* MV CONSTANT definitions CONSTANT -safekeepers <- const_1737299528166231000 +safekeepers <- const_173730770045630000 \* MV CONSTANT definitions CONSTANT -pageservers <- const_1737299528166232000 +pageservers <- const_173730770045731000 \* MV CONSTANT definitions CONSTANT -azs <- const_1737299528166233000 +azs <- const_173730770045732000 \* SYMMETRY definition -SYMMETRY symm_1737299528166234000 +SYMMETRY symm_173730770045733000 \* CONSTANT definitions CONSTANT -max_commit_lsn <- const_1737299528166235000 +max_commit_lsn <- const_173730770045734000 \* CONSTANT definitions CONSTANT -az_mapping <- const_1737299528166236000 +az_mapping <- const_173730770045735000 \* CONSTRAINT definition CONSTRAINT -constr_1737299528166237000 +constr_173730770045736000 \* SPECIFICATION definition SPECIFICATION Spec \* PROPERTY definition PROPERTY EventuallyLaggingSkIsNotPreferredSk -\* Generated on Sun Jan 19 16:12:08 CET 2025 \ No newline at end of file +\* Generated on Sun Jan 19 18:28:20 CET 2025 \ No newline at end of file diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307704621/MC.out b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307704621/MC.out new file mode 100644 index 0000000000..2e22ced64d --- /dev/null +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307704621/MC.out @@ -0,0 +1,282 @@ +@!@!@STARTMSG 2262:0 @!@!@ +TLC2 Version 2.19 of 08 August 2024 (rev: 5a47802) +@!@!@ENDMSG 2262 @!@!@ +@!@!@STARTMSG 2187:0 @!@!@ +Running breadth-first search Model-Checking with fp 128 and seed -4991617861993001241 with 4 workers on 8 cores with 2428MB heap and 5460MB offheap memory [pid: 11510] (Mac OS X 10.16 x86_64, AdoptOpenJDK 14.0.1 x86_64, OffHeapDiskFPSet, DiskStateQueue). +@!@!@ENDMSG 2187 @!@!@ +@!@!@STARTMSG 2220:0 @!@!@ +Starting SANY... +@!@!@ENDMSG 2220 @!@!@ +Parsing file /Users/cs/src/neon/storage_broker/spec/replicated/replicated.toolbox/Model_1/MC.tla +Parsing file /Users/cs/src/neon/storage_broker/spec/replicated/replicated.toolbox/Model_1/replicated.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/TLC.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Integers.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/FiniteSets.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Naturals.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Sequences.tla +Semantic processing of module Naturals +Semantic processing of module Integers +Semantic processing of module Sequences +Semantic processing of module FiniteSets +Semantic processing of module replicated +Semantic processing of module TLC +Semantic processing of module MC +@!@!@STARTMSG 2219:0 @!@!@ +SANY finished. +@!@!@ENDMSG 2219 @!@!@ +@!@!@STARTMSG 2185:0 @!@!@ +Starting... (2025-01-19 18:28:21) +@!@!@ENDMSG 2185 @!@!@ +@!@!@STARTMSG 2279:3 @!@!@ +Declaring symmetry during liveness checking is dangerous. It might cause TLC to miss violations of the stated liveness properties. Please check liveness without symmetry defined. +@!@!@ENDMSG 2279 @!@!@ +@!@!@STARTMSG 2284:3 @!@!@ +Declaring state or action constraints during liveness checking is dangerous: Please read section 14.3.5 on page 247 of Specifying Systems (https://lamport.azurewebsites.net/tla/book.html) and optionally the discussion at https://discuss.tlapl.us/msg00994.html for more details. +@!@!@ENDMSG 2284 @!@!@ +@!@!@STARTMSG 2212:0 @!@!@ +Implied-temporal checking--satisfiability problem has 1 branches. +@!@!@ENDMSG 2212 @!@!@ +@!@!@STARTMSG 2189:0 @!@!@ +Computing initial states... +@!@!@ENDMSG 2189 @!@!@ +@!@!@STARTMSG 2190:0 @!@!@ +Finished computing initial states: 1 distinct state generated at 2025-01-19 18:28:23. +@!@!@ENDMSG 2190 @!@!@ +@!@!@STARTMSG 1000:1 @!@!@ +TLC threw an unexpected exception. +This was probably caused by an error in the spec or model. +See the User Output or TLC Console for clues to what happened. +The exception was a java.lang.RuntimeException +: A non-boolean expression (a set of the form {e1, ... ,eN}) was used as a formula in a conjunction. +line 93, col 9 to line 96, col 70 of module replicated +@!@!@ENDMSG 1000 @!@!@ +@!@!@STARTMSG 2121:1 @!@!@ +The behavior up to this point is: +@!@!@ENDMSG 2121 @!@!@ +@!@!@STARTMSG 2217:4 @!@!@ +1: +/\ pageserver_state = (p1 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0]), last_record_lsn |-> 0, preferred_sk |-> NULL] @@ p2 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0]), last_record_lsn |-> 0, preferred_sk |-> NULL]) +/\ broker_state = (b1 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])] @@ b2 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])] @@ b3 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])]) +/\ online = {b1, b2, b3, s1, s2, s3, p1, p2} +/\ safekeeper_state = (s1 :> [commit_lsn |-> 0, pruned_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0, pruned_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0, pruned_lsn |-> 0]) + +@!@!@ENDMSG 2217 @!@!@ +@!@!@STARTMSG 2217:4 @!@!@ +2: +/\ pageserver_state = (p1 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0]), last_record_lsn |-> 0, preferred_sk |-> NULL] @@ p2 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0]), last_record_lsn |-> 0, preferred_sk |-> NULL]) +/\ broker_state = (b1 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])] @@ b2 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])] @@ b3 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])]) +/\ online = {b1, b2, s1, s2, p1, p2} +/\ safekeeper_state = (s1 :> [commit_lsn |-> 0, pruned_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0, pruned_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0, pruned_lsn |-> 0]) + +@!@!@ENDMSG 2217 @!@!@ +@!@!@STARTMSG 2103:1 @!@!@ +The error occurred when TLC was evaluating the nested +expressions at the following positions: +0. Line 99, column 5 to line 101, column 58 in replicated +1. Line 99, column 8 to line 99, column 30 in replicated +2. Line 99, column 8 to line 99, column 25 in replicated +3. Line 91, column 5 to line 96, column 70 in replicated + + +@!@!@ENDMSG 2103 @!@!@ +@!@!@STARTMSG 2201:0 @!@!@ +The coverage statistics at 2025-01-19 18:28:23 +@!@!@ENDMSG 2201 @!@!@ +@!@!@STARTMSG 2773:0 @!@!@ +: 2:2 +@!@!@ENDMSG 2773 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 35, col 5 to line 38, col 26 of module replicated: 2 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 1:6 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 41, col 8 to line 44, col 44 of module replicated: 6 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 41, col 18 to line 44, col 44 of module replicated: 6 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 42, col 9 to line 44, col 44 of module replicated: 1392 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||line 42, col 12 to line 42, col 48 of module replicated: 1392 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||line 43, col 12 to line 43, col 44 of module replicated: 624 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||line 44, col 12 to line 44, col 44 of module replicated: 258 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 41, col 32 to line 41, col 48 of module replicated: 6 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 45, col 8 to line 45, col 67 of module replicated: 6 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 4:14 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 48, col 8 to line 48, col 32 of module replicated: 59 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2775:0 @!@!@ + |line 48, col 8 to line 48, col 15 of module replicated: 45:105 +@!@!@ENDMSG 2775 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 48, col 27 to line 48, col 32 of module replicated: 45 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 49, col 8 to line 49, col 14 of module replicated: 44 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 49, col 8 to line 49, col 9 of module replicated: 30 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 49, col 13 to line 49, col 14 of module replicated: 30 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 50, col 8 to line 50, col 72 of module replicated: 32 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 50, col 8 to line 50, col 38 of module replicated: 18 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 50, col 42 to line 50, col 72 of module replicated: 18 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 54, col 13 to line 56, col 50 of module replicated: 14 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 57, col 8 to line 57, col 58 of module replicated: 14 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 1:2 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 60, col 8 to line 60, col 32 of module replicated: 47 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2775:0 @!@!@ + |line 60, col 8 to line 60, col 15 of module replicated: 45:105 +@!@!@ENDMSG 2775 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 60, col 27 to line 60, col 32 of module replicated: 45 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 61, col 8 to line 61, col 72 of module replicated: 2 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 61, col 8 to line 61, col 38 of module replicated: 30 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 61, col 42 to line 61, col 72 of module replicated: 30 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 62, col 8 to line 62, col 102 of module replicated: 2 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 63, col 8 to line 63, col 58 of module replicated: 2 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 2:30 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 66, col 8 to line 66, col 30 of module replicated: 75 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2775:0 @!@!@ + |line 66, col 8 to line 66, col 13 of module replicated: 45:111 +@!@!@ENDMSG 2775 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 66, col 25 to line 66, col 30 of module replicated: 45 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 67, col 8 to line 74, col 29 of module replicated: 30 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 67, col 24 to line 74, col 29 of module replicated: 30 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 67, col 27 to line 67, col 91 of module replicated: 30 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 70, col 28 to line 70, col 45 of module replicated: 10 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 71, col 31 to line 71, col 91 of module replicated: 10 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 73, col 17 to line 73, col 54 of module replicated: 10 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 74, col 18 to line 74, col 29 of module replicated: 20 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 75, col 8 to line 75, col 62 of module replicated: 30 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 0:60 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 78, col 8 to line 78, col 31 of module replicated: 150 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2775:0 @!@!@ + |line 78, col 8 to line 78, col 14 of module replicated: 90:282 +@!@!@ENDMSG 2775 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 78, col 26 to line 78, col 31 of module replicated: 90 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 84, col 13 to line 86, col 37 of module replicated: 60 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 87, col 8 to line 87, col 58 of module replicated: 60 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 0:0 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 99, col 8 to line 99, col 30 of module replicated: 5 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 99, col 8 to line 99, col 25 of module replicated: 5 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 91, col 5 to line 96, col 70 of module replicated: 5 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||line 91, col 8 to line 91, col 27 of module replicated: 5 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||line 94, col 19 to line 94, col 37 of module replicated: 5 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||line 96, col 9 to line 96, col 70 of module replicated: 5 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||||line 96, col 30 to line 96, col 69 of module replicated: 15 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||||line 96, col 16 to line 96, col 27 of module replicated: 5 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 99, col 24 to line 99, col 24 of module replicated: 5 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 100, col 8 to line 100, col 109 of module replicated: 0 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 101, col 8 to line 101, col 58 of module replicated: 0 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2202:0 @!@!@ +End of statistics. +@!@!@ENDMSG 2202 @!@!@ +@!@!@STARTMSG 2200:0 @!@!@ +Progress(4) at 2025-01-19 18:28:23: 97 states generated (2.165 s/min), 9 distinct states found (200 ds/min), 5 states left on queue. +@!@!@ENDMSG 2200 @!@!@ +@!@!@STARTMSG 2199:0 @!@!@ +97 states generated, 9 distinct states found, 5 states left on queue. +@!@!@ENDMSG 2199 @!@!@ +@!@!@STARTMSG 2186:0 @!@!@ +Finished in 2701ms at (2025-01-19 18:28:23) +@!@!@ENDMSG 2186 @!@!@ diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299352762/MC.tla b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307704621/MC.tla similarity index 66% rename from storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299352762/MC.tla rename to storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307704621/MC.tla index 1dd82bc923..683a638594 100644 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299352762/MC.tla +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307704621/MC.tla @@ -1,5 +1,5 @@ ---- MODULE MC ---- -EXTENDS fullmesh, TLC +EXTENDS replicated, TLC \* MV CONSTANT declarations@modelParameterConstants CONSTANTS @@ -22,44 +22,44 @@ az1, az2, az3 ---- \* MV CONSTANT definitions brokers -const_1737299350679194000 == +const_173730770045629000 == {b1, b2, b3} ---- \* MV CONSTANT definitions safekeepers -const_1737299350679195000 == +const_173730770045630000 == {s1, s2, s3} ---- \* MV CONSTANT definitions pageservers -const_1737299350679196000 == +const_173730770045731000 == {p1, p2} ---- \* MV CONSTANT definitions azs -const_1737299350679197000 == +const_173730770045732000 == {az1, az2, az3} ---- \* SYMMETRY definition -symm_1737299350679198000 == -Permutations(const_1737299350679194000) \union Permutations(const_1737299350679195000) \union Permutations(const_1737299350679196000) \union Permutations(const_1737299350679197000) +symm_173730770045733000 == +Permutations(const_173730770045629000) \union Permutations(const_173730770045630000) \union Permutations(const_173730770045731000) \union Permutations(const_173730770045732000) ---- \* CONSTANT definitions @modelParameterConstants:4max_commit_lsn -const_1737299350679199000 == +const_173730770045734000 == 2 ---- \* CONSTANT definitions @modelParameterConstants:5az_mapping -const_1737299350679200000 == +const_173730770045735000 == [ az1 |-> {b1,s1,p1} , az2 |-> {b2,s2,p2} , az3 |-> {b3,s3}] ---- \* CONSTRAINT definition @modelParameterContraint:0 -constr_1737299350680201000 == +constr_173730770045736000 == StateConstraint ---- ============================================================================= \* Modification History -\* Created Sun Jan 19 16:09:10 CET 2025 by cs +\* Created Sun Jan 19 18:28:20 CET 2025 by cs diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307704621/MC_TE.out b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307704621/MC_TE.out new file mode 100644 index 0000000000..2e22ced64d --- /dev/null +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307704621/MC_TE.out @@ -0,0 +1,282 @@ +@!@!@STARTMSG 2262:0 @!@!@ +TLC2 Version 2.19 of 08 August 2024 (rev: 5a47802) +@!@!@ENDMSG 2262 @!@!@ +@!@!@STARTMSG 2187:0 @!@!@ +Running breadth-first search Model-Checking with fp 128 and seed -4991617861993001241 with 4 workers on 8 cores with 2428MB heap and 5460MB offheap memory [pid: 11510] (Mac OS X 10.16 x86_64, AdoptOpenJDK 14.0.1 x86_64, OffHeapDiskFPSet, DiskStateQueue). +@!@!@ENDMSG 2187 @!@!@ +@!@!@STARTMSG 2220:0 @!@!@ +Starting SANY... +@!@!@ENDMSG 2220 @!@!@ +Parsing file /Users/cs/src/neon/storage_broker/spec/replicated/replicated.toolbox/Model_1/MC.tla +Parsing file /Users/cs/src/neon/storage_broker/spec/replicated/replicated.toolbox/Model_1/replicated.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/TLC.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Integers.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/FiniteSets.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Naturals.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Sequences.tla +Semantic processing of module Naturals +Semantic processing of module Integers +Semantic processing of module Sequences +Semantic processing of module FiniteSets +Semantic processing of module replicated +Semantic processing of module TLC +Semantic processing of module MC +@!@!@STARTMSG 2219:0 @!@!@ +SANY finished. +@!@!@ENDMSG 2219 @!@!@ +@!@!@STARTMSG 2185:0 @!@!@ +Starting... (2025-01-19 18:28:21) +@!@!@ENDMSG 2185 @!@!@ +@!@!@STARTMSG 2279:3 @!@!@ +Declaring symmetry during liveness checking is dangerous. It might cause TLC to miss violations of the stated liveness properties. Please check liveness without symmetry defined. +@!@!@ENDMSG 2279 @!@!@ +@!@!@STARTMSG 2284:3 @!@!@ +Declaring state or action constraints during liveness checking is dangerous: Please read section 14.3.5 on page 247 of Specifying Systems (https://lamport.azurewebsites.net/tla/book.html) and optionally the discussion at https://discuss.tlapl.us/msg00994.html for more details. +@!@!@ENDMSG 2284 @!@!@ +@!@!@STARTMSG 2212:0 @!@!@ +Implied-temporal checking--satisfiability problem has 1 branches. +@!@!@ENDMSG 2212 @!@!@ +@!@!@STARTMSG 2189:0 @!@!@ +Computing initial states... +@!@!@ENDMSG 2189 @!@!@ +@!@!@STARTMSG 2190:0 @!@!@ +Finished computing initial states: 1 distinct state generated at 2025-01-19 18:28:23. +@!@!@ENDMSG 2190 @!@!@ +@!@!@STARTMSG 1000:1 @!@!@ +TLC threw an unexpected exception. +This was probably caused by an error in the spec or model. +See the User Output or TLC Console for clues to what happened. +The exception was a java.lang.RuntimeException +: A non-boolean expression (a set of the form {e1, ... ,eN}) was used as a formula in a conjunction. +line 93, col 9 to line 96, col 70 of module replicated +@!@!@ENDMSG 1000 @!@!@ +@!@!@STARTMSG 2121:1 @!@!@ +The behavior up to this point is: +@!@!@ENDMSG 2121 @!@!@ +@!@!@STARTMSG 2217:4 @!@!@ +1: +/\ pageserver_state = (p1 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0]), last_record_lsn |-> 0, preferred_sk |-> NULL] @@ p2 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0]), last_record_lsn |-> 0, preferred_sk |-> NULL]) +/\ broker_state = (b1 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])] @@ b2 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])] @@ b3 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])]) +/\ online = {b1, b2, b3, s1, s2, s3, p1, p2} +/\ safekeeper_state = (s1 :> [commit_lsn |-> 0, pruned_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0, pruned_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0, pruned_lsn |-> 0]) + +@!@!@ENDMSG 2217 @!@!@ +@!@!@STARTMSG 2217:4 @!@!@ +2: +/\ pageserver_state = (p1 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0]), last_record_lsn |-> 0, preferred_sk |-> NULL] @@ p2 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0]), last_record_lsn |-> 0, preferred_sk |-> NULL]) +/\ broker_state = (b1 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])] @@ b2 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])] @@ b3 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])]) +/\ online = {b1, b2, s1, s2, p1, p2} +/\ safekeeper_state = (s1 :> [commit_lsn |-> 0, pruned_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0, pruned_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0, pruned_lsn |-> 0]) + +@!@!@ENDMSG 2217 @!@!@ +@!@!@STARTMSG 2103:1 @!@!@ +The error occurred when TLC was evaluating the nested +expressions at the following positions: +0. Line 99, column 5 to line 101, column 58 in replicated +1. Line 99, column 8 to line 99, column 30 in replicated +2. Line 99, column 8 to line 99, column 25 in replicated +3. Line 91, column 5 to line 96, column 70 in replicated + + +@!@!@ENDMSG 2103 @!@!@ +@!@!@STARTMSG 2201:0 @!@!@ +The coverage statistics at 2025-01-19 18:28:23 +@!@!@ENDMSG 2201 @!@!@ +@!@!@STARTMSG 2773:0 @!@!@ +: 2:2 +@!@!@ENDMSG 2773 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 35, col 5 to line 38, col 26 of module replicated: 2 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 1:6 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 41, col 8 to line 44, col 44 of module replicated: 6 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 41, col 18 to line 44, col 44 of module replicated: 6 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 42, col 9 to line 44, col 44 of module replicated: 1392 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||line 42, col 12 to line 42, col 48 of module replicated: 1392 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||line 43, col 12 to line 43, col 44 of module replicated: 624 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||line 44, col 12 to line 44, col 44 of module replicated: 258 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 41, col 32 to line 41, col 48 of module replicated: 6 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 45, col 8 to line 45, col 67 of module replicated: 6 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 4:14 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 48, col 8 to line 48, col 32 of module replicated: 59 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2775:0 @!@!@ + |line 48, col 8 to line 48, col 15 of module replicated: 45:105 +@!@!@ENDMSG 2775 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 48, col 27 to line 48, col 32 of module replicated: 45 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 49, col 8 to line 49, col 14 of module replicated: 44 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 49, col 8 to line 49, col 9 of module replicated: 30 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 49, col 13 to line 49, col 14 of module replicated: 30 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 50, col 8 to line 50, col 72 of module replicated: 32 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 50, col 8 to line 50, col 38 of module replicated: 18 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 50, col 42 to line 50, col 72 of module replicated: 18 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 54, col 13 to line 56, col 50 of module replicated: 14 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 57, col 8 to line 57, col 58 of module replicated: 14 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 1:2 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 60, col 8 to line 60, col 32 of module replicated: 47 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2775:0 @!@!@ + |line 60, col 8 to line 60, col 15 of module replicated: 45:105 +@!@!@ENDMSG 2775 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 60, col 27 to line 60, col 32 of module replicated: 45 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 61, col 8 to line 61, col 72 of module replicated: 2 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 61, col 8 to line 61, col 38 of module replicated: 30 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 61, col 42 to line 61, col 72 of module replicated: 30 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 62, col 8 to line 62, col 102 of module replicated: 2 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 63, col 8 to line 63, col 58 of module replicated: 2 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 2:30 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 66, col 8 to line 66, col 30 of module replicated: 75 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2775:0 @!@!@ + |line 66, col 8 to line 66, col 13 of module replicated: 45:111 +@!@!@ENDMSG 2775 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 66, col 25 to line 66, col 30 of module replicated: 45 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 67, col 8 to line 74, col 29 of module replicated: 30 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 67, col 24 to line 74, col 29 of module replicated: 30 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 67, col 27 to line 67, col 91 of module replicated: 30 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 70, col 28 to line 70, col 45 of module replicated: 10 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 71, col 31 to line 71, col 91 of module replicated: 10 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 73, col 17 to line 73, col 54 of module replicated: 10 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 74, col 18 to line 74, col 29 of module replicated: 20 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 75, col 8 to line 75, col 62 of module replicated: 30 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 0:60 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 78, col 8 to line 78, col 31 of module replicated: 150 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2775:0 @!@!@ + |line 78, col 8 to line 78, col 14 of module replicated: 90:282 +@!@!@ENDMSG 2775 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 78, col 26 to line 78, col 31 of module replicated: 90 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 84, col 13 to line 86, col 37 of module replicated: 60 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 87, col 8 to line 87, col 58 of module replicated: 60 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 0:0 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 99, col 8 to line 99, col 30 of module replicated: 5 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 99, col 8 to line 99, col 25 of module replicated: 5 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 91, col 5 to line 96, col 70 of module replicated: 5 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||line 91, col 8 to line 91, col 27 of module replicated: 5 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||line 94, col 19 to line 94, col 37 of module replicated: 5 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||line 96, col 9 to line 96, col 70 of module replicated: 5 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||||line 96, col 30 to line 96, col 69 of module replicated: 15 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||||line 96, col 16 to line 96, col 27 of module replicated: 5 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 99, col 24 to line 99, col 24 of module replicated: 5 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 100, col 8 to line 100, col 109 of module replicated: 0 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 101, col 8 to line 101, col 58 of module replicated: 0 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2202:0 @!@!@ +End of statistics. +@!@!@ENDMSG 2202 @!@!@ +@!@!@STARTMSG 2200:0 @!@!@ +Progress(4) at 2025-01-19 18:28:23: 97 states generated (2.165 s/min), 9 distinct states found (200 ds/min), 5 states left on queue. +@!@!@ENDMSG 2200 @!@!@ +@!@!@STARTMSG 2199:0 @!@!@ +97 states generated, 9 distinct states found, 5 states left on queue. +@!@!@ENDMSG 2199 @!@!@ +@!@!@STARTMSG 2186:0 @!@!@ +Finished in 2701ms at (2025-01-19 18:28:23) +@!@!@ENDMSG 2186 @!@!@ diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307704621/replicated.tla b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307704621/replicated.tla new file mode 100644 index 0000000000..a9b14acae2 --- /dev/null +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307704621/replicated.tla @@ -0,0 +1,131 @@ +---- MODULE replicated ---- + +EXTENDS Integers, FiniteSets + +VARIABLES broker_state, safekeeper_state, pageserver_state, online + + +CONSTANT + brokers, + safekeepers, + pageservers, + azs, + az_mapping + +CONSTANT + NULL + +CONSTANT + max_commit_lsn + +StateConstraint == + /\ \A s \in safekeepers: + /\ safekeeper_state[s].commit_lsn <= max_commit_lsn + /\ \A b \in brokers: + /\ \A s \in DOMAIN broker_state[b].sk: + /\ broker_state[b].sk[s].commit_lsn <= max_commit_lsn + + +InitSafekeeper == [pruned_lsn |-> 0, commit_lsn |-> 0] +InitBroker == [sk |-> [s \in safekeepers |-> [commit_lsn |-> 0]]] +InitPageserver == [last_record_lsn |-> 0, preferred_sk |-> NULL, sk |-> [s \in safekeepers |-> [commit_lsn |-> 0]]] +InitOnline == safekeepers \cup brokers \cup pageservers + +Init == + /\ broker_state = [b \in brokers |-> InitBroker] + /\ safekeeper_state = [s \in safekeepers |-> InitSafekeeper] + /\ pageserver_state = [p \in pageservers |-> InitPageserver] + /\ online = InitOnline + +NodeOnlineOffline == + /\ online' = CHOOSE ss \in SUBSET InitOnline: + /\ Cardinality(ss \cap safekeepers) >= 2 + /\ Cardinality(ss \cap brokers) >= 2 + /\ ss \cap pageservers = pageservers \* assume no PS failures for now + /\ UNCHANGED <> + +SkCommit(s1, s2) == + /\ {s1, s2} \subseteq online + /\ s1 # s2 + /\ safekeeper_state[s1].commit_lsn = safekeeper_state[s2].commit_lsn + /\ LET + new_commit_lsn == safekeeper_state[s1].commit_lsn + 1 + IN + safekeeper_state' = [safekeeper_state EXCEPT + ![s1].commit_lsn = new_commit_lsn, + ![s2].commit_lsn = new_commit_lsn] + /\ UNCHANGED <> + +SkPeerRecovery(s1,s2) == + /\ {s1, s2} \subseteq online + /\ safekeeper_state[s1].commit_lsn < safekeeper_state[s2].commit_lsn + /\ safekeeper_state' = [safekeeper_state EXCEPT![s1].commit_lsn = safekeeper_state[s2].commit_lsn] + /\ UNCHANGED <> + +SkPushToBroker(s,b) == + /\ {s, b} \subseteq online + /\ broker_state' = IF broker_state[b].sk[s].commit_lsn < safekeeper_state[s].commit_lsn + THEN + LET + bsk == broker_state[b].sk + updbsk == [bsk EXCEPT ![s].commit_lsn = safekeeper_state[s].commit_lsn] + IN + [broker_state EXCEPT ![b].sk = updbsk] + ELSE broker_state + /\ UNCHANGED <> + +PsRecvBroker(b,p,s) == + /\ {b,p,s} \subseteq online + /\ LET + bsk == broker_state[b].sk[s] + psk == pageserver_state[p].sk[s] + updpsk == [psk EXCEPT !["commit_lsn"] = bsk.commit_lsn] + IN + pageserver_state' = IF bsk.commit_lsn > psk.commit_lsn + THEN [pageserver_state EXCEPT ![p].sk[s] = updpsk] + ELSE pageserver_state + /\ UNCHANGED <> + + +SksWithNewerWal(p) == + /\ {p} \subseteq online + /\ + LET + ps == pageserver_state[p] + IN + {s \in DOMAIN ps.sk: ps.sk[s].commit_lsn > ps.last_record_lsn} + +PsChooseSk(p) == + /\ SksWithNewerWal(p) # {} + /\ pageserver_state' = [pageserver_state EXCEPT![p].preferred_sk = CHOOSE s \in SksWithNewerWal(p): TRUE] + /\ UNCHANGED <> + + +Next == + \/ NodeOnlineOffline + \/ \E s1 \in safekeepers: \E s2 \in safekeepers: + \/ SkCommit(s1, s2) + \/ SkPeerRecovery(s1, s2) + \/ \E s \in safekeepers: \E b \in brokers: SkPushToBroker(s, b) + \/ \E s \in safekeepers: \E b \in brokers: \E p \in pageservers: PsRecvBroker(b,p,s) + \/ \E p \in pageservers: PsChooseSk(p) + + +Spec == Init /\ [][Next]_<< broker_state, safekeeper_state, pageserver_state,online>> + + +\* invariants + +EventuallyLaggingSkIsNotPreferredSk == <>( + LET + sks == safekeeper_state + lagging_sks == { s \in safekeepers: \A s2 \in safekeepers: sks[s].commit_lsn <= sks[s2].commit_lsn } + preferred_sks == {pageserver_state[p].preferred_sk: p \in pageservers} + IN + preferred_sks \cap lagging_sks = {} + + ) + + + +==== \ No newline at end of file diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307769810/MC.cfg b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307769810/MC.cfg new file mode 100644 index 0000000000..d1470337f9 --- /dev/null +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307769810/MC.cfg @@ -0,0 +1,51 @@ +\* MV CONSTANT declarations +CONSTANTS +b1 = b1 +b2 = b2 +b3 = b3 +\* MV CONSTANT declarations +CONSTANTS +s1 = s1 +s2 = s2 +s3 = s3 +\* MV CONSTANT declarations +CONSTANTS +p1 = p1 +p2 = p2 +\* MV CONSTANT declarations +CONSTANTS +az1 = az1 +az2 = az2 +az3 = az3 +\* MV CONSTANT definitions +CONSTANT +brokers <- const_173730775393038000 +\* CONSTANT declarations +CONSTANT NULL = NULL +\* MV CONSTANT definitions +CONSTANT +safekeepers <- const_173730775393039000 +\* MV CONSTANT definitions +CONSTANT +pageservers <- const_173730775393040000 +\* MV CONSTANT definitions +CONSTANT +azs <- const_173730775393041000 +\* SYMMETRY definition +SYMMETRY symm_173730775393042000 +\* CONSTANT definitions +CONSTANT +max_commit_lsn <- const_173730775393043000 +\* CONSTANT definitions +CONSTANT +az_mapping <- const_173730775393044000 +\* CONSTRAINT definition +CONSTRAINT +constr_173730775393045000 +\* SPECIFICATION definition +SPECIFICATION +Spec +\* PROPERTY definition +PROPERTY +EventuallyLaggingSkIsNotPreferredSk +\* Generated on Sun Jan 19 18:29:13 CET 2025 \ No newline at end of file diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737301223409/MC.out b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307769810/MC.out similarity index 80% rename from storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737301223409/MC.out rename to storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307769810/MC.out index ab92cbb3d7..21638f26fe 100644 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737301223409/MC.out +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307769810/MC.out @@ -2,7 +2,7 @@ TLC2 Version 2.19 of 08 August 2024 (rev: 5a47802) @!@!@ENDMSG 2262 @!@!@ @!@!@STARTMSG 2187:0 @!@!@ -Running breadth-first search Model-Checking with fp 20 and seed 6372772458573668883 with 4 workers on 8 cores with 2428MB heap and 5460MB offheap memory [pid: 9898] (Mac OS X 10.16 x86_64, AdoptOpenJDK 14.0.1 x86_64, OffHeapDiskFPSet, DiskStateQueue). +Running breadth-first search Model-Checking with fp 19 and seed -4959290627086969114 with 4 workers on 8 cores with 2428MB heap and 5460MB offheap memory [pid: 11541] (Mac OS X 10.16 x86_64, AdoptOpenJDK 14.0.1 x86_64, OffHeapDiskFPSet, DiskStateQueue). @!@!@ENDMSG 2187 @!@!@ @!@!@STARTMSG 2220:0 @!@!@ Starting SANY... @@ -11,21 +11,21 @@ Parsing file /Users/cs/src/neon/storage_broker/spec/replicated/replicated.toolbo Parsing file /Users/cs/src/neon/storage_broker/spec/replicated/replicated.toolbox/Model_1/replicated.tla Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/TLC.tla Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Integers.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/FiniteSets.tla Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Naturals.tla Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Sequences.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/FiniteSets.tla Semantic processing of module Naturals Semantic processing of module Integers -Semantic processing of module replicated Semantic processing of module Sequences Semantic processing of module FiniteSets +Semantic processing of module replicated Semantic processing of module TLC Semantic processing of module MC @!@!@STARTMSG 2219:0 @!@!@ SANY finished. @!@!@ENDMSG 2219 @!@!@ @!@!@STARTMSG 2185:0 @!@!@ -Starting... (2025-01-19 16:40:16) +Starting... (2025-01-19 18:29:15) @!@!@ENDMSG 2185 @!@!@ @!@!@STARTMSG 2279:3 @!@!@ Declaring symmetry during liveness checking is dangerous. It might cause TLC to miss violations of the stated liveness properties. Please check liveness without symmetry defined. @@ -40,14 +40,14 @@ Implied-temporal checking--satisfiability problem has 1 branches. Computing initial states... @!@!@ENDMSG 2189 @!@!@ @!@!@STARTMSG 2190:0 @!@!@ -Finished computing initial states: 1 distinct state generated at 2025-01-19 16:40:18. +Finished computing initial states: 1 distinct state generated at 2025-01-19 18:29:16. @!@!@ENDMSG 2190 @!@!@ @!@!@STARTMSG 2192:0 @!@!@ -Checking temporal properties for the current state space with 1217 total distinct states at (2025-01-19 16:40:21) +Checking temporal properties for the current state space with 1431 total distinct states at (2025-01-19 18:29:19) @!@!@ENDMSG 2192 @!@!@ @!@!@STARTMSG 2267:0 @!@!@ -Finished checking temporal properties in 00s at 2025-01-19 16:40:21 +Finished checking temporal properties in 00s at 2025-01-19 18:29:19 @!@!@ENDMSG 2267 @!@!@ @!@!@STARTMSG 2200:0 @!@!@ -Progress(11) at 2025-01-19 16:40:21: 39.816 states generated (39.816 s/min), 3.288 distinct states found (3.288 ds/min), 2.067 states left on queue. +Progress(10) at 2025-01-19 18:29:19: 38.274 states generated (38.274 s/min), 4.060 distinct states found (4.060 ds/min), 2.625 states left on queue. @!@!@ENDMSG 2200 @!@!@ diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307769810/MC.tla b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307769810/MC.tla new file mode 100644 index 0000000000..8b1824f370 --- /dev/null +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307769810/MC.tla @@ -0,0 +1,65 @@ +---- MODULE MC ---- +EXTENDS replicated, TLC + +\* MV CONSTANT declarations@modelParameterConstants +CONSTANTS +b1, b2, b3 +---- + +\* MV CONSTANT declarations@modelParameterConstants +CONSTANTS +s1, s2, s3 +---- + +\* MV CONSTANT declarations@modelParameterConstants +CONSTANTS +p1, p2 +---- + +\* MV CONSTANT declarations@modelParameterConstants +CONSTANTS +az1, az2, az3 +---- + +\* MV CONSTANT definitions brokers +const_173730775393038000 == +{b1, b2, b3} +---- + +\* MV CONSTANT definitions safekeepers +const_173730775393039000 == +{s1, s2, s3} +---- + +\* MV CONSTANT definitions pageservers +const_173730775393040000 == +{p1, p2} +---- + +\* MV CONSTANT definitions azs +const_173730775393041000 == +{az1, az2, az3} +---- + +\* SYMMETRY definition +symm_173730775393042000 == +Permutations(const_173730775393038000) \union Permutations(const_173730775393039000) \union Permutations(const_173730775393040000) \union Permutations(const_173730775393041000) +---- + +\* CONSTANT definitions @modelParameterConstants:4max_commit_lsn +const_173730775393043000 == +2 +---- + +\* CONSTANT definitions @modelParameterConstants:5az_mapping +const_173730775393044000 == +[ az1 |-> {b1,s1,p1} , az2 |-> {b2,s2,p2} , az3 |-> {b3,s3}] +---- + +\* CONSTRAINT definition @modelParameterContraint:0 +constr_173730775393045000 == +StateConstraint +---- +============================================================================= +\* Modification History +\* Created Sun Jan 19 18:29:13 CET 2025 by cs diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737301223409/MC_TE.out b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307769810/MC_TE.out similarity index 80% rename from storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737301223409/MC_TE.out rename to storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307769810/MC_TE.out index ab92cbb3d7..21638f26fe 100644 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737301223409/MC_TE.out +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307769810/MC_TE.out @@ -2,7 +2,7 @@ TLC2 Version 2.19 of 08 August 2024 (rev: 5a47802) @!@!@ENDMSG 2262 @!@!@ @!@!@STARTMSG 2187:0 @!@!@ -Running breadth-first search Model-Checking with fp 20 and seed 6372772458573668883 with 4 workers on 8 cores with 2428MB heap and 5460MB offheap memory [pid: 9898] (Mac OS X 10.16 x86_64, AdoptOpenJDK 14.0.1 x86_64, OffHeapDiskFPSet, DiskStateQueue). +Running breadth-first search Model-Checking with fp 19 and seed -4959290627086969114 with 4 workers on 8 cores with 2428MB heap and 5460MB offheap memory [pid: 11541] (Mac OS X 10.16 x86_64, AdoptOpenJDK 14.0.1 x86_64, OffHeapDiskFPSet, DiskStateQueue). @!@!@ENDMSG 2187 @!@!@ @!@!@STARTMSG 2220:0 @!@!@ Starting SANY... @@ -11,21 +11,21 @@ Parsing file /Users/cs/src/neon/storage_broker/spec/replicated/replicated.toolbo Parsing file /Users/cs/src/neon/storage_broker/spec/replicated/replicated.toolbox/Model_1/replicated.tla Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/TLC.tla Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Integers.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/FiniteSets.tla Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Naturals.tla Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Sequences.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/FiniteSets.tla Semantic processing of module Naturals Semantic processing of module Integers -Semantic processing of module replicated Semantic processing of module Sequences Semantic processing of module FiniteSets +Semantic processing of module replicated Semantic processing of module TLC Semantic processing of module MC @!@!@STARTMSG 2219:0 @!@!@ SANY finished. @!@!@ENDMSG 2219 @!@!@ @!@!@STARTMSG 2185:0 @!@!@ -Starting... (2025-01-19 16:40:16) +Starting... (2025-01-19 18:29:15) @!@!@ENDMSG 2185 @!@!@ @!@!@STARTMSG 2279:3 @!@!@ Declaring symmetry during liveness checking is dangerous. It might cause TLC to miss violations of the stated liveness properties. Please check liveness without symmetry defined. @@ -40,14 +40,14 @@ Implied-temporal checking--satisfiability problem has 1 branches. Computing initial states... @!@!@ENDMSG 2189 @!@!@ @!@!@STARTMSG 2190:0 @!@!@ -Finished computing initial states: 1 distinct state generated at 2025-01-19 16:40:18. +Finished computing initial states: 1 distinct state generated at 2025-01-19 18:29:16. @!@!@ENDMSG 2190 @!@!@ @!@!@STARTMSG 2192:0 @!@!@ -Checking temporal properties for the current state space with 1217 total distinct states at (2025-01-19 16:40:21) +Checking temporal properties for the current state space with 1431 total distinct states at (2025-01-19 18:29:19) @!@!@ENDMSG 2192 @!@!@ @!@!@STARTMSG 2267:0 @!@!@ -Finished checking temporal properties in 00s at 2025-01-19 16:40:21 +Finished checking temporal properties in 00s at 2025-01-19 18:29:19 @!@!@ENDMSG 2267 @!@!@ @!@!@STARTMSG 2200:0 @!@!@ -Progress(11) at 2025-01-19 16:40:21: 39.816 states generated (39.816 s/min), 3.288 distinct states found (3.288 ds/min), 2.067 states left on queue. +Progress(10) at 2025-01-19 18:29:19: 38.274 states generated (38.274 s/min), 4.060 distinct states found (4.060 ds/min), 2.625 states left on queue. @!@!@ENDMSG 2200 @!@!@ diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299469039/fullmesh.tla b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307769810/replicated.tla similarity index 75% rename from storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299469039/fullmesh.tla rename to storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307769810/replicated.tla index 047ececfe2..fca339edab 100644 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299469039/fullmesh.tla +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307769810/replicated.tla @@ -1,8 +1,8 @@ ----- MODULE fullmesh ---- +---- MODULE replicated ---- -EXTENDS Integers +EXTENDS Integers, FiniteSets -VARIABLES broker_state, safekeeper_state, pageserver_state +VARIABLES broker_state, safekeeper_state, pageserver_state, online CONSTANT @@ -29,14 +29,23 @@ StateConstraint == InitSafekeeper == [pruned_lsn |-> 0, commit_lsn |-> 0] InitBroker == [sk |-> [s \in safekeepers |-> [commit_lsn |-> 0]]] InitPageserver == [last_record_lsn |-> 0, preferred_sk |-> NULL, sk |-> [s \in safekeepers |-> [commit_lsn |-> 0]]] +InitOnline == safekeepers \cup brokers \cup pageservers Init == /\ broker_state = [b \in brokers |-> InitBroker] /\ safekeeper_state = [s \in safekeepers |-> InitSafekeeper] /\ pageserver_state = [p \in pageservers |-> InitPageserver] + /\ online = InitOnline +NodeOnlineOffline == + /\ online' = CHOOSE ss \in SUBSET InitOnline: + /\ Cardinality(ss \cap safekeepers) >= 2 + /\ Cardinality(ss \cap brokers) >= 2 + /\ ss \cap pageservers = pageservers \* assume no PS failures for now + /\ UNCHANGED <> SkCommit(s1, s2) == + /\ {s1, s2} \subseteq online /\ s1 # s2 /\ safekeeper_state[s1].commit_lsn = safekeeper_state[s2].commit_lsn /\ LET @@ -45,13 +54,16 @@ SkCommit(s1, s2) == safekeeper_state' = [safekeeper_state EXCEPT ![s1].commit_lsn = new_commit_lsn, ![s2].commit_lsn = new_commit_lsn] - /\ UNCHANGED <> + /\ UNCHANGED <> SkPeerRecovery(s1,s2) == + /\ {s1, s2} \subseteq online /\ safekeeper_state[s1].commit_lsn < safekeeper_state[s2].commit_lsn /\ safekeeper_state' = [safekeeper_state EXCEPT![s1].commit_lsn = safekeeper_state[s2].commit_lsn] + /\ UNCHANGED <> SkPushToBroker(s,b) == + /\ {s, b} \subseteq online /\ broker_state' = IF broker_state[b].sk[s].commit_lsn < safekeeper_state[s].commit_lsn THEN LET @@ -60,9 +72,10 @@ SkPushToBroker(s,b) == IN [broker_state EXCEPT ![b].sk = updbsk] ELSE broker_state - /\ UNCHANGED <> + /\ UNCHANGED <> PsRecvBroker(b,p,s) == + /\ {b,p,s} \subseteq online /\ LET bsk == broker_state[b].sk[s] psk == pageserver_state[p].sk[s] @@ -71,7 +84,7 @@ PsRecvBroker(b,p,s) == pageserver_state' = IF bsk.commit_lsn > psk.commit_lsn THEN [pageserver_state EXCEPT ![p].sk[s] = updpsk] ELSE pageserver_state - /\ UNCHANGED <> + /\ UNCHANGED <> SksWithNewerWal(p) == @@ -81,13 +94,14 @@ SksWithNewerWal(p) == {s \in DOMAIN ps.sk: ps.sk[s].commit_lsn > ps.last_record_lsn} PsChooseSk(p) == + /\ {p} \subseteq online /\ SksWithNewerWal(p) # {} /\ pageserver_state' = [pageserver_state EXCEPT![p].preferred_sk = CHOOSE s \in SksWithNewerWal(p): TRUE] - /\ UNCHANGED <> + /\ UNCHANGED <> Next == - + \/ NodeOnlineOffline \/ \E s1 \in safekeepers: \E s2 \in safekeepers: \/ SkCommit(s1, s2) \/ SkPeerRecovery(s1, s2) @@ -96,7 +110,7 @@ Next == \/ \E p \in pageservers: PsChooseSk(p) -Spec == Init /\ [][Next]_<< broker_state, safekeeper_state, pageserver_state >> +Spec == Init /\ [][Next]_<< broker_state, safekeeper_state, pageserver_state,online>> \* invariants diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307828738/MC.cfg b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307828738/MC.cfg new file mode 100644 index 0000000000..ff576a1795 --- /dev/null +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307828738/MC.cfg @@ -0,0 +1,50 @@ +\* MV CONSTANT declarations +CONSTANTS +b1 = b1 +b2 = b2 +b3 = b3 +\* MV CONSTANT declarations +CONSTANTS +s1 = s1 +s2 = s2 +s3 = s3 +\* MV CONSTANT declarations +CONSTANTS +p1 = p1 +\* MV CONSTANT declarations +CONSTANTS +az1 = az1 +az2 = az2 +az3 = az3 +\* MV CONSTANT definitions +CONSTANT +brokers <- const_173730781391774000 +\* CONSTANT declarations +CONSTANT NULL = NULL +\* MV CONSTANT definitions +CONSTANT +safekeepers <- const_173730781391775000 +\* MV CONSTANT definitions +CONSTANT +pageservers <- const_173730781391776000 +\* MV CONSTANT definitions +CONSTANT +azs <- const_173730781391777000 +\* SYMMETRY definition +SYMMETRY symm_173730781391778000 +\* CONSTANT definitions +CONSTANT +max_commit_lsn <- const_173730781391779000 +\* CONSTANT definitions +CONSTANT +az_mapping <- const_173730781391780000 +\* CONSTRAINT definition +CONSTRAINT +constr_173730781391781000 +\* SPECIFICATION definition +SPECIFICATION +Spec +\* PROPERTY definition +PROPERTY +EventuallyLaggingSkIsNotPreferredSk +\* Generated on Sun Jan 19 18:30:13 CET 2025 \ No newline at end of file diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737301172627/MC.out b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307828738/MC.out similarity index 75% rename from storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737301172627/MC.out rename to storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307828738/MC.out index 32aec7b880..f1349ccb01 100644 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737301172627/MC.out +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307828738/MC.out @@ -2,7 +2,7 @@ TLC2 Version 2.19 of 08 August 2024 (rev: 5a47802) @!@!@ENDMSG 2262 @!@!@ @!@!@STARTMSG 2187:0 @!@!@ -Running breadth-first search Model-Checking with fp 71 and seed 2330797625274141225 with 4 workers on 8 cores with 2428MB heap and 5460MB offheap memory [pid: 9710] (Mac OS X 10.16 x86_64, AdoptOpenJDK 14.0.1 x86_64, OffHeapDiskFPSet, DiskStateQueue). +Running breadth-first search Model-Checking with fp 24 and seed -1042781833563910669 with 4 workers on 8 cores with 2428MB heap and 5460MB offheap memory [pid: 11591] (Mac OS X 10.16 x86_64, AdoptOpenJDK 14.0.1 x86_64, OffHeapDiskFPSet, DiskStateQueue). @!@!@ENDMSG 2187 @!@!@ @!@!@STARTMSG 2220:0 @!@!@ Starting SANY... @@ -11,21 +11,21 @@ Parsing file /Users/cs/src/neon/storage_broker/spec/replicated/replicated.toolbo Parsing file /Users/cs/src/neon/storage_broker/spec/replicated/replicated.toolbox/Model_1/replicated.tla Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/TLC.tla Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Integers.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/FiniteSets.tla Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Naturals.tla Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Sequences.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/FiniteSets.tla Semantic processing of module Naturals Semantic processing of module Integers -Semantic processing of module replicated Semantic processing of module Sequences Semantic processing of module FiniteSets +Semantic processing of module replicated Semantic processing of module TLC Semantic processing of module MC @!@!@STARTMSG 2219:0 @!@!@ SANY finished. @!@!@ENDMSG 2219 @!@!@ @!@!@STARTMSG 2185:0 @!@!@ -Starting... (2025-01-19 16:39:29) +Starting... (2025-01-19 18:30:15) @!@!@ENDMSG 2185 @!@!@ @!@!@STARTMSG 2279:3 @!@!@ Declaring symmetry during liveness checking is dangerous. It might cause TLC to miss violations of the stated liveness properties. Please check liveness without symmetry defined. @@ -40,5 +40,14 @@ Implied-temporal checking--satisfiability problem has 1 branches. Computing initial states... @!@!@ENDMSG 2189 @!@!@ @!@!@STARTMSG 2190:0 @!@!@ -Finished computing initial states: 1 distinct state generated at 2025-01-19 16:39:31. +Finished computing initial states: 1 distinct state generated at 2025-01-19 18:30:16. @!@!@ENDMSG 2190 @!@!@ +@!@!@STARTMSG 2192:0 @!@!@ +Checking temporal properties for the current state space with 3889 total distinct states at (2025-01-19 18:30:19) +@!@!@ENDMSG 2192 @!@!@ +@!@!@STARTMSG 2267:0 @!@!@ +Finished checking temporal properties in 00s at 2025-01-19 18:30:19 +@!@!@ENDMSG 2267 @!@!@ +@!@!@STARTMSG 2200:0 @!@!@ +Progress(11) at 2025-01-19 18:30:19: 78.397 states generated (78.397 s/min), 8.627 distinct states found (8.627 ds/min), 4.735 states left on queue. +@!@!@ENDMSG 2200 @!@!@ diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307828738/MC.tla b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307828738/MC.tla new file mode 100644 index 0000000000..0079b64427 --- /dev/null +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307828738/MC.tla @@ -0,0 +1,65 @@ +---- MODULE MC ---- +EXTENDS replicated, TLC + +\* MV CONSTANT declarations@modelParameterConstants +CONSTANTS +b1, b2, b3 +---- + +\* MV CONSTANT declarations@modelParameterConstants +CONSTANTS +s1, s2, s3 +---- + +\* MV CONSTANT declarations@modelParameterConstants +CONSTANTS +p1 +---- + +\* MV CONSTANT declarations@modelParameterConstants +CONSTANTS +az1, az2, az3 +---- + +\* MV CONSTANT definitions brokers +const_173730781391774000 == +{b1, b2, b3} +---- + +\* MV CONSTANT definitions safekeepers +const_173730781391775000 == +{s1, s2, s3} +---- + +\* MV CONSTANT definitions pageservers +const_173730781391776000 == +{p1} +---- + +\* MV CONSTANT definitions azs +const_173730781391777000 == +{az1, az2, az3} +---- + +\* SYMMETRY definition +symm_173730781391778000 == +Permutations(const_173730781391774000) \union Permutations(const_173730781391775000) \union Permutations(const_173730781391776000) \union Permutations(const_173730781391777000) +---- + +\* CONSTANT definitions @modelParameterConstants:4max_commit_lsn +const_173730781391779000 == +2 +---- + +\* CONSTANT definitions @modelParameterConstants:5az_mapping +const_173730781391780000 == +[ az1 |-> {b1,s1,p1} , az2 |-> {b2,s2} , az3 |-> {b3,s3}] +---- + +\* CONSTRAINT definition @modelParameterContraint:0 +constr_173730781391781000 == +StateConstraint +---- +============================================================================= +\* Modification History +\* Created Sun Jan 19 18:30:13 CET 2025 by cs diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737301172627/MC_TE.out b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307828738/MC_TE.out similarity index 75% rename from storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737301172627/MC_TE.out rename to storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307828738/MC_TE.out index 32aec7b880..f1349ccb01 100644 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737301172627/MC_TE.out +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307828738/MC_TE.out @@ -2,7 +2,7 @@ TLC2 Version 2.19 of 08 August 2024 (rev: 5a47802) @!@!@ENDMSG 2262 @!@!@ @!@!@STARTMSG 2187:0 @!@!@ -Running breadth-first search Model-Checking with fp 71 and seed 2330797625274141225 with 4 workers on 8 cores with 2428MB heap and 5460MB offheap memory [pid: 9710] (Mac OS X 10.16 x86_64, AdoptOpenJDK 14.0.1 x86_64, OffHeapDiskFPSet, DiskStateQueue). +Running breadth-first search Model-Checking with fp 24 and seed -1042781833563910669 with 4 workers on 8 cores with 2428MB heap and 5460MB offheap memory [pid: 11591] (Mac OS X 10.16 x86_64, AdoptOpenJDK 14.0.1 x86_64, OffHeapDiskFPSet, DiskStateQueue). @!@!@ENDMSG 2187 @!@!@ @!@!@STARTMSG 2220:0 @!@!@ Starting SANY... @@ -11,21 +11,21 @@ Parsing file /Users/cs/src/neon/storage_broker/spec/replicated/replicated.toolbo Parsing file /Users/cs/src/neon/storage_broker/spec/replicated/replicated.toolbox/Model_1/replicated.tla Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/TLC.tla Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Integers.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/FiniteSets.tla Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Naturals.tla Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Sequences.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/FiniteSets.tla Semantic processing of module Naturals Semantic processing of module Integers -Semantic processing of module replicated Semantic processing of module Sequences Semantic processing of module FiniteSets +Semantic processing of module replicated Semantic processing of module TLC Semantic processing of module MC @!@!@STARTMSG 2219:0 @!@!@ SANY finished. @!@!@ENDMSG 2219 @!@!@ @!@!@STARTMSG 2185:0 @!@!@ -Starting... (2025-01-19 16:39:29) +Starting... (2025-01-19 18:30:15) @!@!@ENDMSG 2185 @!@!@ @!@!@STARTMSG 2279:3 @!@!@ Declaring symmetry during liveness checking is dangerous. It might cause TLC to miss violations of the stated liveness properties. Please check liveness without symmetry defined. @@ -40,5 +40,14 @@ Implied-temporal checking--satisfiability problem has 1 branches. Computing initial states... @!@!@ENDMSG 2189 @!@!@ @!@!@STARTMSG 2190:0 @!@!@ -Finished computing initial states: 1 distinct state generated at 2025-01-19 16:39:31. +Finished computing initial states: 1 distinct state generated at 2025-01-19 18:30:16. @!@!@ENDMSG 2190 @!@!@ +@!@!@STARTMSG 2192:0 @!@!@ +Checking temporal properties for the current state space with 3889 total distinct states at (2025-01-19 18:30:19) +@!@!@ENDMSG 2192 @!@!@ +@!@!@STARTMSG 2267:0 @!@!@ +Finished checking temporal properties in 00s at 2025-01-19 18:30:19 +@!@!@ENDMSG 2267 @!@!@ +@!@!@STARTMSG 2200:0 @!@!@ +Progress(11) at 2025-01-19 18:30:19: 78.397 states generated (78.397 s/min), 8.627 distinct states found (8.627 ds/min), 4.735 states left on queue. +@!@!@ENDMSG 2200 @!@!@ diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299542008/fullmesh.tla b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307828738/replicated.tla similarity index 75% rename from storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299542008/fullmesh.tla rename to storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307828738/replicated.tla index 06c69da79a..fca339edab 100644 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299542008/fullmesh.tla +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737307828738/replicated.tla @@ -1,8 +1,8 @@ ----- MODULE fullmesh ---- +---- MODULE replicated ---- -EXTENDS Integers +EXTENDS Integers, FiniteSets -VARIABLES broker_state, safekeeper_state, pageserver_state +VARIABLES broker_state, safekeeper_state, pageserver_state, online CONSTANT @@ -29,14 +29,23 @@ StateConstraint == InitSafekeeper == [pruned_lsn |-> 0, commit_lsn |-> 0] InitBroker == [sk |-> [s \in safekeepers |-> [commit_lsn |-> 0]]] InitPageserver == [last_record_lsn |-> 0, preferred_sk |-> NULL, sk |-> [s \in safekeepers |-> [commit_lsn |-> 0]]] +InitOnline == safekeepers \cup brokers \cup pageservers Init == /\ broker_state = [b \in brokers |-> InitBroker] /\ safekeeper_state = [s \in safekeepers |-> InitSafekeeper] /\ pageserver_state = [p \in pageservers |-> InitPageserver] + /\ online = InitOnline +NodeOnlineOffline == + /\ online' = CHOOSE ss \in SUBSET InitOnline: + /\ Cardinality(ss \cap safekeepers) >= 2 + /\ Cardinality(ss \cap brokers) >= 2 + /\ ss \cap pageservers = pageservers \* assume no PS failures for now + /\ UNCHANGED <> SkCommit(s1, s2) == + /\ {s1, s2} \subseteq online /\ s1 # s2 /\ safekeeper_state[s1].commit_lsn = safekeeper_state[s2].commit_lsn /\ LET @@ -45,14 +54,16 @@ SkCommit(s1, s2) == safekeeper_state' = [safekeeper_state EXCEPT ![s1].commit_lsn = new_commit_lsn, ![s2].commit_lsn = new_commit_lsn] - /\ UNCHANGED <> + /\ UNCHANGED <> SkPeerRecovery(s1,s2) == + /\ {s1, s2} \subseteq online /\ safekeeper_state[s1].commit_lsn < safekeeper_state[s2].commit_lsn /\ safekeeper_state' = [safekeeper_state EXCEPT![s1].commit_lsn = safekeeper_state[s2].commit_lsn] - /\ UNCHANGED <> + /\ UNCHANGED <> SkPushToBroker(s,b) == + /\ {s, b} \subseteq online /\ broker_state' = IF broker_state[b].sk[s].commit_lsn < safekeeper_state[s].commit_lsn THEN LET @@ -61,9 +72,10 @@ SkPushToBroker(s,b) == IN [broker_state EXCEPT ![b].sk = updbsk] ELSE broker_state - /\ UNCHANGED <> + /\ UNCHANGED <> PsRecvBroker(b,p,s) == + /\ {b,p,s} \subseteq online /\ LET bsk == broker_state[b].sk[s] psk == pageserver_state[p].sk[s] @@ -72,7 +84,7 @@ PsRecvBroker(b,p,s) == pageserver_state' = IF bsk.commit_lsn > psk.commit_lsn THEN [pageserver_state EXCEPT ![p].sk[s] = updpsk] ELSE pageserver_state - /\ UNCHANGED <> + /\ UNCHANGED <> SksWithNewerWal(p) == @@ -82,13 +94,14 @@ SksWithNewerWal(p) == {s \in DOMAIN ps.sk: ps.sk[s].commit_lsn > ps.last_record_lsn} PsChooseSk(p) == + /\ {p} \subseteq online /\ SksWithNewerWal(p) # {} /\ pageserver_state' = [pageserver_state EXCEPT![p].preferred_sk = CHOOSE s \in SksWithNewerWal(p): TRUE] - /\ UNCHANGED <> + /\ UNCHANGED <> Next == - + \/ NodeOnlineOffline \/ \E s1 \in safekeepers: \E s2 \in safekeepers: \/ SkCommit(s1, s2) \/ SkPeerRecovery(s1, s2) @@ -97,7 +110,7 @@ Next == \/ \E p \in pageservers: PsChooseSk(p) -Spec == Init /\ [][Next]_<< broker_state, safekeeper_state, pageserver_state >> +Spec == Init /\ [][Next]_<< broker_state, safekeeper_state, pageserver_state,online>> \* invariants diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299352762/MC.cfg b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308024914/MC.cfg similarity index 63% rename from storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299352762/MC.cfg rename to storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308024914/MC.cfg index fa522b981a..8dd1d266c3 100644 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299352762/MC.cfg +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308024914/MC.cfg @@ -11,7 +11,6 @@ s3 = s3 \* MV CONSTANT declarations CONSTANTS p1 = p1 -p2 = p2 \* MV CONSTANT declarations CONSTANTS az1 = az1 @@ -19,33 +18,36 @@ az2 = az2 az3 = az3 \* MV CONSTANT definitions CONSTANT -brokers <- const_1737299350679194000 +brokers <- const_1737308022622113000 \* CONSTANT declarations CONSTANT NULL = NULL \* MV CONSTANT definitions CONSTANT -safekeepers <- const_1737299350679195000 +safekeepers <- const_1737308022622114000 \* MV CONSTANT definitions CONSTANT -pageservers <- const_1737299350679196000 +pageservers <- const_1737308022622115000 \* MV CONSTANT definitions CONSTANT -azs <- const_1737299350679197000 +azs <- const_1737308022622116000 \* SYMMETRY definition -SYMMETRY symm_1737299350679198000 +SYMMETRY symm_1737308022622117000 \* CONSTANT definitions CONSTANT -max_commit_lsn <- const_1737299350679199000 +max_commit_lsn <- const_1737308022622118000 \* CONSTANT definitions CONSTANT -az_mapping <- const_1737299350679200000 +az_mapping <- const_1737308022622119000 \* CONSTRAINT definition CONSTRAINT -constr_1737299350680201000 +constr_1737308022622120000 \* SPECIFICATION definition SPECIFICATION Spec \* INVARIANT definition INVARIANT +PsLagsSk +\* PROPERTY definition +PROPERTY EventuallyLaggingSkIsNotPreferredSk -\* Generated on Sun Jan 19 16:09:10 CET 2025 \ No newline at end of file +\* Generated on Sun Jan 19 18:33:42 CET 2025 \ No newline at end of file diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299352762/MC.out b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308024914/MC.out similarity index 67% rename from storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299352762/MC.out rename to storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308024914/MC.out index 27a0150e6e..59da3df845 100644 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299352762/MC.out +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308024914/MC.out @@ -2,34 +2,34 @@ TLC2 Version 2.19 of 08 August 2024 (rev: 5a47802) @!@!@ENDMSG 2262 @!@!@ @!@!@STARTMSG 2187:0 @!@!@ -Running breadth-first search Model-Checking with fp 119 and seed -1908114041878732601 with 4 workers on 8 cores with 2428MB heap and 5460MB offheap memory [pid: 7665] (Mac OS X 10.16 x86_64, AdoptOpenJDK 14.0.1 x86_64, OffHeapDiskFPSet, DiskStateQueue). +Running breadth-first search Model-Checking with fp 95 and seed 5720921755138129000 with 4 workers on 8 cores with 2428MB heap and 5460MB offheap memory [pid: 11738] (Mac OS X 10.16 x86_64, AdoptOpenJDK 14.0.1 x86_64, OffHeapDiskFPSet, DiskStateQueue). @!@!@ENDMSG 2187 @!@!@ @!@!@STARTMSG 2220:0 @!@!@ Starting SANY... @!@!@ENDMSG 2220 @!@!@ -Parsing file /Users/cs/Desktop/broker/fullmesh/fullmesh.toolbox/Model_1/MC.tla -Parsing file /Users/cs/Desktop/broker/fullmesh/fullmesh.toolbox/Model_1/fullmesh.tla +Parsing file /Users/cs/src/neon/storage_broker/spec/replicated/replicated.toolbox/Model_1/MC.tla +Parsing file /Users/cs/src/neon/storage_broker/spec/replicated/replicated.toolbox/Model_1/replicated.tla Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/TLC.tla Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Integers.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/FiniteSets.tla Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Naturals.tla Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Sequences.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/FiniteSets.tla Semantic processing of module Naturals Semantic processing of module Integers -Semantic processing of module fullmesh Semantic processing of module Sequences Semantic processing of module FiniteSets +Semantic processing of module replicated Semantic processing of module TLC Semantic processing of module MC @!@!@STARTMSG 2219:0 @!@!@ SANY finished. @!@!@ENDMSG 2219 @!@!@ @!@!@STARTMSG 2185:0 @!@!@ -Starting... (2025-01-19 16:09:11) +Starting... (2025-01-19 18:33:43) @!@!@ENDMSG 2185 @!@!@ @!@!@STARTMSG 2146:1 @!@!@ -The invariant EventuallyLaggingSkIsNotPreferredSk is not a state predicate (one with no primes or temporal operators). +The invariant PsLagsSk is not a state predicate (one with no primes or temporal operators). @!@!@ENDMSG 2146 @!@!@ @!@!@STARTMSG 2186:0 @!@!@ -Finished in 994ms at (2025-01-19 16:09:11) +Finished in 1009ms at (2025-01-19 18:33:43) @!@!@ENDMSG 2186 @!@!@ diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308024914/MC.tla b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308024914/MC.tla new file mode 100644 index 0000000000..caea6ac31c --- /dev/null +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308024914/MC.tla @@ -0,0 +1,65 @@ +---- MODULE MC ---- +EXTENDS replicated, TLC + +\* MV CONSTANT declarations@modelParameterConstants +CONSTANTS +b1, b2, b3 +---- + +\* MV CONSTANT declarations@modelParameterConstants +CONSTANTS +s1, s2, s3 +---- + +\* MV CONSTANT declarations@modelParameterConstants +CONSTANTS +p1 +---- + +\* MV CONSTANT declarations@modelParameterConstants +CONSTANTS +az1, az2, az3 +---- + +\* MV CONSTANT definitions brokers +const_1737308022622113000 == +{b1, b2, b3} +---- + +\* MV CONSTANT definitions safekeepers +const_1737308022622114000 == +{s1, s2, s3} +---- + +\* MV CONSTANT definitions pageservers +const_1737308022622115000 == +{p1} +---- + +\* MV CONSTANT definitions azs +const_1737308022622116000 == +{az1, az2, az3} +---- + +\* SYMMETRY definition +symm_1737308022622117000 == +Permutations(const_1737308022622113000) \union Permutations(const_1737308022622114000) \union Permutations(const_1737308022622115000) \union Permutations(const_1737308022622116000) +---- + +\* CONSTANT definitions @modelParameterConstants:4max_commit_lsn +const_1737308022622118000 == +2 +---- + +\* CONSTANT definitions @modelParameterConstants:5az_mapping +const_1737308022622119000 == +[ az1 |-> {b1,s1,p1} , az2 |-> {b2,s2} , az3 |-> {b3,s3}] +---- + +\* CONSTRAINT definition @modelParameterContraint:0 +constr_1737308022622120000 == +StateConstraint +---- +============================================================================= +\* Modification History +\* Created Sun Jan 19 18:33:42 CET 2025 by cs diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299352762/MC_TE.out b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308024914/MC_TE.out similarity index 67% rename from storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299352762/MC_TE.out rename to storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308024914/MC_TE.out index 27a0150e6e..59da3df845 100644 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299352762/MC_TE.out +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308024914/MC_TE.out @@ -2,34 +2,34 @@ TLC2 Version 2.19 of 08 August 2024 (rev: 5a47802) @!@!@ENDMSG 2262 @!@!@ @!@!@STARTMSG 2187:0 @!@!@ -Running breadth-first search Model-Checking with fp 119 and seed -1908114041878732601 with 4 workers on 8 cores with 2428MB heap and 5460MB offheap memory [pid: 7665] (Mac OS X 10.16 x86_64, AdoptOpenJDK 14.0.1 x86_64, OffHeapDiskFPSet, DiskStateQueue). +Running breadth-first search Model-Checking with fp 95 and seed 5720921755138129000 with 4 workers on 8 cores with 2428MB heap and 5460MB offheap memory [pid: 11738] (Mac OS X 10.16 x86_64, AdoptOpenJDK 14.0.1 x86_64, OffHeapDiskFPSet, DiskStateQueue). @!@!@ENDMSG 2187 @!@!@ @!@!@STARTMSG 2220:0 @!@!@ Starting SANY... @!@!@ENDMSG 2220 @!@!@ -Parsing file /Users/cs/Desktop/broker/fullmesh/fullmesh.toolbox/Model_1/MC.tla -Parsing file /Users/cs/Desktop/broker/fullmesh/fullmesh.toolbox/Model_1/fullmesh.tla +Parsing file /Users/cs/src/neon/storage_broker/spec/replicated/replicated.toolbox/Model_1/MC.tla +Parsing file /Users/cs/src/neon/storage_broker/spec/replicated/replicated.toolbox/Model_1/replicated.tla Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/TLC.tla Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Integers.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/FiniteSets.tla Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Naturals.tla Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Sequences.tla -Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/FiniteSets.tla Semantic processing of module Naturals Semantic processing of module Integers -Semantic processing of module fullmesh Semantic processing of module Sequences Semantic processing of module FiniteSets +Semantic processing of module replicated Semantic processing of module TLC Semantic processing of module MC @!@!@STARTMSG 2219:0 @!@!@ SANY finished. @!@!@ENDMSG 2219 @!@!@ @!@!@STARTMSG 2185:0 @!@!@ -Starting... (2025-01-19 16:09:11) +Starting... (2025-01-19 18:33:43) @!@!@ENDMSG 2185 @!@!@ @!@!@STARTMSG 2146:1 @!@!@ -The invariant EventuallyLaggingSkIsNotPreferredSk is not a state predicate (one with no primes or temporal operators). +The invariant PsLagsSk is not a state predicate (one with no primes or temporal operators). @!@!@ENDMSG 2146 @!@!@ @!@!@STARTMSG 2186:0 @!@!@ -Finished in 994ms at (2025-01-19 16:09:11) +Finished in 1009ms at (2025-01-19 18:33:43) @!@!@ENDMSG 2186 @!@!@ diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308024914/replicated.tla b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308024914/replicated.tla new file mode 100644 index 0000000000..36db18ecc3 --- /dev/null +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308024914/replicated.tla @@ -0,0 +1,135 @@ +---- MODULE replicated ---- + +EXTENDS Integers, FiniteSets + +VARIABLES broker_state, safekeeper_state, pageserver_state, online + + +CONSTANT + brokers, + safekeepers, + pageservers, + azs, + az_mapping + +CONSTANT + NULL + +CONSTANT + max_commit_lsn + +StateConstraint == + /\ \A s \in safekeepers: + /\ safekeeper_state[s].commit_lsn <= max_commit_lsn + /\ \A b \in brokers: + /\ \A s \in DOMAIN broker_state[b].sk: + /\ broker_state[b].sk[s].commit_lsn <= max_commit_lsn + + +InitSafekeeper == [pruned_lsn |-> 0, commit_lsn |-> 0] +InitBroker == [sk |-> [s \in safekeepers |-> [commit_lsn |-> 0]]] +InitPageserver == [last_record_lsn |-> 0, preferred_sk |-> NULL, sk |-> [s \in safekeepers |-> [commit_lsn |-> 0]]] +InitOnline == safekeepers \cup brokers \cup pageservers + +Init == + /\ broker_state = [b \in brokers |-> InitBroker] + /\ safekeeper_state = [s \in safekeepers |-> InitSafekeeper] + /\ pageserver_state = [p \in pageservers |-> InitPageserver] + /\ online = InitOnline + +NodeOnlineOffline == + /\ online' = CHOOSE ss \in SUBSET InitOnline: + /\ Cardinality(ss \cap safekeepers) >= 2 + /\ Cardinality(ss \cap brokers) >= 2 + /\ ss \cap pageservers = pageservers \* assume no PS failures for now + /\ UNCHANGED <> + +SkCommit(s1, s2) == + /\ {s1, s2} \subseteq online + /\ s1 # s2 + /\ safekeeper_state[s1].commit_lsn = safekeeper_state[s2].commit_lsn + /\ LET + new_commit_lsn == safekeeper_state[s1].commit_lsn + 1 + IN + safekeeper_state' = [safekeeper_state EXCEPT + ![s1].commit_lsn = new_commit_lsn, + ![s2].commit_lsn = new_commit_lsn] + /\ UNCHANGED <> + +SkPeerRecovery(s1,s2) == + /\ {s1, s2} \subseteq online + /\ safekeeper_state[s1].commit_lsn < safekeeper_state[s2].commit_lsn + /\ safekeeper_state' = [safekeeper_state EXCEPT![s1].commit_lsn = safekeeper_state[s2].commit_lsn] + /\ UNCHANGED <> + +SkPushToBroker(s,b) == + /\ {s, b} \subseteq online + /\ broker_state' = IF broker_state[b].sk[s].commit_lsn < safekeeper_state[s].commit_lsn + THEN + LET + bsk == broker_state[b].sk + updbsk == [bsk EXCEPT ![s].commit_lsn = safekeeper_state[s].commit_lsn] + IN + [broker_state EXCEPT ![b].sk = updbsk] + ELSE broker_state + /\ UNCHANGED <> + +PsRecvBroker(b,p,s) == + /\ {b,p,s} \subseteq online + /\ LET + bsk == broker_state[b].sk[s] + psk == pageserver_state[p].sk[s] + updpsk == [psk EXCEPT !["commit_lsn"] = bsk.commit_lsn] + IN + pageserver_state' = IF bsk.commit_lsn > psk.commit_lsn + THEN [pageserver_state EXCEPT ![p].sk[s] = updpsk] + ELSE pageserver_state + /\ UNCHANGED <> + + +SksWithNewerWal(p) == + LET + ps == pageserver_state[p] + IN + {s \in DOMAIN ps.sk: ps.sk[s].commit_lsn > ps.last_record_lsn} + +PsChooseSk(p) == + /\ {p} \subseteq online + /\ SksWithNewerWal(p) # {} + /\ pageserver_state' = [pageserver_state EXCEPT![p].preferred_sk = CHOOSE s \in SksWithNewerWal(p): TRUE] + /\ UNCHANGED <> + + +Next == + \/ NodeOnlineOffline + \/ \E s1 \in safekeepers: \E s2 \in safekeepers: + \/ SkCommit(s1, s2) + \/ SkPeerRecovery(s1, s2) + \/ \E s \in safekeepers: \E b \in brokers: SkPushToBroker(s, b) + \/ \E s \in safekeepers: \E b \in brokers: \E p \in pageservers: PsRecvBroker(b,p,s) + \/ \E p \in pageservers: PsChooseSk(p) + + +Spec == Init /\ [][Next]_<< broker_state, safekeeper_state, pageserver_state,online>> + + +\* invariants + +PsLagsSk == []( + \A p \in pageservers: \A s \in DOMAIN pageserver_state[p].sk: + /\ pageserver_state[p].sk[s].commit_lsn < safekeeper_state[s].commit_lsn + ) + +EventuallyLaggingSkIsNotPreferredSk == <>( + LET + sks == safekeeper_state + lagging_sks == { s \in safekeepers: \A s2 \in safekeepers: sks[s].commit_lsn <= sks[s2].commit_lsn } + preferred_sks == {pageserver_state[p].preferred_sk: p \in pageservers} + IN + preferred_sks \cap lagging_sks = {} + + ) + + + +==== \ No newline at end of file diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299381423/MC.cfg b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308183077/MC.cfg similarity index 63% rename from storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299381423/MC.cfg rename to storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308183077/MC.cfg index b9bc8092a2..886ee705a5 100644 --- a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737299381423/MC.cfg +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308183077/MC.cfg @@ -11,7 +11,6 @@ s3 = s3 \* MV CONSTANT declarations CONSTANTS p1 = p1 -p2 = p2 \* MV CONSTANT declarations CONSTANTS az1 = az1 @@ -19,33 +18,36 @@ az2 = az2 az3 = az3 \* MV CONSTANT definitions CONSTANT -brokers <- const_1737299377376212000 +brokers <- const_1737308178999123000 \* CONSTANT declarations CONSTANT NULL = NULL \* MV CONSTANT definitions CONSTANT -safekeepers <- const_1737299377376213000 +safekeepers <- const_1737308178999124000 \* MV CONSTANT definitions CONSTANT -pageservers <- const_1737299377376214000 +pageservers <- const_1737308178999125000 \* MV CONSTANT definitions CONSTANT -azs <- const_1737299377376215000 +azs <- const_1737308178999126000 \* SYMMETRY definition -SYMMETRY symm_1737299377376216000 +SYMMETRY symm_1737308178999127000 \* CONSTANT definitions CONSTANT -max_commit_lsn <- const_1737299377376217000 +max_commit_lsn <- const_1737308178999128000 \* CONSTANT definitions CONSTANT -az_mapping <- const_1737299377376218000 +az_mapping <- const_1737308178999129000 \* CONSTRAINT definition CONSTRAINT -constr_1737299377376219000 +constr_1737308178999130000 \* SPECIFICATION definition SPECIFICATION Spec +\* INVARIANT definition +INVARIANT +PsLagsSk \* PROPERTY definition PROPERTY EventuallyLaggingSkIsNotPreferredSk -\* Generated on Sun Jan 19 16:09:37 CET 2025 \ No newline at end of file +\* Generated on Sun Jan 19 18:36:19 CET 2025 \ No newline at end of file diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308183077/MC.out b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308183077/MC.out new file mode 100644 index 0000000000..00a833e2f0 --- /dev/null +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308183077/MC.out @@ -0,0 +1,52 @@ +@!@!@STARTMSG 2262:0 @!@!@ +TLC2 Version 2.19 of 08 August 2024 (rev: 5a47802) +@!@!@ENDMSG 2262 @!@!@ +@!@!@STARTMSG 2187:0 @!@!@ +Running breadth-first search Model-Checking with fp 92 and seed -5681728403679829533 with 4 workers on 8 cores with 2428MB heap and 5460MB offheap memory [pid: 11930] (Mac OS X 10.16 x86_64, AdoptOpenJDK 14.0.1 x86_64, OffHeapDiskFPSet, DiskStateQueue). +@!@!@ENDMSG 2187 @!@!@ +@!@!@STARTMSG 2220:0 @!@!@ +Starting SANY... +@!@!@ENDMSG 2220 @!@!@ +Parsing file /Users/cs/src/neon/storage_broker/spec/replicated/replicated.toolbox/Model_1/MC.tla +Parsing file /Users/cs/src/neon/storage_broker/spec/replicated/replicated.toolbox/Model_1/replicated.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/TLC.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Integers.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/FiniteSets.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Naturals.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Sequences.tla +Semantic processing of module Naturals +Semantic processing of module Integers +Semantic processing of module Sequences +Semantic processing of module FiniteSets +Semantic processing of module replicated +Semantic processing of module TLC +Semantic processing of module MC +@!@!@STARTMSG 2219:0 @!@!@ +SANY finished. +@!@!@ENDMSG 2219 @!@!@ +@!@!@STARTMSG 2185:0 @!@!@ +Starting... (2025-01-19 18:36:20) +@!@!@ENDMSG 2185 @!@!@ +@!@!@STARTMSG 2279:3 @!@!@ +Declaring symmetry during liveness checking is dangerous. It might cause TLC to miss violations of the stated liveness properties. Please check liveness without symmetry defined. +@!@!@ENDMSG 2279 @!@!@ +@!@!@STARTMSG 2284:3 @!@!@ +Declaring state or action constraints during liveness checking is dangerous: Please read section 14.3.5 on page 247 of Specifying Systems (https://lamport.azurewebsites.net/tla/book.html) and optionally the discussion at https://discuss.tlapl.us/msg00994.html for more details. +@!@!@ENDMSG 2284 @!@!@ +@!@!@STARTMSG 2212:0 @!@!@ +Implied-temporal checking--satisfiability problem has 1 branches. +@!@!@ENDMSG 2212 @!@!@ +@!@!@STARTMSG 2189:0 @!@!@ +Computing initial states... +@!@!@ENDMSG 2189 @!@!@ +@!@!@STARTMSG 2107:1 @!@!@ +Invariant PsLagsSk is violated by the initial state: +/\ pageserver_state = (p1 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0]), last_record_lsn |-> 0, preferred_sk |-> NULL]) +/\ broker_state = (b1 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])] @@ b2 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])] @@ b3 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])]) +/\ online = {b1, b2, b3, s1, s2, s3, p1} +/\ safekeeper_state = (s1 :> [commit_lsn |-> 0, pruned_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0, pruned_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0, pruned_lsn |-> 0]) + +@!@!@ENDMSG 2107 @!@!@ +@!@!@STARTMSG 2186:0 @!@!@ +Finished in 2710ms at (2025-01-19 18:36:21) +@!@!@ENDMSG 2186 @!@!@ diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308183077/MC.tla b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308183077/MC.tla new file mode 100644 index 0000000000..675b27fd4b --- /dev/null +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308183077/MC.tla @@ -0,0 +1,65 @@ +---- MODULE MC ---- +EXTENDS replicated, TLC + +\* MV CONSTANT declarations@modelParameterConstants +CONSTANTS +b1, b2, b3 +---- + +\* MV CONSTANT declarations@modelParameterConstants +CONSTANTS +s1, s2, s3 +---- + +\* MV CONSTANT declarations@modelParameterConstants +CONSTANTS +p1 +---- + +\* MV CONSTANT declarations@modelParameterConstants +CONSTANTS +az1, az2, az3 +---- + +\* MV CONSTANT definitions brokers +const_1737308178999123000 == +{b1, b2, b3} +---- + +\* MV CONSTANT definitions safekeepers +const_1737308178999124000 == +{s1, s2, s3} +---- + +\* MV CONSTANT definitions pageservers +const_1737308178999125000 == +{p1} +---- + +\* MV CONSTANT definitions azs +const_1737308178999126000 == +{az1, az2, az3} +---- + +\* SYMMETRY definition +symm_1737308178999127000 == +Permutations(const_1737308178999123000) \union Permutations(const_1737308178999124000) \union Permutations(const_1737308178999125000) \union Permutations(const_1737308178999126000) +---- + +\* CONSTANT definitions @modelParameterConstants:4max_commit_lsn +const_1737308178999128000 == +2 +---- + +\* CONSTANT definitions @modelParameterConstants:5az_mapping +const_1737308178999129000 == +[ az1 |-> {b1,s1,p1} , az2 |-> {b2,s2} , az3 |-> {b3,s3}] +---- + +\* CONSTRAINT definition @modelParameterContraint:0 +constr_1737308178999130000 == +StateConstraint +---- +============================================================================= +\* Modification History +\* Created Sun Jan 19 18:36:19 CET 2025 by cs diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308183077/MC_TE.out b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308183077/MC_TE.out new file mode 100644 index 0000000000..00a833e2f0 --- /dev/null +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308183077/MC_TE.out @@ -0,0 +1,52 @@ +@!@!@STARTMSG 2262:0 @!@!@ +TLC2 Version 2.19 of 08 August 2024 (rev: 5a47802) +@!@!@ENDMSG 2262 @!@!@ +@!@!@STARTMSG 2187:0 @!@!@ +Running breadth-first search Model-Checking with fp 92 and seed -5681728403679829533 with 4 workers on 8 cores with 2428MB heap and 5460MB offheap memory [pid: 11930] (Mac OS X 10.16 x86_64, AdoptOpenJDK 14.0.1 x86_64, OffHeapDiskFPSet, DiskStateQueue). +@!@!@ENDMSG 2187 @!@!@ +@!@!@STARTMSG 2220:0 @!@!@ +Starting SANY... +@!@!@ENDMSG 2220 @!@!@ +Parsing file /Users/cs/src/neon/storage_broker/spec/replicated/replicated.toolbox/Model_1/MC.tla +Parsing file /Users/cs/src/neon/storage_broker/spec/replicated/replicated.toolbox/Model_1/replicated.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/TLC.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Integers.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/FiniteSets.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Naturals.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Sequences.tla +Semantic processing of module Naturals +Semantic processing of module Integers +Semantic processing of module Sequences +Semantic processing of module FiniteSets +Semantic processing of module replicated +Semantic processing of module TLC +Semantic processing of module MC +@!@!@STARTMSG 2219:0 @!@!@ +SANY finished. +@!@!@ENDMSG 2219 @!@!@ +@!@!@STARTMSG 2185:0 @!@!@ +Starting... (2025-01-19 18:36:20) +@!@!@ENDMSG 2185 @!@!@ +@!@!@STARTMSG 2279:3 @!@!@ +Declaring symmetry during liveness checking is dangerous. It might cause TLC to miss violations of the stated liveness properties. Please check liveness without symmetry defined. +@!@!@ENDMSG 2279 @!@!@ +@!@!@STARTMSG 2284:3 @!@!@ +Declaring state or action constraints during liveness checking is dangerous: Please read section 14.3.5 on page 247 of Specifying Systems (https://lamport.azurewebsites.net/tla/book.html) and optionally the discussion at https://discuss.tlapl.us/msg00994.html for more details. +@!@!@ENDMSG 2284 @!@!@ +@!@!@STARTMSG 2212:0 @!@!@ +Implied-temporal checking--satisfiability problem has 1 branches. +@!@!@ENDMSG 2212 @!@!@ +@!@!@STARTMSG 2189:0 @!@!@ +Computing initial states... +@!@!@ENDMSG 2189 @!@!@ +@!@!@STARTMSG 2107:1 @!@!@ +Invariant PsLagsSk is violated by the initial state: +/\ pageserver_state = (p1 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0]), last_record_lsn |-> 0, preferred_sk |-> NULL]) +/\ broker_state = (b1 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])] @@ b2 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])] @@ b3 :> [sk |-> (s1 :> [commit_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0])]) +/\ online = {b1, b2, b3, s1, s2, s3, p1} +/\ safekeeper_state = (s1 :> [commit_lsn |-> 0, pruned_lsn |-> 0] @@ s2 :> [commit_lsn |-> 0, pruned_lsn |-> 0] @@ s3 :> [commit_lsn |-> 0, pruned_lsn |-> 0]) + +@!@!@ENDMSG 2107 @!@!@ +@!@!@STARTMSG 2186:0 @!@!@ +Finished in 2710ms at (2025-01-19 18:36:21) +@!@!@ENDMSG 2186 @!@!@ diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308183077/replicated.tla b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308183077/replicated.tla new file mode 100644 index 0000000000..6ec5ff3f0f --- /dev/null +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308183077/replicated.tla @@ -0,0 +1,134 @@ +---- MODULE replicated ---- + +EXTENDS Integers, FiniteSets + +VARIABLES broker_state, safekeeper_state, pageserver_state, online + + +CONSTANT + brokers, + safekeepers, + pageservers, + azs, + az_mapping + +CONSTANT + NULL + +CONSTANT + max_commit_lsn + +StateConstraint == + /\ \A s \in safekeepers: + /\ safekeeper_state[s].commit_lsn <= max_commit_lsn + /\ \A b \in brokers: + /\ \A s \in DOMAIN broker_state[b].sk: + /\ broker_state[b].sk[s].commit_lsn <= max_commit_lsn + + +InitSafekeeper == [pruned_lsn |-> 0, commit_lsn |-> 0] +InitBroker == [sk |-> [s \in safekeepers |-> [commit_lsn |-> 0]]] +InitPageserver == [last_record_lsn |-> 0, preferred_sk |-> NULL, sk |-> [s \in safekeepers |-> [commit_lsn |-> 0]]] +InitOnline == safekeepers \cup brokers \cup pageservers + +Init == + /\ broker_state = [b \in brokers |-> InitBroker] + /\ safekeeper_state = [s \in safekeepers |-> InitSafekeeper] + /\ pageserver_state = [p \in pageservers |-> InitPageserver] + /\ online = InitOnline + +NodeOnlineOffline == + /\ online' = CHOOSE ss \in SUBSET InitOnline: + /\ Cardinality(ss \cap safekeepers) >= 2 + /\ Cardinality(ss \cap brokers) >= 2 + /\ ss \cap pageservers = pageservers \* assume no PS failures for now + /\ UNCHANGED <> + +SkCommit(s1, s2) == + /\ {s1, s2} \subseteq online + /\ s1 # s2 + /\ safekeeper_state[s1].commit_lsn = safekeeper_state[s2].commit_lsn + /\ LET + new_commit_lsn == safekeeper_state[s1].commit_lsn + 1 + IN + safekeeper_state' = [safekeeper_state EXCEPT + ![s1].commit_lsn = new_commit_lsn, + ![s2].commit_lsn = new_commit_lsn] + /\ UNCHANGED <> + +SkPeerRecovery(s1,s2) == + /\ {s1, s2} \subseteq online + /\ safekeeper_state[s1].commit_lsn < safekeeper_state[s2].commit_lsn + /\ safekeeper_state' = [safekeeper_state EXCEPT![s1].commit_lsn = safekeeper_state[s2].commit_lsn] + /\ UNCHANGED <> + +SkPushToBroker(s,b) == + /\ {s, b} \subseteq online + /\ broker_state' = IF broker_state[b].sk[s].commit_lsn < safekeeper_state[s].commit_lsn + THEN + LET + bsk == broker_state[b].sk + updbsk == [bsk EXCEPT ![s].commit_lsn = safekeeper_state[s].commit_lsn] + IN + [broker_state EXCEPT ![b].sk = updbsk] + ELSE broker_state + /\ UNCHANGED <> + +PsRecvBroker(b,p,s) == + /\ {b,p,s} \subseteq online + /\ LET + bsk == broker_state[b].sk[s] + psk == pageserver_state[p].sk[s] + updpsk == [psk EXCEPT !["commit_lsn"] = bsk.commit_lsn] + IN + pageserver_state' = IF bsk.commit_lsn > psk.commit_lsn + THEN [pageserver_state EXCEPT ![p].sk[s] = updpsk] + ELSE pageserver_state + /\ UNCHANGED <> + + +SksWithNewerWal(p) == + LET + ps == pageserver_state[p] + IN + {s \in DOMAIN ps.sk: ps.sk[s].commit_lsn > ps.last_record_lsn} + +PsChooseSk(p) == + /\ {p} \subseteq online + /\ SksWithNewerWal(p) # {} + /\ pageserver_state' = [pageserver_state EXCEPT![p].preferred_sk = CHOOSE s \in SksWithNewerWal(p): TRUE] + /\ UNCHANGED <> + + +Next == + \/ NodeOnlineOffline + \/ \E s1 \in safekeepers: \E s2 \in safekeepers: + \/ SkCommit(s1, s2) + \/ SkPeerRecovery(s1, s2) + \/ \E s \in safekeepers: \E b \in brokers: SkPushToBroker(s, b) + \/ \E s \in safekeepers: \E b \in brokers: \E p \in pageservers: PsRecvBroker(b,p,s) + \/ \E p \in pageservers: PsChooseSk(p) + + +Spec == Init /\ [][Next]_<< broker_state, safekeeper_state, pageserver_state,online>> + + +\* invariants + +PsLagsSk == \A p \in pageservers: \A s \in DOMAIN pageserver_state[p].sk: + /\ pageserver_state[p].sk[s].commit_lsn < safekeeper_state[s].commit_lsn + + +EventuallyLaggingSkIsNotPreferredSk == <>( + LET + sks == safekeeper_state + lagging_sks == { s \in safekeepers: \A s2 \in safekeepers: sks[s].commit_lsn <= sks[s2].commit_lsn } + preferred_sks == {pageserver_state[p].preferred_sk: p \in pageservers} + IN + preferred_sks \cap lagging_sks = {} + + ) + + + +==== \ No newline at end of file diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308216766/MC.cfg b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308216766/MC.cfg new file mode 100644 index 0000000000..a3527c1e04 --- /dev/null +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308216766/MC.cfg @@ -0,0 +1,53 @@ +\* MV CONSTANT declarations +CONSTANTS +b1 = b1 +b2 = b2 +b3 = b3 +\* MV CONSTANT declarations +CONSTANTS +s1 = s1 +s2 = s2 +s3 = s3 +\* MV CONSTANT declarations +CONSTANTS +p1 = p1 +\* MV CONSTANT declarations +CONSTANTS +az1 = az1 +az2 = az2 +az3 = az3 +\* MV CONSTANT definitions +CONSTANT +brokers <- const_1737308198937133000 +\* CONSTANT declarations +CONSTANT NULL = NULL +\* MV CONSTANT definitions +CONSTANT +safekeepers <- const_1737308198937134000 +\* MV CONSTANT definitions +CONSTANT +pageservers <- const_1737308198937135000 +\* MV CONSTANT definitions +CONSTANT +azs <- const_1737308198937136000 +\* SYMMETRY definition +SYMMETRY symm_1737308198937137000 +\* CONSTANT definitions +CONSTANT +max_commit_lsn <- const_1737308198937138000 +\* CONSTANT definitions +CONSTANT +az_mapping <- const_1737308198937139000 +\* CONSTRAINT definition +CONSTRAINT +constr_1737308198937140000 +\* SPECIFICATION definition +SPECIFICATION +Spec +\* INVARIANT definition +INVARIANT +PsLagsSk +\* PROPERTY definition +PROPERTY +EventuallyLaggingSkIsNotPreferredSk +\* Generated on Sun Jan 19 18:36:38 CET 2025 \ No newline at end of file diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308216766/MC.out b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308216766/MC.out new file mode 100644 index 0000000000..366883d749 --- /dev/null +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308216766/MC.out @@ -0,0 +1,53 @@ +@!@!@STARTMSG 2262:0 @!@!@ +TLC2 Version 2.19 of 08 August 2024 (rev: 5a47802) +@!@!@ENDMSG 2262 @!@!@ +@!@!@STARTMSG 2187:0 @!@!@ +Running breadth-first search Model-Checking with fp 39 and seed -9180611051874563891 with 4 workers on 8 cores with 2428MB heap and 5460MB offheap memory [pid: 11941] (Mac OS X 10.16 x86_64, AdoptOpenJDK 14.0.1 x86_64, OffHeapDiskFPSet, DiskStateQueue). +@!@!@ENDMSG 2187 @!@!@ +@!@!@STARTMSG 2220:0 @!@!@ +Starting SANY... +@!@!@ENDMSG 2220 @!@!@ +Parsing file /Users/cs/src/neon/storage_broker/spec/replicated/replicated.toolbox/Model_1/MC.tla +Parsing file /Users/cs/src/neon/storage_broker/spec/replicated/replicated.toolbox/Model_1/replicated.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/TLC.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Integers.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/FiniteSets.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Naturals.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Sequences.tla +Semantic processing of module Naturals +Semantic processing of module Integers +Semantic processing of module Sequences +Semantic processing of module FiniteSets +Semantic processing of module replicated +Semantic processing of module TLC +Semantic processing of module MC +@!@!@STARTMSG 2219:0 @!@!@ +SANY finished. +@!@!@ENDMSG 2219 @!@!@ +@!@!@STARTMSG 2185:0 @!@!@ +Starting... (2025-01-19 18:36:40) +@!@!@ENDMSG 2185 @!@!@ +@!@!@STARTMSG 2279:3 @!@!@ +Declaring symmetry during liveness checking is dangerous. It might cause TLC to miss violations of the stated liveness properties. Please check liveness without symmetry defined. +@!@!@ENDMSG 2279 @!@!@ +@!@!@STARTMSG 2284:3 @!@!@ +Declaring state or action constraints during liveness checking is dangerous: Please read section 14.3.5 on page 247 of Specifying Systems (https://lamport.azurewebsites.net/tla/book.html) and optionally the discussion at https://discuss.tlapl.us/msg00994.html for more details. +@!@!@ENDMSG 2284 @!@!@ +@!@!@STARTMSG 2212:0 @!@!@ +Implied-temporal checking--satisfiability problem has 1 branches. +@!@!@ENDMSG 2212 @!@!@ +@!@!@STARTMSG 2189:0 @!@!@ +Computing initial states... +@!@!@ENDMSG 2189 @!@!@ +@!@!@STARTMSG 2190:0 @!@!@ +Finished computing initial states: 1 distinct state generated at 2025-01-19 18:36:41. +@!@!@ENDMSG 2190 @!@!@ +@!@!@STARTMSG 2192:0 @!@!@ +Checking temporal properties for the current state space with 3587 total distinct states at (2025-01-19 18:36:44) +@!@!@ENDMSG 2192 @!@!@ +@!@!@STARTMSG 2267:0 @!@!@ +Finished checking temporal properties in 00s at 2025-01-19 18:36:44 +@!@!@ENDMSG 2267 @!@!@ +@!@!@STARTMSG 2200:0 @!@!@ +Progress(11) at 2025-01-19 18:36:44: 73.018 states generated (73.018 s/min), 8.206 distinct states found (8.206 ds/min), 4.615 states left on queue. +@!@!@ENDMSG 2200 @!@!@ diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308216766/MC.tla b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308216766/MC.tla new file mode 100644 index 0000000000..060f5935bc --- /dev/null +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308216766/MC.tla @@ -0,0 +1,65 @@ +---- MODULE MC ---- +EXTENDS replicated, TLC + +\* MV CONSTANT declarations@modelParameterConstants +CONSTANTS +b1, b2, b3 +---- + +\* MV CONSTANT declarations@modelParameterConstants +CONSTANTS +s1, s2, s3 +---- + +\* MV CONSTANT declarations@modelParameterConstants +CONSTANTS +p1 +---- + +\* MV CONSTANT declarations@modelParameterConstants +CONSTANTS +az1, az2, az3 +---- + +\* MV CONSTANT definitions brokers +const_1737308198937133000 == +{b1, b2, b3} +---- + +\* MV CONSTANT definitions safekeepers +const_1737308198937134000 == +{s1, s2, s3} +---- + +\* MV CONSTANT definitions pageservers +const_1737308198937135000 == +{p1} +---- + +\* MV CONSTANT definitions azs +const_1737308198937136000 == +{az1, az2, az3} +---- + +\* SYMMETRY definition +symm_1737308198937137000 == +Permutations(const_1737308198937133000) \union Permutations(const_1737308198937134000) \union Permutations(const_1737308198937135000) \union Permutations(const_1737308198937136000) +---- + +\* CONSTANT definitions @modelParameterConstants:4max_commit_lsn +const_1737308198937138000 == +2 +---- + +\* CONSTANT definitions @modelParameterConstants:5az_mapping +const_1737308198937139000 == +[ az1 |-> {b1,s1,p1} , az2 |-> {b2,s2} , az3 |-> {b3,s3}] +---- + +\* CONSTRAINT definition @modelParameterContraint:0 +constr_1737308198937140000 == +StateConstraint +---- +============================================================================= +\* Modification History +\* Created Sun Jan 19 18:36:38 CET 2025 by cs diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308216766/MC_TE.out b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308216766/MC_TE.out new file mode 100644 index 0000000000..366883d749 --- /dev/null +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308216766/MC_TE.out @@ -0,0 +1,53 @@ +@!@!@STARTMSG 2262:0 @!@!@ +TLC2 Version 2.19 of 08 August 2024 (rev: 5a47802) +@!@!@ENDMSG 2262 @!@!@ +@!@!@STARTMSG 2187:0 @!@!@ +Running breadth-first search Model-Checking with fp 39 and seed -9180611051874563891 with 4 workers on 8 cores with 2428MB heap and 5460MB offheap memory [pid: 11941] (Mac OS X 10.16 x86_64, AdoptOpenJDK 14.0.1 x86_64, OffHeapDiskFPSet, DiskStateQueue). +@!@!@ENDMSG 2187 @!@!@ +@!@!@STARTMSG 2220:0 @!@!@ +Starting SANY... +@!@!@ENDMSG 2220 @!@!@ +Parsing file /Users/cs/src/neon/storage_broker/spec/replicated/replicated.toolbox/Model_1/MC.tla +Parsing file /Users/cs/src/neon/storage_broker/spec/replicated/replicated.toolbox/Model_1/replicated.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/TLC.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Integers.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/FiniteSets.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Naturals.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Sequences.tla +Semantic processing of module Naturals +Semantic processing of module Integers +Semantic processing of module Sequences +Semantic processing of module FiniteSets +Semantic processing of module replicated +Semantic processing of module TLC +Semantic processing of module MC +@!@!@STARTMSG 2219:0 @!@!@ +SANY finished. +@!@!@ENDMSG 2219 @!@!@ +@!@!@STARTMSG 2185:0 @!@!@ +Starting... (2025-01-19 18:36:40) +@!@!@ENDMSG 2185 @!@!@ +@!@!@STARTMSG 2279:3 @!@!@ +Declaring symmetry during liveness checking is dangerous. It might cause TLC to miss violations of the stated liveness properties. Please check liveness without symmetry defined. +@!@!@ENDMSG 2279 @!@!@ +@!@!@STARTMSG 2284:3 @!@!@ +Declaring state or action constraints during liveness checking is dangerous: Please read section 14.3.5 on page 247 of Specifying Systems (https://lamport.azurewebsites.net/tla/book.html) and optionally the discussion at https://discuss.tlapl.us/msg00994.html for more details. +@!@!@ENDMSG 2284 @!@!@ +@!@!@STARTMSG 2212:0 @!@!@ +Implied-temporal checking--satisfiability problem has 1 branches. +@!@!@ENDMSG 2212 @!@!@ +@!@!@STARTMSG 2189:0 @!@!@ +Computing initial states... +@!@!@ENDMSG 2189 @!@!@ +@!@!@STARTMSG 2190:0 @!@!@ +Finished computing initial states: 1 distinct state generated at 2025-01-19 18:36:41. +@!@!@ENDMSG 2190 @!@!@ +@!@!@STARTMSG 2192:0 @!@!@ +Checking temporal properties for the current state space with 3587 total distinct states at (2025-01-19 18:36:44) +@!@!@ENDMSG 2192 @!@!@ +@!@!@STARTMSG 2267:0 @!@!@ +Finished checking temporal properties in 00s at 2025-01-19 18:36:44 +@!@!@ENDMSG 2267 @!@!@ +@!@!@STARTMSG 2200:0 @!@!@ +Progress(11) at 2025-01-19 18:36:44: 73.018 states generated (73.018 s/min), 8.206 distinct states found (8.206 ds/min), 4.615 states left on queue. +@!@!@ENDMSG 2200 @!@!@ diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308216766/replicated.tla b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308216766/replicated.tla new file mode 100644 index 0000000000..33971e3071 --- /dev/null +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308216766/replicated.tla @@ -0,0 +1,134 @@ +---- MODULE replicated ---- + +EXTENDS Integers, FiniteSets + +VARIABLES broker_state, safekeeper_state, pageserver_state, online + + +CONSTANT + brokers, + safekeepers, + pageservers, + azs, + az_mapping + +CONSTANT + NULL + +CONSTANT + max_commit_lsn + +StateConstraint == + /\ \A s \in safekeepers: + /\ safekeeper_state[s].commit_lsn <= max_commit_lsn + /\ \A b \in brokers: + /\ \A s \in DOMAIN broker_state[b].sk: + /\ broker_state[b].sk[s].commit_lsn <= max_commit_lsn + + +InitSafekeeper == [pruned_lsn |-> 0, commit_lsn |-> 0] +InitBroker == [sk |-> [s \in safekeepers |-> [commit_lsn |-> 0]]] +InitPageserver == [last_record_lsn |-> 0, preferred_sk |-> NULL, sk |-> [s \in safekeepers |-> [commit_lsn |-> 0]]] +InitOnline == safekeepers \cup brokers \cup pageservers + +Init == + /\ broker_state = [b \in brokers |-> InitBroker] + /\ safekeeper_state = [s \in safekeepers |-> InitSafekeeper] + /\ pageserver_state = [p \in pageservers |-> InitPageserver] + /\ online = InitOnline + +NodeOnlineOffline == + /\ online' = CHOOSE ss \in SUBSET InitOnline: + /\ Cardinality(ss \cap safekeepers) >= 2 + /\ Cardinality(ss \cap brokers) >= 2 + /\ ss \cap pageservers = pageservers \* assume no PS failures for now + /\ UNCHANGED <> + +SkCommit(s1, s2) == + /\ {s1, s2} \subseteq online + /\ s1 # s2 + /\ safekeeper_state[s1].commit_lsn = safekeeper_state[s2].commit_lsn + /\ LET + new_commit_lsn == safekeeper_state[s1].commit_lsn + 1 + IN + safekeeper_state' = [safekeeper_state EXCEPT + ![s1].commit_lsn = new_commit_lsn, + ![s2].commit_lsn = new_commit_lsn] + /\ UNCHANGED <> + +SkPeerRecovery(s1,s2) == + /\ {s1, s2} \subseteq online + /\ safekeeper_state[s1].commit_lsn < safekeeper_state[s2].commit_lsn + /\ safekeeper_state' = [safekeeper_state EXCEPT![s1].commit_lsn = safekeeper_state[s2].commit_lsn] + /\ UNCHANGED <> + +SkPushToBroker(s,b) == + /\ {s, b} \subseteq online + /\ broker_state' = IF broker_state[b].sk[s].commit_lsn < safekeeper_state[s].commit_lsn + THEN + LET + bsk == broker_state[b].sk + updbsk == [bsk EXCEPT ![s].commit_lsn = safekeeper_state[s].commit_lsn] + IN + [broker_state EXCEPT ![b].sk = updbsk] + ELSE broker_state + /\ UNCHANGED <> + +PsRecvBroker(b,p,s) == + /\ {b,p,s} \subseteq online + /\ LET + bsk == broker_state[b].sk[s] + psk == pageserver_state[p].sk[s] + updpsk == [psk EXCEPT !["commit_lsn"] = bsk.commit_lsn] + IN + pageserver_state' = IF bsk.commit_lsn > psk.commit_lsn + THEN [pageserver_state EXCEPT ![p].sk[s] = updpsk] + ELSE pageserver_state + /\ UNCHANGED <> + + +SksWithNewerWal(p) == + LET + ps == pageserver_state[p] + IN + {s \in DOMAIN ps.sk: ps.sk[s].commit_lsn > ps.last_record_lsn} + +PsChooseSk(p) == + /\ {p} \subseteq online + /\ SksWithNewerWal(p) # {} + /\ pageserver_state' = [pageserver_state EXCEPT![p].preferred_sk = CHOOSE s \in SksWithNewerWal(p): TRUE] + /\ UNCHANGED <> + + +Next == + \/ NodeOnlineOffline + \/ \E s1 \in safekeepers: \E s2 \in safekeepers: + \/ SkCommit(s1, s2) + \/ SkPeerRecovery(s1, s2) + \/ \E s \in safekeepers: \E b \in brokers: SkPushToBroker(s, b) + \/ \E s \in safekeepers: \E b \in brokers: \E p \in pageservers: PsRecvBroker(b,p,s) + \/ \E p \in pageservers: PsChooseSk(p) + + +Spec == Init /\ [][Next]_<< broker_state, safekeeper_state, pageserver_state,online>> + + +\* invariants + +PsLagsSk == \A p \in pageservers: \A s \in DOMAIN pageserver_state[p].sk: + /\ pageserver_state[p].sk[s].commit_lsn <= safekeeper_state[s].commit_lsn + + +EventuallyLaggingSkIsNotPreferredSk == <>( + LET + sks == safekeeper_state + lagging_sks == { s \in safekeepers: \A s2 \in safekeepers: sks[s].commit_lsn <= sks[s2].commit_lsn } + preferred_sks == {pageserver_state[p].preferred_sk: p \in pageservers} + IN + preferred_sks \cap lagging_sks = {} + + ) + + + +==== \ No newline at end of file diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308355472/MC.cfg b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308355472/MC.cfg new file mode 100644 index 0000000000..8159238beb --- /dev/null +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308355472/MC.cfg @@ -0,0 +1,53 @@ +\* MV CONSTANT declarations +CONSTANTS +b1 = b1 +b2 = b2 +b3 = b3 +\* MV CONSTANT declarations +CONSTANTS +s1 = s1 +s2 = s2 +s3 = s3 +\* MV CONSTANT declarations +CONSTANTS +p1 = p1 +\* MV CONSTANT declarations +CONSTANTS +az1 = az1 +az2 = az2 +az3 = az3 +\* MV CONSTANT definitions +CONSTANT +brokers <- const_1737308284086143000 +\* CONSTANT declarations +CONSTANT NULL = NULL +\* MV CONSTANT definitions +CONSTANT +safekeepers <- const_1737308284086144000 +\* MV CONSTANT definitions +CONSTANT +pageservers <- const_1737308284086145000 +\* MV CONSTANT definitions +CONSTANT +azs <- const_1737308284086146000 +\* SYMMETRY definition +SYMMETRY symm_1737308284086147000 +\* CONSTANT definitions +CONSTANT +max_commit_lsn <- const_1737308284086148000 +\* CONSTANT definitions +CONSTANT +az_mapping <- const_1737308284086149000 +\* CONSTRAINT definition +CONSTRAINT +constr_1737308284086150000 +\* SPECIFICATION definition +SPECIFICATION +Spec +\* INVARIANT definition +INVARIANT +PsLagsSk +\* PROPERTY definition +PROPERTY +EventuallyLaggingSkIsNotPreferredSk +\* Generated on Sun Jan 19 18:38:04 CET 2025 \ No newline at end of file diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308355472/MC.out b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308355472/MC.out new file mode 100644 index 0000000000..72ebe05b45 --- /dev/null +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308355472/MC.out @@ -0,0 +1,354 @@ +@!@!@STARTMSG 2262:0 @!@!@ +TLC2 Version 2.19 of 08 August 2024 (rev: 5a47802) +@!@!@ENDMSG 2262 @!@!@ +@!@!@STARTMSG 2187:0 @!@!@ +Running breadth-first search Model-Checking with fp 96 and seed 147884281130356166 with 4 workers on 8 cores with 2428MB heap and 5460MB offheap memory [pid: 12007] (Mac OS X 10.16 x86_64, AdoptOpenJDK 14.0.1 x86_64, OffHeapDiskFPSet, DiskStateQueue). +@!@!@ENDMSG 2187 @!@!@ +@!@!@STARTMSG 2220:0 @!@!@ +Starting SANY... +@!@!@ENDMSG 2220 @!@!@ +Parsing file /Users/cs/src/neon/storage_broker/spec/replicated/replicated.toolbox/Model_1/MC.tla +Parsing file /Users/cs/src/neon/storage_broker/spec/replicated/replicated.toolbox/Model_1/replicated.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/TLC.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Integers.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/FiniteSets.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Naturals.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Sequences.tla +Semantic processing of module Naturals +Semantic processing of module Integers +Semantic processing of module Sequences +Semantic processing of module FiniteSets +Semantic processing of module replicated +Semantic processing of module TLC +Semantic processing of module MC +@!@!@STARTMSG 2219:0 @!@!@ +SANY finished. +@!@!@ENDMSG 2219 @!@!@ +@!@!@STARTMSG 2185:0 @!@!@ +Starting... (2025-01-19 18:38:05) +@!@!@ENDMSG 2185 @!@!@ +@!@!@STARTMSG 2279:3 @!@!@ +Declaring symmetry during liveness checking is dangerous. It might cause TLC to miss violations of the stated liveness properties. Please check liveness without symmetry defined. +@!@!@ENDMSG 2279 @!@!@ +@!@!@STARTMSG 2284:3 @!@!@ +Declaring state or action constraints during liveness checking is dangerous: Please read section 14.3.5 on page 247 of Specifying Systems (https://lamport.azurewebsites.net/tla/book.html) and optionally the discussion at https://discuss.tlapl.us/msg00994.html for more details. +@!@!@ENDMSG 2284 @!@!@ +@!@!@STARTMSG 2212:0 @!@!@ +Implied-temporal checking--satisfiability problem has 1 branches. +@!@!@ENDMSG 2212 @!@!@ +@!@!@STARTMSG 2189:0 @!@!@ +Computing initial states... +@!@!@ENDMSG 2189 @!@!@ +@!@!@STARTMSG 2190:0 @!@!@ +Finished computing initial states: 1 distinct state generated at 2025-01-19 18:38:06. +@!@!@ENDMSG 2190 @!@!@ +@!@!@STARTMSG 2192:0 @!@!@ +Checking temporal properties for the current state space with 3861 total distinct states at (2025-01-19 18:38:09) +@!@!@ENDMSG 2192 @!@!@ +@!@!@STARTMSG 2267:0 @!@!@ +Finished checking temporal properties in 00s at 2025-01-19 18:38:09 +@!@!@ENDMSG 2267 @!@!@ +@!@!@STARTMSG 2200:0 @!@!@ +Progress(11) at 2025-01-19 18:38:09: 77.856 states generated (77.856 s/min), 8.653 distinct states found (8.653 ds/min), 4.790 states left on queue. +@!@!@ENDMSG 2200 @!@!@ +@!@!@STARTMSG 2192:0 @!@!@ +Checking temporal properties for the current state space with 197257 total distinct states at (2025-01-19 18:39:09) +@!@!@ENDMSG 2192 @!@!@ +@!@!@STARTMSG 2267:0 @!@!@ +Finished checking temporal properties in 00s at 2025-01-19 18:39:09 +@!@!@ENDMSG 2267 @!@!@ +@!@!@STARTMSG 2200:0 @!@!@ +Progress(20) at 2025-01-19 18:39:09: 3.084.377 states generated (3.006.521 s/min), 204.964 distinct states found (196.311 ds/min), 7.704 states left on queue. +@!@!@ENDMSG 2200 @!@!@ +@!@!@STARTMSG 2200:0 @!@!@ +Progress(25) at 2025-01-19 18:39:12: 3.224.329 states generated, 208.868 distinct states found, 0 states left on queue. +@!@!@ENDMSG 2200 @!@!@ +@!@!@STARTMSG 2192:0 @!@!@ +Checking temporal properties for the complete state space with 208868 total distinct states at (2025-01-19 18:39:12) +@!@!@ENDMSG 2192 @!@!@ +@!@!@STARTMSG 2267:0 @!@!@ +Finished checking temporal properties in 00s at 2025-01-19 18:39:12 +@!@!@ENDMSG 2267 @!@!@ +@!@!@STARTMSG 2193:0 @!@!@ +Model checking completed. No error has been found. + Estimates of the probability that TLC did not check all reachable states + because two distinct states had the same fingerprint: + calculated (optimistic): val = 3.4E-8 + based on the actual fingerprints: val = 6.3E-10 +@!@!@ENDMSG 2193 @!@!@ +@!@!@STARTMSG 2201:0 @!@!@ +The coverage statistics at 2025-01-19 18:39:14 +@!@!@ENDMSG 2201 @!@!@ +@!@!@STARTMSG 2773:0 @!@!@ +: 1:1 +@!@!@ENDMSG 2773 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 35, col 5 to line 38, col 26 of module replicated: 1 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 14290:208868 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 41, col 8 to line 44, col 44 of module replicated: 208868 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 41, col 18 to line 44, col 44 of module replicated: 208868 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 42, col 9 to line 44, col 44 of module replicated: 22348876 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||line 42, col 12 to line 42, col 48 of module replicated: 22348876 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||line 43, col 12 to line 43, col 44 of module replicated: 8981324 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||line 44, col 12 to line 44, col 44 of module replicated: 2924152 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 41, col 32 to line 41, col 48 of module replicated: 208868 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 45, col 8 to line 45, col 67 of module replicated: 208868 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 84:530666 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 48, col 8 to line 48, col 32 of module replicated: 2410478 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2775:0 @!@!@ + |line 48, col 8 to line 48, col 15 of module replicated: 1879812:4246157 +@!@!@ENDMSG 2775 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 48, col 27 to line 48, col 32 of module replicated: 1879812 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 49, col 8 to line 49, col 14 of module replicated: 1643803 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 49, col 8 to line 49, col 9 of module replicated: 1113137 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 49, col 13 to line 49, col 14 of module replicated: 1113137 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 50, col 8 to line 50, col 72 of module replicated: 1170534 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 50, col 8 to line 50, col 38 of module replicated: 639868 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 50, col 42 to line 50, col 72 of module replicated: 639868 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 54, col 13 to line 56, col 50 of module replicated: 530666 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 57, col 8 to line 57, col 58 of module replicated: 530666 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 682:54601 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 60, col 8 to line 60, col 32 of module replicated: 1934413 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2775:0 @!@!@ + |line 60, col 8 to line 60, col 15 of module replicated: 1879812:4246157 +@!@!@ENDMSG 2775 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 60, col 27 to line 60, col 32 of module replicated: 1879812 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 61, col 8 to line 61, col 72 of module replicated: 54601 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 61, col 8 to line 61, col 38 of module replicated: 1113137 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 61, col 42 to line 61, col 72 of module replicated: 1113137 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 62, col 8 to line 62, col 102 of module replicated: 54601 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 63, col 8 to line 63, col 58 of module replicated: 54601 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 45241:1113137 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 66, col 8 to line 66, col 30 of module replicated: 2992949 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2775:0 @!@!@ + |line 66, col 8 to line 66, col 13 of module replicated: 1879812:4412756 +@!@!@ENDMSG 2775 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 66, col 25 to line 66, col 30 of module replicated: 1879812 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 67, col 8 to line 74, col 29 of module replicated: 1113137 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 67, col 24 to line 74, col 29 of module replicated: 1113137 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 67, col 27 to line 67, col 91 of module replicated: 1113137 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 70, col 28 to line 70, col 45 of module replicated: 611653 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 71, col 31 to line 71, col 91 of module replicated: 611653 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 73, col 17 to line 73, col 54 of module replicated: 611653 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 74, col 18 to line 74, col 29 of module replicated: 501484 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 75, col 8 to line 75, col 62 of module replicated: 1113137 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 90643:1113137 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 78, col 8 to line 78, col 31 of module replicated: 2992949 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2775:0 @!@!@ + |line 78, col 8 to line 78, col 14 of module replicated: 1879812:5525893 +@!@!@ENDMSG 2775 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 78, col 26 to line 78, col 31 of module replicated: 1879812 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 84, col 13 to line 86, col 37 of module replicated: 1113137 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 84, col 33 to line 86, col 37 of module replicated: 1113137 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 84, col 36 to line 84, col 66 of module replicated: 1113137 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 85, col 22 to line 85, col 66 of module replicated: 406880 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 86, col 22 to line 86, col 37 of module replicated: 706257 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 87, col 8 to line 87, col 58 of module replicated: 1113137 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 57927:203919 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 97, col 8 to line 97, col 27 of module replicated: 412787 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2775:0 @!@!@ + |line 97, col 8 to line 97, col 10 of module replicated: 208868:417736 +@!@!@ENDMSG 2775 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 97, col 22 to line 97, col 27 of module replicated: 208868 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 98, col 8 to line 98, col 30 of module replicated: 412787 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 98, col 8 to line 98, col 25 of module replicated: 208868 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 92, col 15 to line 92, col 33 of module replicated: 208868 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 94, col 5 to line 94, col 66 of module replicated: 208868 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||line 94, col 26 to line 94, col 65 of module replicated: 626604 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||line 94, col 12 to line 94, col 23 of module replicated: 208868 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 98, col 24 to line 98, col 24 of module replicated: 208868 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 98, col 29 to line 98, col 30 of module replicated: 208868 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 99, col 8 to line 99, col 109 of module replicated: 203919 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 99, col 28 to line 99, col 109 of module replicated: 203919 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 99, col 29 to line 99, col 44 of module replicated: 203919 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 99, col 52 to line 99, col 108 of module replicated: 203919 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 99, col 72 to line 99, col 108 of module replicated: 203919 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||line 99, col 105 to line 99, col 108 of module replicated: 203919 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||line 99, col 85 to line 99, col 102 of module replicated: 203919 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||||line 92, col 15 to line 92, col 33 of module replicated: 203919 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2775:0 @!@!@ + ||||line 94, col 5 to line 94, col 66 of module replicated: 203919:203919 +@!@!@ENDMSG 2775 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||||line 94, col 26 to line 94, col 65 of module replicated: 611757 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||||line 94, col 12 to line 94, col 23 of module replicated: 203919 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||||line 99, col 101 to line 99, col 101 of module replicated: 203919 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 100, col 8 to line 100, col 58 of module replicated: 203919 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2774:0 @!@!@ + +@!@!@ENDMSG 2774 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 118, col 13 to line 119, col 81 of module replicated: 736274 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 118, col 35 to line 119, col 81 of module replicated: 736274 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 119, col 9 to line 119, col 81 of module replicated: 2208822 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 118, col 44 to line 118, col 72 of module replicated: 736274 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 118, col 22 to line 118, col 32 of module replicated: 736274 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2202:0 @!@!@ +End of statistics. +@!@!@ENDMSG 2202 @!@!@ +@!@!@STARTMSG 2200:0 @!@!@ +Progress(25) at 2025-01-19 18:39:14: 3.224.329 states generated (2.761.383 s/min), 208.868 distinct states found (178.878 ds/min), 0 states left on queue. +@!@!@ENDMSG 2200 @!@!@ +@!@!@STARTMSG 2199:0 @!@!@ +3224329 states generated, 208868 distinct states found, 0 states left on queue. +@!@!@ENDMSG 2199 @!@!@ +@!@!@STARTMSG 2194:0 @!@!@ +The depth of the complete state graph search is 25. +@!@!@ENDMSG 2194 @!@!@ +@!@!@STARTMSG 2268:0 @!@!@ +The average outdegree of the complete state graph is 1 (minimum is 0, the maximum 9 and the 95th percentile is 3). +@!@!@ENDMSG 2268 @!@!@ +@!@!@STARTMSG 2186:0 @!@!@ +Finished in 70074ms at (2025-01-19 18:39:14) +@!@!@ENDMSG 2186 @!@!@ diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308355472/MC.tla b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308355472/MC.tla new file mode 100644 index 0000000000..434bbc3bd0 --- /dev/null +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308355472/MC.tla @@ -0,0 +1,65 @@ +---- MODULE MC ---- +EXTENDS replicated, TLC + +\* MV CONSTANT declarations@modelParameterConstants +CONSTANTS +b1, b2, b3 +---- + +\* MV CONSTANT declarations@modelParameterConstants +CONSTANTS +s1, s2, s3 +---- + +\* MV CONSTANT declarations@modelParameterConstants +CONSTANTS +p1 +---- + +\* MV CONSTANT declarations@modelParameterConstants +CONSTANTS +az1, az2, az3 +---- + +\* MV CONSTANT definitions brokers +const_1737308284086143000 == +{b1, b2, b3} +---- + +\* MV CONSTANT definitions safekeepers +const_1737308284086144000 == +{s1, s2, s3} +---- + +\* MV CONSTANT definitions pageservers +const_1737308284086145000 == +{p1} +---- + +\* MV CONSTANT definitions azs +const_1737308284086146000 == +{az1, az2, az3} +---- + +\* SYMMETRY definition +symm_1737308284086147000 == +Permutations(const_1737308284086143000) \union Permutations(const_1737308284086144000) \union Permutations(const_1737308284086145000) \union Permutations(const_1737308284086146000) +---- + +\* CONSTANT definitions @modelParameterConstants:4max_commit_lsn +const_1737308284086148000 == +2 +---- + +\* CONSTANT definitions @modelParameterConstants:5az_mapping +const_1737308284086149000 == +[ az1 |-> {b1,s1,p1} , az2 |-> {b2,s2} , az3 |-> {b3,s3}] +---- + +\* CONSTRAINT definition @modelParameterContraint:0 +constr_1737308284086150000 == +StateConstraint +---- +============================================================================= +\* Modification History +\* Created Sun Jan 19 18:38:04 CET 2025 by cs diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308355472/MC_TE.out b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308355472/MC_TE.out new file mode 100644 index 0000000000..72ebe05b45 --- /dev/null +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308355472/MC_TE.out @@ -0,0 +1,354 @@ +@!@!@STARTMSG 2262:0 @!@!@ +TLC2 Version 2.19 of 08 August 2024 (rev: 5a47802) +@!@!@ENDMSG 2262 @!@!@ +@!@!@STARTMSG 2187:0 @!@!@ +Running breadth-first search Model-Checking with fp 96 and seed 147884281130356166 with 4 workers on 8 cores with 2428MB heap and 5460MB offheap memory [pid: 12007] (Mac OS X 10.16 x86_64, AdoptOpenJDK 14.0.1 x86_64, OffHeapDiskFPSet, DiskStateQueue). +@!@!@ENDMSG 2187 @!@!@ +@!@!@STARTMSG 2220:0 @!@!@ +Starting SANY... +@!@!@ENDMSG 2220 @!@!@ +Parsing file /Users/cs/src/neon/storage_broker/spec/replicated/replicated.toolbox/Model_1/MC.tla +Parsing file /Users/cs/src/neon/storage_broker/spec/replicated/replicated.toolbox/Model_1/replicated.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/TLC.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Integers.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/FiniteSets.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Naturals.tla +Parsing file /Applications/TLA+ Toolbox.app/Contents/Eclipse/plugins/org.lamport.tlatools_1.0.0.202408081326/tla2sany/StandardModules/Sequences.tla +Semantic processing of module Naturals +Semantic processing of module Integers +Semantic processing of module Sequences +Semantic processing of module FiniteSets +Semantic processing of module replicated +Semantic processing of module TLC +Semantic processing of module MC +@!@!@STARTMSG 2219:0 @!@!@ +SANY finished. +@!@!@ENDMSG 2219 @!@!@ +@!@!@STARTMSG 2185:0 @!@!@ +Starting... (2025-01-19 18:38:05) +@!@!@ENDMSG 2185 @!@!@ +@!@!@STARTMSG 2279:3 @!@!@ +Declaring symmetry during liveness checking is dangerous. It might cause TLC to miss violations of the stated liveness properties. Please check liveness without symmetry defined. +@!@!@ENDMSG 2279 @!@!@ +@!@!@STARTMSG 2284:3 @!@!@ +Declaring state or action constraints during liveness checking is dangerous: Please read section 14.3.5 on page 247 of Specifying Systems (https://lamport.azurewebsites.net/tla/book.html) and optionally the discussion at https://discuss.tlapl.us/msg00994.html for more details. +@!@!@ENDMSG 2284 @!@!@ +@!@!@STARTMSG 2212:0 @!@!@ +Implied-temporal checking--satisfiability problem has 1 branches. +@!@!@ENDMSG 2212 @!@!@ +@!@!@STARTMSG 2189:0 @!@!@ +Computing initial states... +@!@!@ENDMSG 2189 @!@!@ +@!@!@STARTMSG 2190:0 @!@!@ +Finished computing initial states: 1 distinct state generated at 2025-01-19 18:38:06. +@!@!@ENDMSG 2190 @!@!@ +@!@!@STARTMSG 2192:0 @!@!@ +Checking temporal properties for the current state space with 3861 total distinct states at (2025-01-19 18:38:09) +@!@!@ENDMSG 2192 @!@!@ +@!@!@STARTMSG 2267:0 @!@!@ +Finished checking temporal properties in 00s at 2025-01-19 18:38:09 +@!@!@ENDMSG 2267 @!@!@ +@!@!@STARTMSG 2200:0 @!@!@ +Progress(11) at 2025-01-19 18:38:09: 77.856 states generated (77.856 s/min), 8.653 distinct states found (8.653 ds/min), 4.790 states left on queue. +@!@!@ENDMSG 2200 @!@!@ +@!@!@STARTMSG 2192:0 @!@!@ +Checking temporal properties for the current state space with 197257 total distinct states at (2025-01-19 18:39:09) +@!@!@ENDMSG 2192 @!@!@ +@!@!@STARTMSG 2267:0 @!@!@ +Finished checking temporal properties in 00s at 2025-01-19 18:39:09 +@!@!@ENDMSG 2267 @!@!@ +@!@!@STARTMSG 2200:0 @!@!@ +Progress(20) at 2025-01-19 18:39:09: 3.084.377 states generated (3.006.521 s/min), 204.964 distinct states found (196.311 ds/min), 7.704 states left on queue. +@!@!@ENDMSG 2200 @!@!@ +@!@!@STARTMSG 2200:0 @!@!@ +Progress(25) at 2025-01-19 18:39:12: 3.224.329 states generated, 208.868 distinct states found, 0 states left on queue. +@!@!@ENDMSG 2200 @!@!@ +@!@!@STARTMSG 2192:0 @!@!@ +Checking temporal properties for the complete state space with 208868 total distinct states at (2025-01-19 18:39:12) +@!@!@ENDMSG 2192 @!@!@ +@!@!@STARTMSG 2267:0 @!@!@ +Finished checking temporal properties in 00s at 2025-01-19 18:39:12 +@!@!@ENDMSG 2267 @!@!@ +@!@!@STARTMSG 2193:0 @!@!@ +Model checking completed. No error has been found. + Estimates of the probability that TLC did not check all reachable states + because two distinct states had the same fingerprint: + calculated (optimistic): val = 3.4E-8 + based on the actual fingerprints: val = 6.3E-10 +@!@!@ENDMSG 2193 @!@!@ +@!@!@STARTMSG 2201:0 @!@!@ +The coverage statistics at 2025-01-19 18:39:14 +@!@!@ENDMSG 2201 @!@!@ +@!@!@STARTMSG 2773:0 @!@!@ +: 1:1 +@!@!@ENDMSG 2773 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 35, col 5 to line 38, col 26 of module replicated: 1 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 14290:208868 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 41, col 8 to line 44, col 44 of module replicated: 208868 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 41, col 18 to line 44, col 44 of module replicated: 208868 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 42, col 9 to line 44, col 44 of module replicated: 22348876 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||line 42, col 12 to line 42, col 48 of module replicated: 22348876 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||line 43, col 12 to line 43, col 44 of module replicated: 8981324 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||line 44, col 12 to line 44, col 44 of module replicated: 2924152 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 41, col 32 to line 41, col 48 of module replicated: 208868 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 45, col 8 to line 45, col 67 of module replicated: 208868 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 84:530666 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 48, col 8 to line 48, col 32 of module replicated: 2410478 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2775:0 @!@!@ + |line 48, col 8 to line 48, col 15 of module replicated: 1879812:4246157 +@!@!@ENDMSG 2775 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 48, col 27 to line 48, col 32 of module replicated: 1879812 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 49, col 8 to line 49, col 14 of module replicated: 1643803 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 49, col 8 to line 49, col 9 of module replicated: 1113137 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 49, col 13 to line 49, col 14 of module replicated: 1113137 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 50, col 8 to line 50, col 72 of module replicated: 1170534 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 50, col 8 to line 50, col 38 of module replicated: 639868 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 50, col 42 to line 50, col 72 of module replicated: 639868 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 54, col 13 to line 56, col 50 of module replicated: 530666 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 57, col 8 to line 57, col 58 of module replicated: 530666 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 682:54601 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 60, col 8 to line 60, col 32 of module replicated: 1934413 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2775:0 @!@!@ + |line 60, col 8 to line 60, col 15 of module replicated: 1879812:4246157 +@!@!@ENDMSG 2775 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 60, col 27 to line 60, col 32 of module replicated: 1879812 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 61, col 8 to line 61, col 72 of module replicated: 54601 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 61, col 8 to line 61, col 38 of module replicated: 1113137 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 61, col 42 to line 61, col 72 of module replicated: 1113137 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 62, col 8 to line 62, col 102 of module replicated: 54601 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 63, col 8 to line 63, col 58 of module replicated: 54601 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 45241:1113137 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 66, col 8 to line 66, col 30 of module replicated: 2992949 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2775:0 @!@!@ + |line 66, col 8 to line 66, col 13 of module replicated: 1879812:4412756 +@!@!@ENDMSG 2775 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 66, col 25 to line 66, col 30 of module replicated: 1879812 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 67, col 8 to line 74, col 29 of module replicated: 1113137 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 67, col 24 to line 74, col 29 of module replicated: 1113137 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 67, col 27 to line 67, col 91 of module replicated: 1113137 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 70, col 28 to line 70, col 45 of module replicated: 611653 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 71, col 31 to line 71, col 91 of module replicated: 611653 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 73, col 17 to line 73, col 54 of module replicated: 611653 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 74, col 18 to line 74, col 29 of module replicated: 501484 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 75, col 8 to line 75, col 62 of module replicated: 1113137 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 90643:1113137 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 78, col 8 to line 78, col 31 of module replicated: 2992949 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2775:0 @!@!@ + |line 78, col 8 to line 78, col 14 of module replicated: 1879812:5525893 +@!@!@ENDMSG 2775 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 78, col 26 to line 78, col 31 of module replicated: 1879812 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 84, col 13 to line 86, col 37 of module replicated: 1113137 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 84, col 33 to line 86, col 37 of module replicated: 1113137 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 84, col 36 to line 84, col 66 of module replicated: 1113137 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 85, col 22 to line 85, col 66 of module replicated: 406880 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 86, col 22 to line 86, col 37 of module replicated: 706257 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 87, col 8 to line 87, col 58 of module replicated: 1113137 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2772:0 @!@!@ +: 57927:203919 +@!@!@ENDMSG 2772 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 97, col 8 to line 97, col 27 of module replicated: 412787 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2775:0 @!@!@ + |line 97, col 8 to line 97, col 10 of module replicated: 208868:417736 +@!@!@ENDMSG 2775 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 97, col 22 to line 97, col 27 of module replicated: 208868 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 98, col 8 to line 98, col 30 of module replicated: 412787 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 98, col 8 to line 98, col 25 of module replicated: 208868 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 92, col 15 to line 92, col 33 of module replicated: 208868 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 94, col 5 to line 94, col 66 of module replicated: 208868 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||line 94, col 26 to line 94, col 65 of module replicated: 626604 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||line 94, col 12 to line 94, col 23 of module replicated: 208868 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 98, col 24 to line 98, col 24 of module replicated: 208868 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 98, col 29 to line 98, col 30 of module replicated: 208868 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 99, col 8 to line 99, col 109 of module replicated: 203919 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 99, col 28 to line 99, col 109 of module replicated: 203919 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 99, col 29 to line 99, col 44 of module replicated: 203919 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 99, col 52 to line 99, col 108 of module replicated: 203919 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 99, col 72 to line 99, col 108 of module replicated: 203919 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||line 99, col 105 to line 99, col 108 of module replicated: 203919 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||line 99, col 85 to line 99, col 102 of module replicated: 203919 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||||line 92, col 15 to line 92, col 33 of module replicated: 203919 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2775:0 @!@!@ + ||||line 94, col 5 to line 94, col 66 of module replicated: 203919:203919 +@!@!@ENDMSG 2775 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||||line 94, col 26 to line 94, col 65 of module replicated: 611757 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |||||line 94, col 12 to line 94, col 23 of module replicated: 203919 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||||line 99, col 101 to line 99, col 101 of module replicated: 203919 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 100, col 8 to line 100, col 58 of module replicated: 203919 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2774:0 @!@!@ + +@!@!@ENDMSG 2774 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + line 118, col 13 to line 119, col 81 of module replicated: 736274 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 118, col 35 to line 119, col 81 of module replicated: 736274 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 119, col 9 to line 119, col 81 of module replicated: 2208822 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + ||line 118, col 44 to line 118, col 72 of module replicated: 736274 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2221:0 @!@!@ + |line 118, col 22 to line 118, col 32 of module replicated: 736274 +@!@!@ENDMSG 2221 @!@!@ +@!@!@STARTMSG 2202:0 @!@!@ +End of statistics. +@!@!@ENDMSG 2202 @!@!@ +@!@!@STARTMSG 2200:0 @!@!@ +Progress(25) at 2025-01-19 18:39:14: 3.224.329 states generated (2.761.383 s/min), 208.868 distinct states found (178.878 ds/min), 0 states left on queue. +@!@!@ENDMSG 2200 @!@!@ +@!@!@STARTMSG 2199:0 @!@!@ +3224329 states generated, 208868 distinct states found, 0 states left on queue. +@!@!@ENDMSG 2199 @!@!@ +@!@!@STARTMSG 2194:0 @!@!@ +The depth of the complete state graph search is 25. +@!@!@ENDMSG 2194 @!@!@ +@!@!@STARTMSG 2268:0 @!@!@ +The average outdegree of the complete state graph is 1 (minimum is 0, the maximum 9 and the 95th percentile is 3). +@!@!@ENDMSG 2268 @!@!@ +@!@!@STARTMSG 2186:0 @!@!@ +Finished in 70074ms at (2025-01-19 18:39:14) +@!@!@ENDMSG 2186 @!@!@ diff --git a/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308355472/replicated.tla b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308355472/replicated.tla new file mode 100644 index 0000000000..33971e3071 --- /dev/null +++ b/storage_broker/spec/replicated/replicated.toolbox/Model_1_SnapShot_1737308355472/replicated.tla @@ -0,0 +1,134 @@ +---- MODULE replicated ---- + +EXTENDS Integers, FiniteSets + +VARIABLES broker_state, safekeeper_state, pageserver_state, online + + +CONSTANT + brokers, + safekeepers, + pageservers, + azs, + az_mapping + +CONSTANT + NULL + +CONSTANT + max_commit_lsn + +StateConstraint == + /\ \A s \in safekeepers: + /\ safekeeper_state[s].commit_lsn <= max_commit_lsn + /\ \A b \in brokers: + /\ \A s \in DOMAIN broker_state[b].sk: + /\ broker_state[b].sk[s].commit_lsn <= max_commit_lsn + + +InitSafekeeper == [pruned_lsn |-> 0, commit_lsn |-> 0] +InitBroker == [sk |-> [s \in safekeepers |-> [commit_lsn |-> 0]]] +InitPageserver == [last_record_lsn |-> 0, preferred_sk |-> NULL, sk |-> [s \in safekeepers |-> [commit_lsn |-> 0]]] +InitOnline == safekeepers \cup brokers \cup pageservers + +Init == + /\ broker_state = [b \in brokers |-> InitBroker] + /\ safekeeper_state = [s \in safekeepers |-> InitSafekeeper] + /\ pageserver_state = [p \in pageservers |-> InitPageserver] + /\ online = InitOnline + +NodeOnlineOffline == + /\ online' = CHOOSE ss \in SUBSET InitOnline: + /\ Cardinality(ss \cap safekeepers) >= 2 + /\ Cardinality(ss \cap brokers) >= 2 + /\ ss \cap pageservers = pageservers \* assume no PS failures for now + /\ UNCHANGED <> + +SkCommit(s1, s2) == + /\ {s1, s2} \subseteq online + /\ s1 # s2 + /\ safekeeper_state[s1].commit_lsn = safekeeper_state[s2].commit_lsn + /\ LET + new_commit_lsn == safekeeper_state[s1].commit_lsn + 1 + IN + safekeeper_state' = [safekeeper_state EXCEPT + ![s1].commit_lsn = new_commit_lsn, + ![s2].commit_lsn = new_commit_lsn] + /\ UNCHANGED <> + +SkPeerRecovery(s1,s2) == + /\ {s1, s2} \subseteq online + /\ safekeeper_state[s1].commit_lsn < safekeeper_state[s2].commit_lsn + /\ safekeeper_state' = [safekeeper_state EXCEPT![s1].commit_lsn = safekeeper_state[s2].commit_lsn] + /\ UNCHANGED <> + +SkPushToBroker(s,b) == + /\ {s, b} \subseteq online + /\ broker_state' = IF broker_state[b].sk[s].commit_lsn < safekeeper_state[s].commit_lsn + THEN + LET + bsk == broker_state[b].sk + updbsk == [bsk EXCEPT ![s].commit_lsn = safekeeper_state[s].commit_lsn] + IN + [broker_state EXCEPT ![b].sk = updbsk] + ELSE broker_state + /\ UNCHANGED <> + +PsRecvBroker(b,p,s) == + /\ {b,p,s} \subseteq online + /\ LET + bsk == broker_state[b].sk[s] + psk == pageserver_state[p].sk[s] + updpsk == [psk EXCEPT !["commit_lsn"] = bsk.commit_lsn] + IN + pageserver_state' = IF bsk.commit_lsn > psk.commit_lsn + THEN [pageserver_state EXCEPT ![p].sk[s] = updpsk] + ELSE pageserver_state + /\ UNCHANGED <> + + +SksWithNewerWal(p) == + LET + ps == pageserver_state[p] + IN + {s \in DOMAIN ps.sk: ps.sk[s].commit_lsn > ps.last_record_lsn} + +PsChooseSk(p) == + /\ {p} \subseteq online + /\ SksWithNewerWal(p) # {} + /\ pageserver_state' = [pageserver_state EXCEPT![p].preferred_sk = CHOOSE s \in SksWithNewerWal(p): TRUE] + /\ UNCHANGED <> + + +Next == + \/ NodeOnlineOffline + \/ \E s1 \in safekeepers: \E s2 \in safekeepers: + \/ SkCommit(s1, s2) + \/ SkPeerRecovery(s1, s2) + \/ \E s \in safekeepers: \E b \in brokers: SkPushToBroker(s, b) + \/ \E s \in safekeepers: \E b \in brokers: \E p \in pageservers: PsRecvBroker(b,p,s) + \/ \E p \in pageservers: PsChooseSk(p) + + +Spec == Init /\ [][Next]_<< broker_state, safekeeper_state, pageserver_state,online>> + + +\* invariants + +PsLagsSk == \A p \in pageservers: \A s \in DOMAIN pageserver_state[p].sk: + /\ pageserver_state[p].sk[s].commit_lsn <= safekeeper_state[s].commit_lsn + + +EventuallyLaggingSkIsNotPreferredSk == <>( + LET + sks == safekeeper_state + lagging_sks == { s \in safekeepers: \A s2 \in safekeepers: sks[s].commit_lsn <= sks[s2].commit_lsn } + preferred_sks == {pageserver_state[p].preferred_sk: p \in pageservers} + IN + preferred_sks \cap lagging_sks = {} + + ) + + + +==== \ No newline at end of file diff --git a/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1.launch b/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1.launch index e7455da5fd..a09d0d0885 100644 --- a/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1.launch +++ b/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1.launch @@ -12,7 +12,7 @@ - + @@ -21,10 +21,12 @@ - + - + + + @@ -35,9 +37,9 @@ - + - + diff --git a/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737296416956.launch b/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737296416956.launch deleted file mode 100644 index b6473f673b..0000000000 --- a/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737296416956.launch +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737297534393.launch b/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737297534393.launch deleted file mode 100644 index 2d71f66906..0000000000 --- a/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737297534393.launch +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737297999722.launch b/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737297999722.launch deleted file mode 100644 index 1a09cb6ee5..0000000000 --- a/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737297999722.launch +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737299352762.launch b/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737299352762.launch deleted file mode 100644 index d7f0f71f05..0000000000 --- a/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737299352762.launch +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737301172627.launch b/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737301172627.launch deleted file mode 100644 index 3acafd183d..0000000000 --- a/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737301172627.launch +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737301223409.launch b/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737301223409.launch deleted file mode 100644 index 79f0c2c1e8..0000000000 --- a/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737301223409.launch +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737299381423.launch b/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737307595008.launch similarity index 99% rename from storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737299381423.launch rename to storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737307595008.launch index 20569969c6..0c3da56e23 100644 --- a/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737299381423.launch +++ b/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737307595008.launch @@ -2,7 +2,7 @@ - + diff --git a/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737299469039.launch b/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737307621596.launch similarity index 99% rename from storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737299469039.launch rename to storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737307621596.launch index 66fb925b63..7175e68a8c 100644 --- a/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737299469039.launch +++ b/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737307621596.launch @@ -2,7 +2,7 @@ - + diff --git a/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737299542008.launch b/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737307660221.launch similarity index 99% rename from storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737299542008.launch rename to storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737307660221.launch index 971c7c5a63..5546705b36 100644 --- a/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737299542008.launch +++ b/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737307660221.launch @@ -2,7 +2,7 @@ - + diff --git a/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737299744229.launch b/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737307704621.launch similarity index 99% rename from storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737299744229.launch rename to storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737307704621.launch index d8b504d669..27f3ded305 100644 --- a/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737299744229.launch +++ b/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737307704621.launch @@ -2,7 +2,7 @@ - + diff --git a/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737307769810.launch b/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737307769810.launch new file mode 100644 index 0000000000..9d0cbac7dd --- /dev/null +++ b/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737307769810.launch @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737307828738.launch b/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737307828738.launch new file mode 100644 index 0000000000..eaecdfb9f5 --- /dev/null +++ b/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737307828738.launch @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737308024914.launch b/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737308024914.launch new file mode 100644 index 0000000000..16960af230 --- /dev/null +++ b/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737308024914.launch @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737308183077.launch b/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737308183077.launch new file mode 100644 index 0000000000..45c5003d49 --- /dev/null +++ b/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737308183077.launch @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737308216766.launch b/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737308216766.launch new file mode 100644 index 0000000000..137c568ffe --- /dev/null +++ b/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737308216766.launch @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737308355472.launch b/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737308355472.launch new file mode 100644 index 0000000000..7d9ed3f070 --- /dev/null +++ b/storage_broker/spec/replicated/replicated.toolbox/replicated___Model_1_SnapShot_1737308355472.launch @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +