From d212e7acb7d7a7d033e3bcb3456aa5fbd728a60a Mon Sep 17 00:00:00 2001 From: Andrew Helwer <2n8rn1w1f@mozmail.com> Date: Mon, 22 Jan 2024 12:19:16 -0500 Subject: [PATCH] Moved Paxos (Turing) models into directory Signed-off-by: Andrew Helwer <2n8rn1w1f@mozmail.com> --- manifest.json | 145 +------ .../Consensus.toolbox/.project | 24 -- .../.settings/org.lamport.tla.toolbox.prefs | 2 - .../Consensus.toolbox/3Values/Consensus.tla | 91 ---- .../Consensus.toolbox/3Values/FiniteSets.tla | 23 -- .../Consensus___3Values.launch | 29 -- .../3Values/MC.cfg => MCConsensus.cfg} | 0 .../3Values/MC.tla => MCConsensus.tla} | 2 +- .../TinyModel/MC.tla => MCPaxos.tla} | 8 +- .../TinyModel/MC.cfg => MCPaxosSmall.cfg} | 4 +- .../SmallModel/MC.cfg => MCPaxosTiny.cfg} | 16 +- .../SmallModel/MC.cfg => MCVoting.cfg} | 0 .../SmallModel/MC.tla => MCVoting.tla} | 2 +- .../Paxos.toolbox/.project | 34 -- .../.settings/org.lamport.tla.toolbox.prefs | 2 - .../Paxos.toolbox/Paxos___SmallModel.launch | 43 -- .../Paxos.toolbox/Paxos___TinyModel.launch | 48 --- .../Paxos.toolbox/SmallModel/Consensus.tla | 112 ----- .../Paxos.toolbox/SmallModel/FiniteSets.tla | 23 -- .../Paxos.toolbox/SmallModel/MC.tla | 43 -- .../Paxos.toolbox/SmallModel/Paxos.tla | 389 ------------------ .../Paxos.toolbox/SmallModel/Voting.tla | 315 -------------- .../Paxos.toolbox/TinyModel/Consensus.tla | 98 ----- .../Paxos.toolbox/TinyModel/FiniteSets.tla | 23 -- .../Paxos.toolbox/TinyModel/Paxos.tla | 289 ------------- .../Paxos.toolbox/TinyModel/Voting.tla | 300 -------------- .../Voting.toolbox/.project | 29 -- .../.settings/org.lamport.tla.toolbox.prefs | 2 - .../Voting.toolbox/SmallModel/Consensus.tla | 113 ----- .../Voting.toolbox/SmallModel/FiniteSets.tla | 23 -- .../Voting.toolbox/SmallModel/Voting.tla | 315 -------------- .../Voting.toolbox/Voting.pdf | Bin 182660 -> 0 bytes .../Voting.toolbox/Voting___SmallModel.launch | 57 --- 33 files changed, 35 insertions(+), 2569 deletions(-) delete mode 100644 specifications/PaxosHowToWinATuringAward/Consensus.toolbox/.project delete mode 100644 specifications/PaxosHowToWinATuringAward/Consensus.toolbox/.settings/org.lamport.tla.toolbox.prefs delete mode 100644 specifications/PaxosHowToWinATuringAward/Consensus.toolbox/3Values/Consensus.tla delete mode 100644 specifications/PaxosHowToWinATuringAward/Consensus.toolbox/3Values/FiniteSets.tla delete mode 100644 specifications/PaxosHowToWinATuringAward/Consensus.toolbox/Consensus___3Values.launch rename specifications/PaxosHowToWinATuringAward/{Consensus.toolbox/3Values/MC.cfg => MCConsensus.cfg} (100%) rename specifications/PaxosHowToWinATuringAward/{Consensus.toolbox/3Values/MC.tla => MCConsensus.tla} (91%) rename specifications/PaxosHowToWinATuringAward/{Paxos.toolbox/TinyModel/MC.tla => MCPaxos.tla} (92%) rename specifications/PaxosHowToWinATuringAward/{Paxos.toolbox/TinyModel/MC.cfg => MCPaxosSmall.cfg} (89%) rename specifications/PaxosHowToWinATuringAward/{Paxos.toolbox/SmallModel/MC.cfg => MCPaxosTiny.cfg} (57%) rename specifications/PaxosHowToWinATuringAward/{Voting.toolbox/SmallModel/MC.cfg => MCVoting.cfg} (100%) rename specifications/PaxosHowToWinATuringAward/{Voting.toolbox/SmallModel/MC.tla => MCVoting.tla} (96%) delete mode 100644 specifications/PaxosHowToWinATuringAward/Paxos.toolbox/.project delete mode 100644 specifications/PaxosHowToWinATuringAward/Paxos.toolbox/.settings/org.lamport.tla.toolbox.prefs delete mode 100644 specifications/PaxosHowToWinATuringAward/Paxos.toolbox/Paxos___SmallModel.launch delete mode 100644 specifications/PaxosHowToWinATuringAward/Paxos.toolbox/Paxos___TinyModel.launch delete mode 100644 specifications/PaxosHowToWinATuringAward/Paxos.toolbox/SmallModel/Consensus.tla delete mode 100644 specifications/PaxosHowToWinATuringAward/Paxos.toolbox/SmallModel/FiniteSets.tla delete mode 100644 specifications/PaxosHowToWinATuringAward/Paxos.toolbox/SmallModel/MC.tla delete mode 100644 specifications/PaxosHowToWinATuringAward/Paxos.toolbox/SmallModel/Paxos.tla delete mode 100644 specifications/PaxosHowToWinATuringAward/Paxos.toolbox/SmallModel/Voting.tla delete mode 100644 specifications/PaxosHowToWinATuringAward/Paxos.toolbox/TinyModel/Consensus.tla delete mode 100644 specifications/PaxosHowToWinATuringAward/Paxos.toolbox/TinyModel/FiniteSets.tla delete mode 100644 specifications/PaxosHowToWinATuringAward/Paxos.toolbox/TinyModel/Paxos.tla delete mode 100644 specifications/PaxosHowToWinATuringAward/Paxos.toolbox/TinyModel/Voting.tla delete mode 100644 specifications/PaxosHowToWinATuringAward/Voting.toolbox/.project delete mode 100644 specifications/PaxosHowToWinATuringAward/Voting.toolbox/.settings/org.lamport.tla.toolbox.prefs delete mode 100644 specifications/PaxosHowToWinATuringAward/Voting.toolbox/SmallModel/Consensus.tla delete mode 100644 specifications/PaxosHowToWinATuringAward/Voting.toolbox/SmallModel/FiniteSets.tla delete mode 100644 specifications/PaxosHowToWinATuringAward/Voting.toolbox/SmallModel/Voting.tla delete mode 100644 specifications/PaxosHowToWinATuringAward/Voting.toolbox/Voting.pdf delete mode 100644 specifications/PaxosHowToWinATuringAward/Voting.toolbox/Voting___SmallModel.launch diff --git a/manifest.json b/manifest.json index 332a4439..35f4ca75 100644 --- a/manifest.json +++ b/manifest.json @@ -1374,29 +1374,13 @@ "models": [] }, { - "path": "specifications/PaxosHowToWinATuringAward/Consensus.toolbox/3Values/Consensus.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "proof" - ], - "models": [] - }, - { - "path": "specifications/PaxosHowToWinATuringAward/Consensus.toolbox/3Values/FiniteSets.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/PaxosHowToWinATuringAward/Consensus.toolbox/3Values/MC.tla", + "path": "specifications/PaxosHowToWinATuringAward/MCConsensus.tla", "communityDependencies": [], "tlaLanguageVersion": 2, "features": [], "models": [ { - "path": "specifications/PaxosHowToWinATuringAward/Consensus.toolbox/3Values/MC.cfg", + "path": "specifications/PaxosHowToWinATuringAward/MCConsensus.cfg", "runtime": "00:00:01", "size": "small", "mode": "exhaustive search", @@ -1408,36 +1392,13 @@ ] }, { - "path": "specifications/PaxosHowToWinATuringAward/Paxos.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/PaxosHowToWinATuringAward/Paxos.toolbox/SmallModel/Consensus.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "proof" - ], - "models": [] - }, - { - "path": "specifications/PaxosHowToWinATuringAward/Paxos.toolbox/SmallModel/FiniteSets.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/PaxosHowToWinATuringAward/Paxos.toolbox/SmallModel/MC.tla", + "path": "specifications/PaxosHowToWinATuringAward/MCPaxos.tla", "communityDependencies": [], "tlaLanguageVersion": 2, "features": [], "models": [ { - "path": "specifications/PaxosHowToWinATuringAward/Paxos.toolbox/SmallModel/MC.cfg", + "path": "specifications/PaxosHowToWinATuringAward/MCPaxosSmall.cfg", "runtime": "00:01:00", "size": "medium", "mode": "exhaustive search", @@ -1445,49 +1406,9 @@ "liveness" ], "result": "success" - } - ] - }, - { - "path": "specifications/PaxosHowToWinATuringAward/Paxos.toolbox/SmallModel/Paxos.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/PaxosHowToWinATuringAward/Paxos.toolbox/SmallModel/Voting.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "proof" - ], - "models": [] - }, - { - "path": "specifications/PaxosHowToWinATuringAward/Paxos.toolbox/TinyModel/Consensus.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "proof" - ], - "models": [] - }, - { - "path": "specifications/PaxosHowToWinATuringAward/Paxos.toolbox/TinyModel/FiniteSets.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/PaxosHowToWinATuringAward/Paxos.toolbox/TinyModel/MC.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ + }, { - "path": "specifications/PaxosHowToWinATuringAward/Paxos.toolbox/TinyModel/MC.cfg", + "path": "specifications/PaxosHowToWinATuringAward/MCPaxosTiny.cfg", "runtime": "00:00:01", "size": "small", "mode": "exhaustive search", @@ -1499,54 +1420,13 @@ ] }, { - "path": "specifications/PaxosHowToWinATuringAward/Paxos.toolbox/TinyModel/Paxos.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/PaxosHowToWinATuringAward/Paxos.toolbox/TinyModel/Voting.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "proof" - ], - "models": [] - }, - { - "path": "specifications/PaxosHowToWinATuringAward/Voting.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "proof" - ], - "models": [] - }, - { - "path": "specifications/PaxosHowToWinATuringAward/Voting.toolbox/SmallModel/Consensus.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "proof" - ], - "models": [] - }, - { - "path": "specifications/PaxosHowToWinATuringAward/Voting.toolbox/SmallModel/FiniteSets.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/PaxosHowToWinATuringAward/Voting.toolbox/SmallModel/MC.tla", + "path": "specifications/PaxosHowToWinATuringAward/MCVoting.tla", "communityDependencies": [], "tlaLanguageVersion": 2, "features": [], "models": [ { - "path": "specifications/PaxosHowToWinATuringAward/Voting.toolbox/SmallModel/MC.cfg", + "path": "specifications/PaxosHowToWinATuringAward/MCVoting.cfg", "runtime": "00:00:01", "size": "small", "mode": "exhaustive search", @@ -1559,7 +1439,14 @@ ] }, { - "path": "specifications/PaxosHowToWinATuringAward/Voting.toolbox/SmallModel/Voting.tla", + "path": "specifications/PaxosHowToWinATuringAward/Paxos.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/PaxosHowToWinATuringAward/Voting.tla", "communityDependencies": [], "tlaLanguageVersion": 2, "features": [ diff --git a/specifications/PaxosHowToWinATuringAward/Consensus.toolbox/.project b/specifications/PaxosHowToWinATuringAward/Consensus.toolbox/.project deleted file mode 100644 index e7050887..00000000 --- a/specifications/PaxosHowToWinATuringAward/Consensus.toolbox/.project +++ /dev/null @@ -1,24 +0,0 @@ - - - Consensus - - - - - - toolbox.builder.TLAParserBuilder - - - - - - toolbox.natures.TLANature - - - - Consensus.tla - 1 - PARENT-1-PROJECT_LOC/Consensus.tla - - - diff --git a/specifications/PaxosHowToWinATuringAward/Consensus.toolbox/.settings/org.lamport.tla.toolbox.prefs b/specifications/PaxosHowToWinATuringAward/Consensus.toolbox/.settings/org.lamport.tla.toolbox.prefs deleted file mode 100644 index 7c22c9dd..00000000 --- a/specifications/PaxosHowToWinATuringAward/Consensus.toolbox/.settings/org.lamport.tla.toolbox.prefs +++ /dev/null @@ -1,2 +0,0 @@ -ProjectRootFile=PARENT-1-PROJECT_LOC/Consensus.tla -eclipse.preferences.version=1 diff --git a/specifications/PaxosHowToWinATuringAward/Consensus.toolbox/3Values/Consensus.tla b/specifications/PaxosHowToWinATuringAward/Consensus.toolbox/3Values/Consensus.tla deleted file mode 100644 index dc07c5bc..00000000 --- a/specifications/PaxosHowToWinATuringAward/Consensus.toolbox/3Values/Consensus.tla +++ /dev/null @@ -1,91 +0,0 @@ ------------------------------ MODULE Consensus ------------------------------ -(***************************************************************************) -(* This is an very abstract specification of the consensus problem, in *) -(* which a set of processes must choose a single value. We abstract away *) -(* even the processes. We specify the simple requirement that at most one *) -(* value is chosen by describing the set of all chosen values. The naive *) -(* requirement is that this set never contains more than one value, which *) -(* is an invariance property. But a little thought shows that this *) -(* requirement allows a value to be chosen then unchosen, and then another *) -(* value to be chosen. So we specify that the set of chosen values is *) -(* initially empty, it can be set to a single value, and then it can never *) -(* change. *) -(***************************************************************************) - -EXTENDS Naturals, FiniteSets - (*************************************************************************) - (* Imports standard modules that define operators of arithmetic on *) - (* natural numbers and the Cardinality operator, where Cardinality(S) is *) - (* the number of elements in the set S, if S is finite. *) - (*************************************************************************) -CONSTANT Value - (*************************************************************************) - (* The set of all values that can be chosen. *) - (*************************************************************************) -VARIABLE chosen - (*************************************************************************) - (* The set of all values that have been chosen. *) - (*************************************************************************) - -(***************************************************************************) -(* The type-correctness invariant asserting the "type" of the variable *) -(* 'chosen'. It isn't part of the spec itself--that is, the formula *) -(* describing the possible sequence of values that 'chosen' can have in a *) -(* behavior correct behavior of the system, but is an invariance property *) -(* that the spec should satisfy. *) -(***************************************************************************) -TypeOK == /\ chosen \subseteq Value - /\ IsFiniteSet(chosen) - -(***************************************************************************) -(* The initial predicate describing the possible initial state of *) -(* 'chosen'. *) -(***************************************************************************) -Init == chosen = {} - -(***************************************************************************) -(* The next-state relation describing how 'chosen' can change from one *) -(* step to the next. Note that is enabled (equals true for some next *) -(* value chosen' of choseen) if and only if chosen equals the empty set. *) -(***************************************************************************) -Next == /\ chosen = {} - /\ \E v \in Value : chosen' = {v} - -(***************************************************************************) -(* The TLA+ temporal formula that is the spec. *) -(***************************************************************************) -Spec == Init /\ [][Next]_chosen - ------------------------------------------------------------------------------ -(***************************************************************************) -(* The specification should imply the safety property that 'chosen' can *) -(* contain at most one value in any reachable state. This condition on *) -(* the state is expressed by Inv defined here. *) -(***************************************************************************) -Inv == /\ TypeOK - /\ Cardinality(chosen) \leq 1 - -(***************************************************************************) -(* You can now run the TLC model checker on the model named 3Values to *) -(* check that Inv is an invariant, meaning that it's true of every *) -(* reachable state. TLC's default setting to check for deadlock would *) -(* cause it to report a deadlock because no action is possible after a *) -(* value is chosen. We would say that the system terminated, but *) -(* termination is just deadlock that we want to happen, and we have to *) -(* tell TLC that we want deadlock by disabling its check for it. *) -(***************************************************************************) - - -(***************************************************************************) -(* The following theorem asserts the desired safety propert. Its proof *) -(* appears after the theorem. This proof is easily checked by the TLAPS *) -(* prover. *) -(***************************************************************************) -THEOREM Invariance == Spec => []Inv -<1>1. Init => Inv - -<1>2. Inv /\ [Next]_chosen => Inv' - -<1>3. QED - BY <1>1, <1>2 DEF Spec -============================================================================= diff --git a/specifications/PaxosHowToWinATuringAward/Consensus.toolbox/3Values/FiniteSets.tla b/specifications/PaxosHowToWinATuringAward/Consensus.toolbox/3Values/FiniteSets.tla deleted file mode 100644 index 57ac4023..00000000 --- a/specifications/PaxosHowToWinATuringAward/Consensus.toolbox/3Values/FiniteSets.tla +++ /dev/null @@ -1,23 +0,0 @@ ----------------------------- MODULE FiniteSets ----------------------------- -LOCAL INSTANCE Naturals -LOCAL INSTANCE Sequences - (*************************************************************************) - (* Imports the definitions from Naturals and Sequences, but doesn't *) - (* export them. *) - (*************************************************************************) - -IsFiniteSet(S) == - (*************************************************************************) - (* A set S is finite iff there is a finite sequence containing all its *) - (* elements. *) - (*************************************************************************) - \E seq \in Seq(S) : \A s \in S : \E n \in 1..Len(seq) : seq[n] = s - -Cardinality(S) == - (*************************************************************************) - (* Cardinality is defined only for finite sets. *) - (*************************************************************************) - LET CS[T \in SUBSET S] == IF T = {} THEN 0 - ELSE 1 + CS[T \ {CHOOSE x : x \in T}] - IN CS[S] -============================================================================= diff --git a/specifications/PaxosHowToWinATuringAward/Consensus.toolbox/Consensus___3Values.launch b/specifications/PaxosHowToWinATuringAward/Consensus.toolbox/Consensus___3Values.launch deleted file mode 100644 index 15d22ef7..00000000 --- a/specifications/PaxosHowToWinATuringAward/Consensus.toolbox/Consensus___3Values.launch +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/specifications/PaxosHowToWinATuringAward/Consensus.toolbox/3Values/MC.cfg b/specifications/PaxosHowToWinATuringAward/MCConsensus.cfg similarity index 100% rename from specifications/PaxosHowToWinATuringAward/Consensus.toolbox/3Values/MC.cfg rename to specifications/PaxosHowToWinATuringAward/MCConsensus.cfg diff --git a/specifications/PaxosHowToWinATuringAward/Consensus.toolbox/3Values/MC.tla b/specifications/PaxosHowToWinATuringAward/MCConsensus.tla similarity index 91% rename from specifications/PaxosHowToWinATuringAward/Consensus.toolbox/3Values/MC.tla rename to specifications/PaxosHowToWinATuringAward/MCConsensus.tla index 9cd62aba..3a343f8a 100644 --- a/specifications/PaxosHowToWinATuringAward/Consensus.toolbox/3Values/MC.tla +++ b/specifications/PaxosHowToWinATuringAward/MCConsensus.tla @@ -1,4 +1,4 @@ ----- MODULE MC ---- +---- MODULE MCConsensus ---- EXTENDS Consensus, TLC \* MV CONSTANT declarations@modelParameterConstants diff --git a/specifications/PaxosHowToWinATuringAward/Paxos.toolbox/TinyModel/MC.tla b/specifications/PaxosHowToWinATuringAward/MCPaxos.tla similarity index 92% rename from specifications/PaxosHowToWinATuringAward/Paxos.toolbox/TinyModel/MC.tla rename to specifications/PaxosHowToWinATuringAward/MCPaxos.tla index 39ec77f0..09e3d3c9 100644 --- a/specifications/PaxosHowToWinATuringAward/Paxos.toolbox/TinyModel/MC.tla +++ b/specifications/PaxosHowToWinATuringAward/MCPaxos.tla @@ -1,6 +1,8 @@ ----- MODULE MC ---- +---- MODULE MCPaxos ---- EXTENDS Paxos, TLC +CONSTANT MaxBallot + \* MV CONSTANT declarations@modelParameterConstants CONSTANTS a1, a2, a3 @@ -28,11 +30,11 @@ const_1560336937634607000 == \* CONSTANT definition @modelParameterDefinitions:1 def_ov_1560336937634609000 == -0..1 +0..MaxBallot ---- \* CONSTANT definition @modelParameterDefinitions:2 def_ov_1560336937634610000 == -0..1 +0..MaxBallot ---- \* PROPERTY definition @modelCorrectnessProperties:0 prop_1560336937635612000 == diff --git a/specifications/PaxosHowToWinATuringAward/Paxos.toolbox/TinyModel/MC.cfg b/specifications/PaxosHowToWinATuringAward/MCPaxosSmall.cfg similarity index 89% rename from specifications/PaxosHowToWinATuringAward/Paxos.toolbox/TinyModel/MC.cfg rename to specifications/PaxosHowToWinATuringAward/MCPaxosSmall.cfg index 59b9774c..53a0208c 100644 --- a/specifications/PaxosHowToWinATuringAward/Paxos.toolbox/TinyModel/MC.cfg +++ b/specifications/PaxosHowToWinATuringAward/MCPaxosSmall.cfg @@ -1,4 +1,6 @@ \* MV CONSTANT declarations +CONSTANT +MaxBallot = 2 CONSTANTS a1 = a1 a2 = a2 @@ -30,4 +32,4 @@ Inv \* PROPERTY definition PROPERTY prop_1560336937635612000 -\* Generated on Wed Jun 12 03:55:37 PDT 2019 \ No newline at end of file +\* Generated on Wed Jun 12 03:55:37 PDT 2019 diff --git a/specifications/PaxosHowToWinATuringAward/Paxos.toolbox/SmallModel/MC.cfg b/specifications/PaxosHowToWinATuringAward/MCPaxosTiny.cfg similarity index 57% rename from specifications/PaxosHowToWinATuringAward/Paxos.toolbox/SmallModel/MC.cfg rename to specifications/PaxosHowToWinATuringAward/MCPaxosTiny.cfg index 6cab228a..520e0d69 100644 --- a/specifications/PaxosHowToWinATuringAward/Paxos.toolbox/SmallModel/MC.cfg +++ b/specifications/PaxosHowToWinATuringAward/MCPaxosTiny.cfg @@ -1,4 +1,6 @@ \* MV CONSTANT declarations +CONSTANT +MaxBallot = 1 CONSTANTS a1 = a1 a2 = a2 @@ -9,18 +11,18 @@ v1 = v1 v2 = v2 \* MV CONSTANT definitions CONSTANT -Acceptor <- const_1560353114150701000 +Acceptor <- const_1560336937634605000 \* MV CONSTANT definitions CONSTANT -Value <- const_1560353114150702000 +Value <- const_1560336937634606000 \* CONSTANT definitions CONSTANT -Quorum <- const_1560353114150703000 +Quorum <- const_1560336937634607000 \* CONSTANT definition CONSTANT None = None -Ballot <- def_ov_1560353114150705000 -Ballot <- [Voting]def_ov_1560353114150706000 +Ballot <- def_ov_1560336937634609000 +Ballot <- [Voting]def_ov_1560336937634610000 \* SPECIFICATION definition SPECIFICATION Spec @@ -29,5 +31,5 @@ INVARIANT Inv \* PROPERTY definition PROPERTY -prop_1560353114151708000 -\* Generated on Wed Jun 12 08:25:14 PDT 2019 \ No newline at end of file +prop_1560336937635612000 +\* Generated on Wed Jun 12 03:55:37 PDT 2019 diff --git a/specifications/PaxosHowToWinATuringAward/Voting.toolbox/SmallModel/MC.cfg b/specifications/PaxosHowToWinATuringAward/MCVoting.cfg similarity index 100% rename from specifications/PaxosHowToWinATuringAward/Voting.toolbox/SmallModel/MC.cfg rename to specifications/PaxosHowToWinATuringAward/MCVoting.cfg diff --git a/specifications/PaxosHowToWinATuringAward/Voting.toolbox/SmallModel/MC.tla b/specifications/PaxosHowToWinATuringAward/MCVoting.tla similarity index 96% rename from specifications/PaxosHowToWinATuringAward/Voting.toolbox/SmallModel/MC.tla rename to specifications/PaxosHowToWinATuringAward/MCVoting.tla index b3fe72b7..1e61ffe9 100644 --- a/specifications/PaxosHowToWinATuringAward/Voting.toolbox/SmallModel/MC.tla +++ b/specifications/PaxosHowToWinATuringAward/MCVoting.tla @@ -1,4 +1,4 @@ ----- MODULE MC ---- +---- MODULE MCVoting ---- EXTENDS Voting, TLC \* MV CONSTANT declarations@modelParameterConstants diff --git a/specifications/PaxosHowToWinATuringAward/Paxos.toolbox/.project b/specifications/PaxosHowToWinATuringAward/Paxos.toolbox/.project deleted file mode 100644 index 131b40b4..00000000 --- a/specifications/PaxosHowToWinATuringAward/Paxos.toolbox/.project +++ /dev/null @@ -1,34 +0,0 @@ - - - Paxos - - - - - - toolbox.builder.TLAParserBuilder - - - - - - toolbox.natures.TLANature - - - - Consensus.tla - 1 - PARENT-1-PROJECT_LOC/Consensus.tla - - - Paxos.tla - 1 - PARENT-1-PROJECT_LOC/Paxos.tla - - - Voting.tla - 1 - PARENT-1-PROJECT_LOC/Voting.tla - - - diff --git a/specifications/PaxosHowToWinATuringAward/Paxos.toolbox/.settings/org.lamport.tla.toolbox.prefs b/specifications/PaxosHowToWinATuringAward/Paxos.toolbox/.settings/org.lamport.tla.toolbox.prefs deleted file mode 100644 index 6119d2e6..00000000 --- a/specifications/PaxosHowToWinATuringAward/Paxos.toolbox/.settings/org.lamport.tla.toolbox.prefs +++ /dev/null @@ -1,2 +0,0 @@ -ProjectRootFile=PARENT-1-PROJECT_LOC/Paxos.tla -eclipse.preferences.version=1 diff --git a/specifications/PaxosHowToWinATuringAward/Paxos.toolbox/Paxos___SmallModel.launch b/specifications/PaxosHowToWinATuringAward/Paxos.toolbox/Paxos___SmallModel.launch deleted file mode 100644 index b146baa8..00000000 --- a/specifications/PaxosHowToWinATuringAward/Paxos.toolbox/Paxos___SmallModel.launch +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/specifications/PaxosHowToWinATuringAward/Paxos.toolbox/Paxos___TinyModel.launch b/specifications/PaxosHowToWinATuringAward/Paxos.toolbox/Paxos___TinyModel.launch deleted file mode 100644 index ef7f23b1..00000000 --- a/specifications/PaxosHowToWinATuringAward/Paxos.toolbox/Paxos___TinyModel.launch +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/specifications/PaxosHowToWinATuringAward/Paxos.toolbox/SmallModel/Consensus.tla b/specifications/PaxosHowToWinATuringAward/Paxos.toolbox/SmallModel/Consensus.tla deleted file mode 100644 index c08e445b..00000000 --- a/specifications/PaxosHowToWinATuringAward/Paxos.toolbox/SmallModel/Consensus.tla +++ /dev/null @@ -1,112 +0,0 @@ ------------------------------ MODULE Consensus ------------------------------ -(***************************************************************************) -(* This is an very abstract specification of the consensus problem, in *) -(* which a set of processes must choose a single value. We abstract away *) -(* even the processes. We specify the simple requirement that at most one *) -(* value is chosen by describing the set of all chosen values. The naive *) -(* requirement is that this set never contains more than one value, which *) -(* is an invariance property. But a little thought shows that this *) -(* requirement allows a value to be chosen then unchosen, and then another *) -(* value to be chosen. So we specify that the set of chosen values is *) -(* initially empty, it can be set to a single value, and then it can never *) -(* change. *) -(* *) -(* We are ignoring liveness, so we do not any requirement that a value is *) -(* eventually chosen. *) -(***************************************************************************) - -EXTENDS Naturals, FiniteSets - (*************************************************************************) - (* Imports standard modules that define operators of arithmetic on *) - (* natural numbers and the Cardinality operator, where Cardinality(S) is *) - (* the number of elements in the set S, if S is finite. *) - (*************************************************************************) -CONSTANT Value - (*************************************************************************) - (* The set of all values that can be chosen. *) - (*************************************************************************) -VARIABLE chosen - (*************************************************************************) - (* The set of all values that have been chosen. *) - (*************************************************************************) - -(***************************************************************************) -(* The type-correctness invariant asserting the "type" of the variable *) -(* 'chosen'. It isn't part of the spec itself--that is, the formula *) -(* describing the possible sequence of values that 'chosen' can have in a *) -(* behavior correct behavior of the system, but is an invariance property *) -(* that the spec should satisfy. *) -(***************************************************************************) -TypeOK == /\ chosen \subseteq Value - /\ IsFiniteSet(chosen) - -(***************************************************************************) -(* The initial predicate describing the possible initial state of *) -(* 'chosen'. *) -(***************************************************************************) -Init == chosen = {} - -(***************************************************************************) -(* The next-state relation describing how 'chosen' can change from one *) -(* step to the next. Note that is enabled (equals true for some next *) -(* value chosen' of choseen) if and only if chosen equals the empty set. *) -(***************************************************************************) -Next == /\ chosen = {} - /\ \E v \in Value : chosen' = {v} - -(***************************************************************************) -(* The TLA+ temporal formula that is the spec. *) -(***************************************************************************) -Spec == Init /\ [][Next]_chosen - ------------------------------------------------------------------------------ -(***************************************************************************) -(* The specification should imply the safety property that 'chosen' can *) -(* contain at most one value in any reachable state. This condition on *) -(* the state is expressed by Inv defined here. *) -(***************************************************************************) -Inv == /\ TypeOK - /\ Cardinality(chosen) \leq 1 - -(***************************************************************************) -(* The following theorem asserts the desired safety propert. Its proof *) -(* appears after the theorem. This proof is easily checked by the TLAPS *) -(* prover. *) -(***************************************************************************) -THEOREM Invariance == Spec => []Inv -<1>1. Init => Inv - -<1>2. Inv /\ [Next]_chosen => Inv' - -<1>3. QED - BY <1>1, <1>2 DEF Spec - -(***************************************************************************) -(* If you are reading this specification in the Toolbox as you should be *) -(* (either the source file or its pretty-printed version), then you have *) -(* already opened the specification in the Toolbox. If not, you should do *) -(* that now. Download and run the Toolbox. Open a new specification with *) -(* this module file (Consensus.tla) as the root file. Along with the *) -(* module, this will install a TLC model named 3Values. Open that model. *) -(* You will see that the model specifies three things: *) -(* *) -(* - The specification is formula Spec. *) -(* *) -(* - Three unspecified constants a, b, and c (called model values) *) -(* are substituted for the declared constants Values. *) -(* *) -(* - TLC should check that formula Inv is an invariant (a *) -(* formula true on all reachable states of he specification. *) -(* *) -(* Run TLC on the model. For this tiny spec, this just takes perhaps a *) -(* millisecond plus the couple of seconds that TLC needs to start and stop *) -(* running any spec. *) -(* *) -(* TLC's default setting to check for deadlock would cause it to report a *) -(* deadlock because no action is possible after a value is chosen. We *) -(* would say that the system terminated, but termination is just deadlock *) -(* that we want to happen, and the model tells TLC that we want deadlock *) -(* by disabling its check for it. *) -(***************************************************************************) - -============================================================================= diff --git a/specifications/PaxosHowToWinATuringAward/Paxos.toolbox/SmallModel/FiniteSets.tla b/specifications/PaxosHowToWinATuringAward/Paxos.toolbox/SmallModel/FiniteSets.tla deleted file mode 100644 index 57ac4023..00000000 --- a/specifications/PaxosHowToWinATuringAward/Paxos.toolbox/SmallModel/FiniteSets.tla +++ /dev/null @@ -1,23 +0,0 @@ ----------------------------- MODULE FiniteSets ----------------------------- -LOCAL INSTANCE Naturals -LOCAL INSTANCE Sequences - (*************************************************************************) - (* Imports the definitions from Naturals and Sequences, but doesn't *) - (* export them. *) - (*************************************************************************) - -IsFiniteSet(S) == - (*************************************************************************) - (* A set S is finite iff there is a finite sequence containing all its *) - (* elements. *) - (*************************************************************************) - \E seq \in Seq(S) : \A s \in S : \E n \in 1..Len(seq) : seq[n] = s - -Cardinality(S) == - (*************************************************************************) - (* Cardinality is defined only for finite sets. *) - (*************************************************************************) - LET CS[T \in SUBSET S] == IF T = {} THEN 0 - ELSE 1 + CS[T \ {CHOOSE x : x \in T}] - IN CS[S] -============================================================================= diff --git a/specifications/PaxosHowToWinATuringAward/Paxos.toolbox/SmallModel/MC.tla b/specifications/PaxosHowToWinATuringAward/Paxos.toolbox/SmallModel/MC.tla deleted file mode 100644 index 5ffae426..00000000 --- a/specifications/PaxosHowToWinATuringAward/Paxos.toolbox/SmallModel/MC.tla +++ /dev/null @@ -1,43 +0,0 @@ ----- MODULE MC ---- -EXTENDS Paxos, TLC - -\* MV CONSTANT declarations@modelParameterConstants -CONSTANTS -a1, a2, a3 ----- - -\* MV CONSTANT declarations@modelParameterConstants -CONSTANTS -v1, v2 ----- - -\* MV CONSTANT definitions Acceptor -const_1560353114150701000 == -{a1, a2, a3} ----- - -\* MV CONSTANT definitions Value -const_1560353114150702000 == -{v1, v2} ----- - -\* CONSTANT definitions @modelParameterConstants:1Quorum -const_1560353114150703000 == -{{a1, a2}, {a1, a3}, {a2, a3}} ----- - -\* CONSTANT definition @modelParameterDefinitions:1 -def_ov_1560353114150705000 == -0..2 ----- -\* CONSTANT definition @modelParameterDefinitions:2 -def_ov_1560353114150706000 == -0..2 ----- -\* PROPERTY definition @modelCorrectnessProperties:0 -prop_1560353114151708000 == -V!Spec ----- -============================================================================= -\* Modification History -\* Created Wed Jun 12 08:25:14 PDT 2019 by lamport diff --git a/specifications/PaxosHowToWinATuringAward/Paxos.toolbox/SmallModel/Paxos.tla b/specifications/PaxosHowToWinATuringAward/Paxos.toolbox/SmallModel/Paxos.tla deleted file mode 100644 index 9d8b9184..00000000 --- a/specifications/PaxosHowToWinATuringAward/Paxos.toolbox/SmallModel/Paxos.tla +++ /dev/null @@ -1,389 +0,0 @@ --------------------------------- MODULE Paxos ------------------------------- -(***************************************************************************) -(* This is a high-level specification of the Paxos consensus algorithm. *) -(* It refines the spec in module Voting, which you should read before *) -(* reading this module. In the Paxos consensus algorithm, acceptors *) -(* communicate by sending messages. There are additional processes called *) -(* leaders. The specification here essentially considers there to be a *) -(* separate leader for each ballot number. We can consider "leader" to be *) -(* a role, where in an implementation there will be a finite number of *) -(* leader processes each of which plays infinitely many of these leader *) -(* roles. *) -(* *) -(* Note: The algorithm described here is the Paxos consensus algorithm. *) -(* It is the crucial component of the Paxos algorithm, which implements a *) -(* fault-tolerant state machine using a sequence of instances of the *) -(* consensus algorithm. The Paxos algorithm is sometimes called *) -(* MultiPaxos, with the Paxos consensus algorithm being incorrectly called *) -(* the Paxos algorithm. I'm afraid I have contributed to this confusion *) -(* by being lazy and calling the module "Paxos" instead of *) -(* "PaxosConsensus". But incarnations of this module have already *) -(* appeared, so I'm reluctant to change its name now. *) -(***************************************************************************) - -EXTENDS Integers - -(***************************************************************************) -(* The constants and the assumptions about them are the same as for the *) -(* Voting algorithm. However, the second conjunct of the assumption, *) -(* which asserts that any two quorums have a non-empty intersection, is *) -(* not needed for the Paxos consensus algorithm to implement the Voting *) -(* algorithm. The Voting algorithm, and it, do not satisfy consensus *) -(* without that assumption. *) -(***************************************************************************) -CONSTANTS Value, Acceptor, Quorum - -ASSUME /\ \A Q \in Quorum : Q \subseteq Acceptor - /\ \A Q1, Q2 \in Quorum : Q1 \cap Q2 /= {} - -Ballot == Nat - -None == CHOOSE v : v \notin Ballot - (*************************************************************************) - (* This defines None to be an unspecified value that is not a ballot *) - (* number. *) - (*************************************************************************) - -(***************************************************************************) -(* We now define Message toe be the set of all possible messages that can *) -(* be sent in the algorithm. In TLA+, the expression *) -(* *) -(* (1) [type |-> "1a", bal |-> b] *) -(* *) -(* is a record r with two components, a `type'component, r.type, that *) -(* equals "1a" and whose bal component, r.bal, that equals b. The *) -(* expression *) -(* *) -(* (2) [type : {"1a"}, bal : Ballot] *) -(* *) -(* is the set of all records r with a components `type' and bal such that *) -(* r.type is an element of {"1a"} and r.bal is an element of Ballot. *) -(* Since "1a" is the only element of {"1a"}, formula (2) is the set of all *) -(* elements (1) such that b \in Ballot. *) -(* *) -(* The function of each type of message in the set Message is explained *) -(* below with the action that can send it. *) -(***************************************************************************) -Message == - [type : {"1a"}, bal : Ballot] - \cup [type : {"1b"}, acc : Acceptor, bal : Ballot, - mbal : Ballot \cup {-1}, mval : Value \cup {None}] - \cup [type : {"2a"}, bal : Ballot, val : Value] - \cup [type : {"2b"}, acc : Acceptor, bal : Ballot, val : Value] ------------------------------------------------------------------------------ -(***************************************************************************) -(* We now declare the following variables: *) -(* *) -(* maxBal - Is the same as the variable of that name in the Voting *) -(* algorithm. *) -(* *) -(* maxVBal *) -(* maxVal - As in the Voting algorithm, a vote is a <> *) -(* pair. The pair <> if a has not cast any vote. *) -(* *) -(* msgs - The set of all messages that have been sent. *) -(* *) -(* Messages are added to msgs when they are sent and are never removed. *) -(* An operation that is performed upon receipt of a message is represented *) -(* by an action that is enabled when the message is in msgs. This *) -(* simplifies the spec in the following ways: *) -(* *) -(* - A message can be broadcast to multiple recipients by just adding *) -(* (a single copy of) it to msgs. *) -(* *) -(* - Never removing the message automatically allows the possibility of *) -(* the same message being received twice. *) -(* *) -(* Since we are considering only safety, there is no need to explicitly *) -(* model message loss. The safety part of the spec says only what *) -(* messages may be received and does not assert that any message actually *) -(* is received. Thus, there is no difference between a lost message and *) -(* one that is never received. *) -(***************************************************************************) -VARIABLES maxBal, maxVBal, maxVal, msgs -vars == <> - (*************************************************************************) - (* It's convenient to name the tuple of all variables in a spec. *) - (*************************************************************************) - -(***************************************************************************) -(* The invariant that describes the "types" of the variables. *) -(***************************************************************************) -TypeOK == /\ maxBal \in [Acceptor -> Ballot \cup {-1}] - /\ maxVBal \in [Acceptor -> Ballot \cup {-1}] - /\ maxVal \in [Acceptor -> Value \cup {None}] - /\ msgs \subseteq Message - -(***************************************************************************) -(* The initial predicate should be obvious from the descriptions of the *) -(* variables given above. *) -(***************************************************************************) -Init == /\ maxBal = [a \in Acceptor |-> -1] - /\ maxVBal = [a \in Acceptor |-> -1] - /\ maxVal = [a \in Acceptor |-> None] - /\ msgs = {} ----------------------------------------------------------------------------- -(***************************************************************************) -(* We now define the subactions of the next-state actions. We begin by *) -(* defining an action that will be used in those subactions. The action *) -(* Send(m) asserts that message m is added to the set msgs. *) -(***************************************************************************) -Send(m) == msgs' = msgs \cup {m} - -(***************************************************************************) -(* The ballot b leader can perform actions Phase1a(b) and Phase2a(b). In *) -(* the Phase1a(b) action, it sends to all acceptors a phase 1a message (a *) -(* message m with m.type = "1a") that begins ballot b. Remember that the *) -(* same process can perform the role of leader for many different ballot *) -(* numbers b. In practice, it will stop playing the role of leader of *) -(* ballot b when it begins a higher-numbered ballot. (Remember the *) -(* definition of [type |-> "1a", bal |-> b] from the comment preceding the *) -(* definition of Message.) *) -(***************************************************************************) -Phase1a(b) == /\ Send([type |-> "1a", bal |-> b]) - /\ UNCHANGED <> - (************************************************************************) - (* Note that there is no enabling condition to prevent sending the *) - (* phase 1a message a second time. Since messages are never removed *) - (* from msg, performing the action a second time leaves msg and all the *) - (* other spec variables unchanged, so it's a stuttering step. Since *) - (* stuttering steps are always allowed, there's no reason to try to *) - (* prevent them. *) - (************************************************************************) - -(***************************************************************************) -(* Upon receipt of a ballot b phase 1a message, acceptor a can perform a *) -(* Phase1b(a) action only if b > maxBal[a]. The action sets maxBal[a] to *) -(* b and sends a phase 1b message to the leader containing the values of *) -(* maxVBal[a] and maxVal[a]. This action implements the *) -(* IncreaseMaxBal(a,b) action of the Voting algorithm for b = m.bal. *) -(***************************************************************************) -Phase1b(a) == - /\ \E m \in msgs : - /\ m.type = "1a" - /\ m.bal > maxBal[a] - /\ maxBal' = [maxBal EXCEPT ![a] = m.bal] - /\ Send([type |-> "1b", acc |-> a, bal |-> m.bal, - mbal |-> maxVBal[a], mval |-> maxVal[a]]) - /\ UNCHANGED <> - -(***************************************************************************) -(* In the Phase2a(b, v) action, the ballot b leader sends a type "2a" *) -(* message asking the acceptors to vote for v in ballot number b. The *) -(* enabling conditions of the action--its first two conjuncts--ensure that *) -(* three of the four enabling conditions of action VoteFor(a, b, v) in *) -(* module Voting will be true when acceptor a receives that message. *) -(* Those three enabling conditions are the second through fourth conjuncts *) -(* of that action. *) -(* *) -(* The first conjunct of Phase2a(b, v) asserts that at most one phase 2a *) -(* message is ever sent for ballot b. Since an acceptor will vote for a *) -(* value in ballot b only when it receives the appropriate phase 2a *) -(* message, the phase 2a message sent by this action this ensures that *) -(* these two enabling conjuncts of VoteFor(a,b,v) will be true forever: *) -(* *) -(* /\ \A vt \in votes[a] : vt[1] /= b *) -(* /\ \A c \in Acceptor \ {a} : *) -(* \A vt \in votes[c] : (vt[1] = b) => (vt[2] = v) *) -(* *) -(* The second conjunct of the Phase2a(b, v) action is the heart of the *) -(* Paxos consensus algorithm. It's a bit complicated, but I've tried a *) -(* number of times to write it in English, and it's much easier to *) -(* understand when written in mathematics. The LET/IN construct locally *) -(* defines Q1 to be the set of phase 1b messages sent in ballot number b *) -(* by acceptors in quorum Q; and it defines Q1bv to be the subset of those *) -(* messages indicating that the sender had voted in some ballot (which *) -(* must have been numbered less than b). You should study the IN clause *) -(* to convince yourself that it equals ShowsSafeAt(Q, b, v), defined in *) -(* module Voting, using the values of maxBal[a], maxVBal[a], and maxVal[a] *) -(* `a' sent in its phase 1b message to describe what votes it had cast *) -(* when it sent that message. Moreover, since `a' will no longer cast any *) -(* votes in ballots numbered less than b, the IN clause implies that *) -(* ShowsSafeAt(Q, b, v) is still true and will remain true forever. *) -(* Hence, this conjunct of Phase2a(b, v) checks the enabling condition *) -(* *) -(* /\ \E Q \in Quorum : ShowsSafeAt(Q, b, v) *) -(* *) -(* of module Voting's VoteFor(a, b, v) action. *) -(* *) -(* The type "2a" message sent by this action therefore tells every *) -(* acceptor `a' that, when it receives the message, all the enabling *) -(* conditions of VoteFor(a, b, v) but the first, maxBal[a] =< b, are *) -(* satisfied. *) -(***************************************************************************) -Phase2a(b, v) == - /\ ~ \E m \in msgs : m.type = "2a" /\ m.bal = b - /\ \E Q \in Quorum : - LET Q1b == {m \in msgs : /\ m.type = "1b" - /\ m.acc \in Q - /\ m.bal = b} - Q1bv == {m \in Q1b : m.mbal >= 0} - IN /\ \A a \in Q : \E m \in Q1b : m.acc = a - /\ \/ Q1bv = {} - \/ \E m \in Q1bv : - /\ m.mval = v - /\ \A mm \in Q1bv : m.mbal >= mm.mbal - /\ Send([type |-> "2a", bal |-> b, val |-> v]) - /\ UNCHANGED <> - - -(***************************************************************************) -(* The Phase2b(a) action describes what acceptor `a' does when it receives *) -(* a phase 2a message m, which is sent by the leader of ballot m.bal *) -(* asking acceptors to vote for m.val in that ballot. Acceptor `a' acts *) -(* on that request, voting for m.val in ballot number m.bal, iff m.bal >= *) -(* maxBal[a], which means that `a' has not participated in any ballot *) -(* numbered greater than m.bal. Thus, this enabling condition of the *) -(* Phase2b(a) action together with the receipt of the phase 2a message m *) -(* implies that the VoteFor(a, m.bal, m.val) action of module Voting is *) -(* enabled and can be executed. The Phase2b(a) message updates maxBal[a], *) -(* maxVBal[a], and maxVal[a] so their values mean what they were claimed *) -(* to mean in the comments preceding the variable declarations. *) -(***************************************************************************) -Phase2b(a) == - \E m \in msgs : - /\ m.type = "2a" - /\ m.bal >= maxBal[a] - /\ maxBal' = [maxBal EXCEPT ![a] = m.bal] - /\ maxVBal' = [maxVBal EXCEPT ![a] = m.bal] - /\ maxVal' = [maxVal EXCEPT ![a] = m.val] - /\ Send([type |-> "2b", acc |-> a, - bal |-> m.bal, val |-> m.val]) - -(***************************************************************************) -(* The definitions of Next and Spec are what we expect them to be. *) -(***************************************************************************) -Next == \/ \E b \in Ballot : \/ Phase1a(b) - \/ \E v \in Value : Phase2a(b, v) - \/ \E a \in Acceptor : Phase1b(a) \/ Phase2b(a) - -Spec == Init /\ [][Next]_vars ----------------------------------------------------------------------------- -(***************************************************************************) -(* We define `votes' to be the function such that votes[a] is the set of *) -(* pairs <> such that acceptor `a' has voted for v in ballot number *) -(* b by sending executing the Phase2b(a) action to send the appropriate *) -(* type "2b" message. The Paxos consensus algorithm implements the Voting *) -(* algorithm by implementing the variable `votes' of module Voting with *) -(* the expression `votes' of the current module, and implementing the *) -(* variable maxBal of module Voting with the variable of the same name of *) -(* the current module. *) -(***************************************************************************) -votes == - [a \in Acceptor |-> - {<> : m \in {mm \in msgs: /\ mm.type = "2b" - /\ mm.acc = a }}] -(***************************************************************************) -(* The following INSTANCE statement omits the redundant clause *) -(* *) -(* WITH votes <- votes, maxBal <- maxBal, *) -(* Value <- Value, Acceptor <- Acceptor, Quorum <- Quorum *) -(***************************************************************************) -V == INSTANCE Voting - -(***************************************************************************) -(* The inductive invariant Inv explains why the Paxos consensus algorithm *) -(* implements the Voting algorithm. It is defined after the INSTANCE *) -(* statement because it uses the operator V!ShowsSafeAt imported by that *) -(* statement. *) -(***************************************************************************) -Inv == - /\ TypeOK - /\ \A a \in Acceptor : maxBal[a] >= maxVBal[a] - /\ \A a \in Acceptor : IF maxVBal[a] = -1 - THEN maxVal[a] = None - ELSE <> \in votes[a] - /\ \A m \in msgs : - /\ (m.type = "1b") => /\ maxBal[m.acc] >= m.bal - /\ (m.mbal >= 0) => - <> \in votes[m.acc] - /\ (m.type = "2a") => /\ \E Q \in Quorum : - V!ShowsSafeAt(Q, m.bal, m.val) - /\ \A mm \in msgs : /\ mm.type ="2a" - /\ mm.bal = m.bal - => mm.val = m.val - /\ (m.type = "2b") => /\ maxVBal[m.acc] >= m.bal - /\ \E mm \in msgs : /\ mm.type = "2a" - /\ mm.bal = m.bal - /\ mm.val = m.val - -(***************************************************************************) -(* The following two theorems assert that Inv is an invariant of *) -(* the Paxos cconsensus algorithm and that this algorithm implements *) -(* the Voting algorithm with the declared variables and constants *) -(* of that algorithm implemented by the correspondingly-named expressions *) -(* in the current module. *) -(***************************************************************************) -THEOREM Invariance == Spec => []Inv - -THEOREM Implementation == Spec => V!Spec - -(***************************************************************************) -(* The ASSUME statement of this module trivial implies trivially implies *) -(* the instantiated version of the ASSUME statement of module Voting. *) -(* (Because the INSTANCE statement substitutes the constants of the *) -(* current module for the constants of the same name in module Voting, the *) -(* imported assumption is the same as the assumption of the current *) -(* module.) Hence, this theorem imported from module Voting is true in the *) -(* current module *) -(* *) -(* THEOREM V!Implementation == V!Spec => V!C!Spec *) -(* *) -(* Theorems Implementation and V!Implementation imply *) -(* *) -(* THEOREM Spec => V!C!Spec *) -(* *) -(* This theorem asserts that the Paxos consensus algorithm implements the *) -(* Consensus specification by substituting for the variable `chosen' of *) -(* the Consensus specification the value V!chosen of the current module. *) -(* The expression V!chosen is obtained by substituting the expression *) -(* `votes' of the current module for the variable `votes' of module Voting *) -(* in the expression `chosen' of module Voting. *) -(* *) -(* In other words, as we should expect, "implements" is a transitive *) -(* relation--under a suitable understanding of what transitivity means in *) -(* this situation. *) -(***************************************************************************) - -(**************************************************************************** -This current module is distributed with two models, TinyModel and -SmallModel. SmallModel is the same as the model by that name for the -Voting specification. TinyModel is the same except it defines Ballot -to contain only two elements. Run TLC on these models. You should -find that it takes a couple of seconds to run TinyModel and two or -three minutes to run SmallModel. - -Next, try the same thing you did with the Voting algorithm: Modify the -models so the assumption that any pair of quorums has an element in -common is no longer true. This time, running TLC will not find an -error. The correctness of theorems Invariance and Implementation does -not depend on that assumption. The Paxos consensus algorithm still -correctly implements the Voting algorithm; but the Voting algorithm is -incorrect if the assumption does not hold. - -Now go back to the original SmallModel, in which the quorum assumption -holds. - -When you have other things to do while TLC is running, try -increasing the size of the model a very little bit at a time and see -how the running time increases. You'll find that it increases -exponentially with the size of the model. - -Fortunately, exhaustively checking a small model is very effective at -finding errors. Since the Paxos consensus algorithm has been proved -correct, and that proof has been read by many people, I'm sure that the -basic algorithm is correct. Checking this spec on SmallModel makes me -quite confident that there are no "coding errors" in this TLA+ -specification of the algorithm. - -For checking safety properties, TLC can obtain close to linear speedup -using dozens of processors. After designing a new distributed -algorithm, you will have plenty of time to run TLC while the algorithm -is being implemented and the implementation tested. Use that time to -run it for as long as you can on the largest machine(s) that you can. -Testing the implementation is unlikely to find subtle errors in the -algorithm. -****************************************************************************) -============================================================================ diff --git a/specifications/PaxosHowToWinATuringAward/Paxos.toolbox/SmallModel/Voting.tla b/specifications/PaxosHowToWinATuringAward/Paxos.toolbox/SmallModel/Voting.tla deleted file mode 100644 index 6a6892c8..00000000 --- a/specifications/PaxosHowToWinATuringAward/Paxos.toolbox/SmallModel/Voting.tla +++ /dev/null @@ -1,315 +0,0 @@ ------------------------------- MODULE Voting ------------------------------- -(***************************************************************************) -(* This is a high-level algorithm in which a set of processes *) -(* cooperatively choose a value. It is a high-level abstraction of the *) -(* Paxos consensus algorithm. Although I don't remember exactly what went *) -(* through my mind when I invented/discovered that algorithm, I'm pretty *) -(* sure that this spec formalizes the way I first thought of the *) -(* algorithm. It would have been very hard to find this algorithm had my *) -(* mind been distracted by the irrelevant details introduced by having the *) -(* processes communicate by messages. *) -(***************************************************************************) -EXTENDS Integers - -(***************************************************************************) -(* For historical reasons, the processes that choose a value are called *) -(* acceptors. We now declare the set Value of values, the set Acceptors *) -(* of acceptors, and another set Quorum that is a set of sets of acceptors *) -(* called quorums. *) -(***************************************************************************) -CONSTANTS Value, Acceptor, Quorum - -(***************************************************************************) -(* The following assumption asserts that Quorum is a set of subsets of the *) -(* set Acceptor, and that any two elements of Quorum have at least one *) -(* element (an acceptor) in common. Think of a quorum as a set consisting *) -(* of a majority (more than half) of the acceptors. *) -(***************************************************************************) -ASSUME /\ \A Q \in Quorum : Q \subseteq Acceptor - /\ \A Q1, Q2 \in Quorum : Q1 \cap Q2 /= {} - -(***************************************************************************) -(* Ballot is a set of "ballot numbers". For simplicity, we let it be the *) -(* set of natural numbers. However, we write Ballot for that set to *) -(* distinguish ballots from natural numbers used for other purposes. *) -(***************************************************************************) -Ballot == Nat ------------------------------------------------------------------------------ -(***************************************************************************) -(* The algorithm works by having acceptors cast votes in numbered ballots. *) -(* Each acceptor can cast one or more votes, where each vote cast by an *) -(* acceptor has the form <> indicating that the acceptor has voted *) -(* for value v in ballot number b. A value is chosen if a quorum of *) -(* acceptors have voted for it in the same ballot. *) -(* *) -(* We now declare the algorithm's variables 'votes' and 'maxBal'. For *) -(* each acceptor a, he value of votes[a] is the set of votes cast by `a'; *) -(* and maxBal[a] is an integer such that `a' will never cast any further *) -(* vote in a ballot numbered less than maxBal[a]. *) -(***************************************************************************) -VARIABLES votes, maxBal - -(***************************************************************************) -(* TypeOK asserts the "types" of the two variables. They are both *) -(* functions with domain Acceptor (arrays indexed by acceptors). For any *) -(* acceptor a, the value of votes[a] a set of <> pairs; and *) -(* the value of maxBal[a] is either a ballot number or -1. *) -(***************************************************************************) -TypeOK == - /\ votes \in [Acceptor -> SUBSET (Ballot \X Value)] - /\ maxBal \in [Acceptor -> Ballot \cup {-1}] - -(***************************************************************************) -(* Next comes a sequence of definitions of concepts used to explain the *) -(* algorithm. *) -(***************************************************************************) -VotedFor(a, b, v) == <> \in votes[a] - (************************************************************************) - (* True iff (if and only if) acceptor a has votted for value v in *) - (* ballot number b. *) - (************************************************************************) - -ChosenAt(b, v) == - \E Q \in Quorum : \A a \in Q : VotedFor(a, b, v) - (************************************************************************) - (* True iff a quorum of acceptors have all voted for value v in ballot *) - (* number b. *) - (************************************************************************) - -chosen == {v \in Value : \E b \in Ballot : ChosenAt(b, v)} - (************************************************************************) - (* Defines `chosen' to be the set of all values v for which ChosenAt(b, *) - (* v) is true for some ballot number b. This is the definition of what *) - (* it means for a value to be chosen under which the Voting algorithm *) - (* implements the Consensus specification. *) - (************************************************************************) - -DidNotVoteAt(a, b) == \A v \in Value : ~ VotedFor(a, b, v) - (************************************************************************) - (* True iff acceptor `a' has not voted in ballot number . *) - (************************************************************************) - -CannotVoteAt(a, b) == /\ maxBal[a] > b - /\ DidNotVoteAt(a, b) - (************************************************************************) - (* The algorithm will not allow acceptor `a' to vote in ballot number b *) - (* if maxBal[a] > b. Hence, CannotVoteAt(a, b) implies that `a' has *) - (* not and never will vote in ballot number b. *) - (************************************************************************) - -NoneOtherChoosableAt(b, v) == - \E Q \in Quorum : - \A a \in Q : VotedFor(a, b, v) \/ CannotVoteAt(a, b) - (************************************************************************) - (* This is true iff there is some quorum Q such that each acceptor `a' *) - (* in Q either has voted for v in ballot b or has not and never will *) - (* vote in ballot b. It implies that no value other than v has been or *) - (* ever can be chosen at ballot b. This is because for a value w to be *) - (* chosen at ballot b, all the acceptors in some quorum R must have *) - (* voted for w in ballot b. But any two ballots have an acceptor in *) - (* common, so some acceptor a in R that voted for w is in Q, and an *) - (* acceptor in Q can only have voted for v, so w must equal v. *) - (************************************************************************) - -SafeAt(b, v) == \A c \in 0..(b-1) : NoneOtherChoosableAt(c, v) - (************************************************************************) - (* True iff no value other than v has been or ever will be chosen in *) - (* any ballot numbered less than b. We read SafeAt(b, v) as "v is safe *) - (* at b". *) - (************************************************************************) - -(***************************************************************************) -(* This theorem asserts that every value is safe at ballot 0. *) -(***************************************************************************) -THEOREM AllSafeAtZero == \A v \in Value : SafeAt(0, v) - -(***************************************************************************) -(* The following theorem asserts that NoneOtherChoosableAt means what it's *) -(* name implies. The comments after its definition essentially contain a *) -(* proof of this theorem. *) -(***************************************************************************) -THEOREM ChoosableThm == - \A b \in Ballot, v \in Value : - ChosenAt(b, v) => NoneOtherChoosableAt(b, v) - -(***************************************************************************) -(* Now comes the definition of the inductive invariant Inv that *) -(* essentially explains why the algorithm is correct. *) -(***************************************************************************) -OneValuePerBallot == - \A a1, a2 \in Acceptor, b \in Ballot, v1, v2 \in Value : - VotedFor(a1, b, v1) /\ VotedFor(a2, b, v2) => (v1 = v2) - (************************************************************************) - (* This formula asserts that if any acceptors a1 and a2 have voted in a *) - (* ballot b, then they voted for the same value in ballot b. For *) - (* a1=a2, this implies that an acceptor can vote for at most one value *) - (* in any ballot. *) - (************************************************************************) - -VotesSafe == \A a \in Acceptor, b \in Ballot, v \in Value : - VotedFor(a, b, v) => SafeAt(b, v) - (************************************************************************) - (* This formula asserts that an acceptors can have voted in a ballot b *) - (* only if that value is safe at b. *) - (************************************************************************) - -(***************************************************************************) -(* The algorithm is essentially derived by ensuring that this formula Inv *) -(* is always true. *) -(***************************************************************************) -Inv == TypeOK /\ VotesSafe /\ OneValuePerBallot - -(***************************************************************************) -(* This definition is used in the defining the algorithm. You should *) -(* study it and make sure you understand what it says. *) -(***************************************************************************) -ShowsSafeAt(Q, b, v) == - /\ \A a \in Q : maxBal[a] >= b - /\ \E c \in -1..(b-1) : - /\ (c /= -1) => \E a \in Q : VotedFor(a, c, v) - /\ \A d \in (c+1)..(b-1), a \in Q : DidNotVoteAt(a, d) - -(***************************************************************************) -(* This is the theorem that's at the heart of the algorithm. It shows *) -(* that if the algorithm has maintained the invariance of Inv, then the *) -(* truth of ShowsSafeAt(Q, b, v) for some quorum Q ensures that v is safe *) -(* at b, so the algorithm can let an acceptor vote for v in ballot b *) -(* knowing VotesSafe will be preserved. *) -(***************************************************************************) -THEOREM ShowsSafety == - Inv => \A Q \in Quorum, b \in Ballot, v \in Value : - ShowsSafeAt(Q, b, v) => SafeAt(b, v) ------------------------------------------------------------------------------ -(***************************************************************************) -(* Finally, we get to the definition of the algorithm. The initial *) -(* predicate is obvious. *) -(***************************************************************************) -Init == /\ votes = [a \in Acceptor |-> {}] - /\ maxBal = [a \in Acceptor |-> -1] - -(***************************************************************************) -(* An acceptor `a' can increase maxBal[a] at any time. *) -(***************************************************************************) -IncreaseMaxBal(a, b) == - /\ b > maxBal[a] - /\ maxBal' = [maxBal EXCEPT ![a] = b] - /\ UNCHANGED votes - -(***************************************************************************) -(* The heart of the algorithm is the action in which an acceptor `a' votes *) -(* for a value v in ballot number b. The enabling condition contains the *) -(* following conjuncts, which ensure that the invariance of Inv is *) -(* maintained. *) -(* *) -(* - `a' cannot vote in a ballot numbered less than b *) -(* *) -(* - `a' cannot already have voted in ballot number b *) -(* *) -(* - No other acceptor can have voted for a value other than v *) -(* in ballot b. *) -(* *) -(* - Uses Theorem ShowsSafety to ensure that v is safe at b. *) -(* *) -(* In TLA+, a tuple t is a function (array) whose first element is t[1], *) -(* whose second element if t[2], and so on. Thus, a vote vt is the pair *) -(* <> *) -(***************************************************************************) -VoteFor(a, b, v) == - /\ maxBal[a] =< b - /\ \A vt \in votes[a] : vt[1] /= b - /\ \A c \in Acceptor \ {a} : - \A vt \in votes[c] : (vt[1] = b) => (vt[2] = v) - /\ \E Q \in Quorum : ShowsSafeAt(Q, b, v) - /\ votes' = [votes EXCEPT ![a] = votes[a] \cup {<>}] - /\ maxBal' = [maxBal EXCEPT ![a] = b] - -(***************************************************************************) -(* The rest of the spec is straightforward. *) -(***************************************************************************) -Next == \E a \in Acceptor, b \in Ballot : - \/ IncreaseMaxBal(a, b) - \/ \E v \in Value : VoteFor(a, b, v) - -Spec == Init /\ [][Next]_<> ------------------------------------------------------------------------------ -(***************************************************************************) -(* This theorem asserts that Inv is an invariant of the algorithm. The *) -(* high-level steps in its proof are given. *) -(***************************************************************************) -THEOREM Invariance == Spec => []Inv -<1>1. Init => Inv - -<1>2. Inv /\ [Next]_<> => Inv' - -<1>3. QED - BY <1>1, <1>2 DEF Spec ------------------------------------------------------------------------------ -(***************************************************************************) -(* This INSTANCE statement imports definitions from module Consensus into *) -(* the current module. All definition in module Consensus can be expanded *) -(* to definitions containing only TLA+ primitives and the declared names *) -(* Value and chosen. To import a definition from Consensus into the *) -(* current module, we have to say what expressions from the current module *) -(* are substituted for Value and chosen. The INSTANCE statement says that *) -(* expressions of the same name are substituted for them. (Because of *) -(* this, the WITH statement is redundant.) Note that in both modules, *) -(* Value is just a declared constant. However, in the current module, *) -(* `chosen' is an expression defined in terms of the variables votes and *) -(* maxBal while it is a variable in module consensus. The "C! ==" in the *) -(* statement means that defined identifiers are imported with "C!" *) -(* prepended to their names. Thus Spec of module Consensus is imported, *) -(* with these substitutions, as C!Spec. *) -(***************************************************************************) -C == INSTANCE Consensus - WITH Value <- Value, chosen <- chosen - -(***************************************************************************) -(* The following theorem asserts that the Voting algorithm implements the *) -(* Consensus specification, where the expression `chosen' of the current *) -(* module implements the variable `chosen' of Consensus. The high-level *) -(* steps of the the proof are also given. *) -(***************************************************************************) -THEOREM Implementation == Spec => C!Spec -<1>1. Init => C!Init - -<1>2. Inv /\ Inv' /\ [Next]_<> => [C!Next]_chosen - -<1>3. QED - BY <1>1, <1>2, Invariance DEF Spec, C!Spec - -(***************************************************************************) -(* This Voting specification comes with a TLC model named SmallModel. *) -(* That model tells TLC that Spec is the specification, that Acceptor and *) -(* Values should equal sets of model values with 3 acceptors and 2 values *) -(* and Quorums should equal the indicated set of values, and that it *) -(* should check theorems Invariance and Implementation. Observe that you *) -(* can't tell TLC simply to check those theorems; you have to tell TLC to *) -(* check the properties the theorems assert that Spec satisfies. (Instead *) -(* of telling TLC that Inv should be an invariant, you can tell it that *) -(* the spec should satisfy the temporal property []Inv.) *) -(* *) -(* Even though the constants are finite sets, the spec has infinitely many *) -(* reachable sets because a ballot number can be any element of the set *) -(* Nat of natural numbers. The model modifies the spec so it has a finite *) -(* set of reachable states by using a definition override (on the Spec *) -(* Options page) to redefine Ballot to equal 0..2. (Alternatively, we *) -(* could override the definition of Nat to equal 0..2.) *) -(* *) -(* Run TLC on the model. It should just take a couple of seconds. *) -(* *) -(* After doing that, show why the assumption that any pair of quorums has *) -(* an element in common is necessary by modifying the model so that *) -(* assumption doesn't hold. (It's best to clone SmallModel and modify the *) -(* clone.) Since TLC reports an error if an assumption isn't true, you *) -(* will have to comment out the second conjunct of the ASSUME statement, *) -(* which asserts that assumption. Comments can be written as follows: *) -(* *) -(* \* This is an end-of-line comment. *) -(* *) -(* (* This is another way to write a comment. *) -(* Note that comments can be nested. *) *) -(* *) -(* To help you see what the problem is, use the Trace Explorer on the *) -(* Error page to show the value of `chosen' in each state of the trace. *) -(***************************************************************************) -============================================================================= diff --git a/specifications/PaxosHowToWinATuringAward/Paxos.toolbox/TinyModel/Consensus.tla b/specifications/PaxosHowToWinATuringAward/Paxos.toolbox/TinyModel/Consensus.tla deleted file mode 100644 index e5a95cfd..00000000 --- a/specifications/PaxosHowToWinATuringAward/Paxos.toolbox/TinyModel/Consensus.tla +++ /dev/null @@ -1,98 +0,0 @@ ------------------------------ MODULE Consensus ------------------------------ -(***************************************************************************) -(* This is an very abstract specification of the consensus problem, in *) -(* which a set of processes must choose a single value. We abstract away *) -(* even the processes. We specify the simple requirement that at most one *) -(* value is chosen by describing the set of all chosen values. The naive *) -(* requirement is that this set never contains more than one value, which *) -(* is an invariance property. But a little thought shows that this *) -(* requirement allows a value to be chosen then unchosen, and then another *) -(* value to be chosen. So we specify that the set of chosen values is *) -(* initially empty, it can be set to a single value, and then it can never *) -(* change. *) -(* *) -(* We are ignoring liveness, so we do not any requirement that a value is *) -(* eventually chosen. *) -(***************************************************************************) - -EXTENDS Naturals, FiniteSets - (*************************************************************************) - (* Imports standard modules that define operators of arithmetic on *) - (* natural numbers and the Cardinality operator, where Cardinality(S) is *) - (* the number of elements in the set S, if S is finite. *) - (*************************************************************************) -CONSTANT Value - (*************************************************************************) - (* The set of all values that can be chosen. *) - (*************************************************************************) -VARIABLE chosen - (*************************************************************************) - (* The set of all values that have been chosen. *) - (*************************************************************************) - -(***************************************************************************) -(* The type-correctness invariant asserting the "type" of the variable *) -(* 'chosen'. It isn't part of the spec itself--that is, the formula *) -(* describing the possible sequence of values that 'chosen' can have in a *) -(* behavior correct behavior of the system, but is an invariance property *) -(* that the spec should satisfy. *) -(***************************************************************************) -TypeOK == /\ chosen \subseteq Value - /\ IsFiniteSet(chosen) - -(***************************************************************************) -(* The initial predicate describing the possible initial state of *) -(* 'chosen'. *) -(***************************************************************************) -Init == chosen = {} - -(***************************************************************************) -(* The next-state relation describing how 'chosen' can change from one *) -(* step to the next. Note that is enabled (equals true for some next *) -(* value chosen' of choseen) if and only if chosen equals the empty set. *) -(***************************************************************************) -Next == /\ chosen = {} - /\ \E v \in Value : chosen' = {v} - -(***************************************************************************) -(* The TLA+ temporal formula that is the spec. *) -(***************************************************************************) -Spec == Init /\ [][Next]_chosen - ------------------------------------------------------------------------------ -(***************************************************************************) -(* The specification should imply the safety property that 'chosen' can *) -(* contain at most one value in any reachable state. This condition on *) -(* the state is expressed by Inv defined here. *) -(***************************************************************************) -Inv == /\ TypeOK - /\ Cardinality(chosen) \leq 1 - -(***************************************************************************) -(* You can now run the TLC model checker on the model named 3Values to *) -(* check that Inv is an invariant, meaning that it's true of every *) -(* reachable state. To specify a model, we have to specify a value for *) -(* the constant Value. Model 3Values specifies it to be a set of three *) -(* arbitrary constants. *) -(* *) -(* TLC's default setting to check for deadlock would cause it to report a *) -(* deadlock because no action is possible after a value is chosen. We *) -(* would say that the system terminated, but termination is just deadlock *) -(* that we want to happen, and the model tells TLC that we want deadlock *) -(* by disabling its check for it. *) -(***************************************************************************) - - -(***************************************************************************) -(* The following theorem asserts the desired safety propert. Its proof *) -(* appears after the theorem. This proof is easily checked by the TLAPS *) -(* prover. *) -(***************************************************************************) -THEOREM Invariance == Spec => []Inv -<1>1. Init => Inv - -<1>2. Inv /\ [Next]_chosen => Inv' - -<1>3. QED - BY <1>1, <1>2 DEF Spec -============================================================================= diff --git a/specifications/PaxosHowToWinATuringAward/Paxos.toolbox/TinyModel/FiniteSets.tla b/specifications/PaxosHowToWinATuringAward/Paxos.toolbox/TinyModel/FiniteSets.tla deleted file mode 100644 index 57ac4023..00000000 --- a/specifications/PaxosHowToWinATuringAward/Paxos.toolbox/TinyModel/FiniteSets.tla +++ /dev/null @@ -1,23 +0,0 @@ ----------------------------- MODULE FiniteSets ----------------------------- -LOCAL INSTANCE Naturals -LOCAL INSTANCE Sequences - (*************************************************************************) - (* Imports the definitions from Naturals and Sequences, but doesn't *) - (* export them. *) - (*************************************************************************) - -IsFiniteSet(S) == - (*************************************************************************) - (* A set S is finite iff there is a finite sequence containing all its *) - (* elements. *) - (*************************************************************************) - \E seq \in Seq(S) : \A s \in S : \E n \in 1..Len(seq) : seq[n] = s - -Cardinality(S) == - (*************************************************************************) - (* Cardinality is defined only for finite sets. *) - (*************************************************************************) - LET CS[T \in SUBSET S] == IF T = {} THEN 0 - ELSE 1 + CS[T \ {CHOOSE x : x \in T}] - IN CS[S] -============================================================================= diff --git a/specifications/PaxosHowToWinATuringAward/Paxos.toolbox/TinyModel/Paxos.tla b/specifications/PaxosHowToWinATuringAward/Paxos.toolbox/TinyModel/Paxos.tla deleted file mode 100644 index b17f7b54..00000000 --- a/specifications/PaxosHowToWinATuringAward/Paxos.toolbox/TinyModel/Paxos.tla +++ /dev/null @@ -1,289 +0,0 @@ --------------------------------- MODULE Paxos ------------------------------- -(***************************************************************************) -(* This is a high-level specification of the Paxos consensus algorithm. *) -(* It refines the spec in module Voting, which you should read before *) -(* reading this module. In the Paxos algorithm, acceptors communicate by *) -(* sending messages. There are additional processes called leaders. The *) -(* specification here essentially considers there to be a separate leader *) -(* for each ballot number. We can consider "leader" to be a role, where *) -(* in an implementation there will be a finite number of leader processes *) -(* each of which plays infinitely many of these leader roles. *) -(* *) -(* Note: The algorithm described here is the Paxos consensus algorithm. *) -(* It is the crucial component of the Paxos algorithm, which implements a *) -(* fault-tolerant state machine using a sequence of instances of the *) -(* consensus algorithm. The Paxos algorithm is sometimes called *) -(* MultiPaxos, with the Paxos consensus algorithm being incorrectly called *) -(* the Paxos algorithm. In this module, I am contributing to this *) -(* confusion by using "Paxos" as short for "Paxos consensus" simply *) -(* because always adding "consensus" would be a nuisance. But please be *) -(* aware that here, "Paxos" means "Paxos consensus". *) -(***************************************************************************) - -EXTENDS Integers - -(***************************************************************************) -(* The constants and the assumptions about them are the same as for the *) -(* Voting algorithm. However, the second conjunct of the assumption, *) -(* which asserts that any two quorums have a non-empty intersection, is *) -(* not needed for the Paxos algorithm to implement the Voting algorithm. *) -(* The Voting algorithm, and it, do not satisfy consensus without that *) -(* assumption. *) -(***************************************************************************) -CONSTANTS Value, Acceptor, Quorum - -ASSUME /\ \A Q \in Quorum : Q \subseteq Acceptor - /\ \A Q1, Q2 \in Quorum : Q1 \cap Q2 /= {} - -Ballot == Nat - -None == CHOOSE v : v \notin Ballot - (*************************************************************************) - (* This defines None to be an unspecified value that is not a ballot *) - (* number. *) - (*************************************************************************) - -(***************************************************************************) -(* We now define Message toe be the set of all possible messages that can *) -(* be sent in the algorithm. In TLA+, the expression *) -(* *) -(* (1) [type |-> "1a", bal |-> b] *) -(* *) -(* is a record r with two components, a `type'component, r.type, that *) -(* equals "1a" and whose bal component, r.bal, that equals b. The *) -(* expression *) -(* *) -(* (2) [type : {"1a"}, bal : Ballot] *) -(* *) -(* is the set of all records r with a components `type' and bal such that *) -(* r.type is an element of {"1a"} and r.bal is an element of Ballot. *) -(* Since "1a" is the only element of {"1a"}, formula (2) is the set of all *) -(* elements (1) such that b \in Ballot. *) -(* *) -(* The function of each type of message in the set Message is explained *) -(* below with the action that can send it. *) -(***************************************************************************) -Message == - [type : {"1a"}, bal : Ballot] - \cup [type : {"1b"}, acc : Acceptor, bal : Ballot, - mbal : Ballot \cup {-1}, mval : Value \cup {None}] - \cup [type : {"2a"}, bal : Ballot, val : Value] - \cup [type : {"2b"}, acc : Acceptor, bal : Ballot, val : Value] ------------------------------------------------------------------------------ -(***************************************************************************) -(* We now declare the following variables: *) -(* *) -(* maxBal - Is the same as the variable of that name in the Voting *) -(* algorithm. *) -(* *) -(* maxVBal *) -(* maxVal - As in the Voting algorithm, a vote is a <> *) -(* pair. The pair <> if a has not cast any vote. *) -(* *) -(* msgs - The set of all messages that have been sent. *) -(* *) -(* Messages are added to msgs when they are sent and are never removed. *) -(* An operation that is performed upon receipt of a message is represented *) -(* by an action that is enabled when the message is in msgs. This *) -(* simplifies the spec in the following ways: *) -(* *) -(* - A message can be broadcast to multiple recipients by just adding *) -(* (a single copy of) it to msgs. *) -(* *) -(* - Never removing the message automatically allows the possibility of *) -(* the same message being received twice. *) -(* *) -(* Since we are considering only safety, there is no need to explicitly *) -(* model message loss. The safety part of the spec says only what *) -(* messages may be received and does not assert that any message actually *) -(* is received. Thus, there is no difference between a lost message and *) -(* one that is never received. *) -(***************************************************************************) -VARIABLES maxBal, maxVBal, maxVal, msgs -vars == <> - (*************************************************************************) - (* It's convenient to name the tuple of all variables in a spec. *) - (*************************************************************************) - -(***************************************************************************) -(* The invariant that describes the "types" of the variables. *) -(***************************************************************************) -TypeOK == /\ maxBal \in [Acceptor -> Ballot \cup {-1}] - /\ maxVBal \in [Acceptor -> Ballot \cup {-1}] - /\ maxVal \in [Acceptor -> Value \cup {None}] - /\ msgs \subseteq Message - -(***************************************************************************) -(* The initial predicate should be obvious from the descriptions of the *) -(* variables given above. *) -(***************************************************************************) -Init == /\ maxBal = [a \in Acceptor |-> -1] - /\ maxVBal = [a \in Acceptor |-> -1] - /\ maxVal = [a \in Acceptor |-> None] - /\ msgs = {} ----------------------------------------------------------------------------- -(***************************************************************************) -(* We now define the subactions of the next-state actions. We begin by *) -(* defining an action that will be used in those subactions. The action *) -(* Send(m) asserts that message m is added to the set msgs. *) -(***************************************************************************) -Send(m) == msgs' = msgs \cup {m} - -(***************************************************************************) -(* The ballot b leader can perform actions Phase1a(b) and Phase2a(b). In *) -(* the Phase1a(b) action, it sends to all acceptors a phase 1a message (a *) -(* message m with m.type = "1a") that begins ballot b. Remember that the *) -(* same process can perform the role of leader for many different ballot *) -(* numbers b. In practice, it will stop playing the role of leader of *) -(* ballot b when it begins a higher-numbered ballot. (Remember the *) -(* definition of [type |-> "1a", bal |-> b] from the comment preceding the *) -(* definition of Message.) *) -(***************************************************************************) -Phase1a(b) == /\ Send([type |-> "1a", bal |-> b]) - /\ UNCHANGED <> - (************************************************************************) - (* Note that there is no enabling condition to prevent sending the *) - (* phase 1a message a second time. Since messages are never removed *) - (* from msg, performing the action a second time leaves msg and all the *) - (* other spec variables unchanged, so it's a stuttering step. Since *) - (* stuttering steps are always allowed, there's no reason to try to *) - (* prevent them. *) - (************************************************************************) - -(***************************************************************************) -(* Upon receipt of a ballot b phase 1a message, acceptor a can perform a *) -(* Phase1b(a) action only if b > maxBal[a]. The action sets maxBal[a] to *) -(* b and sends a phase 1b message to the leader containing the values of *) -(* maxVBal[a] and maxVal[a]. This action implements the *) -(* IncreaseMaxBal(a,b) action of the Voting algorithm for b = m.bal. *) -(***************************************************************************) -Phase1b(a) == - /\ \E m \in msgs : - /\ m.type = "1a" - /\ m.bal > maxBal[a] - /\ maxBal' = [maxBal EXCEPT ![a] = m.bal] - /\ Send([type |-> "1b", acc |-> a, bal |-> m.bal, - mbal |-> maxVBal[a], mval |-> maxVal[a]]) - /\ UNCHANGED <> - -(**************************************************************************** -In the Phase2a(b, v) action, the ballot b leader sends a type "2a" -message asking the acceptors to vote for v in ballot number b. The -enabling conditions of the action--its first two conjuncts--ensure that -three of the four enabling conditions of action VoteFor(a, b, v) in -module Voting will be true when acceptor a receives that message. -Those three enabling conditions are the second through fourth conjuncts -of that action. - -The first conjunct of Phase2a(b, v) asserts that at most one phase 2a -message is ever sent for ballot b. Since an acceptor will vote for a -value in ballot b only when it receives the appropriate phase 2a -message, the phase 2a message sent by this action this ensures that -these two enabling conjuncts of VoteFor(a,b,v) will be true forever: - - /\ \A vt \in votes[a] : vt[1] /= b - /\ \A c \in Acceptor \ {a} : - \A vt \in votes[c] : (vt[1] = b) => (vt[2] = v) - -The second conjunct of the Phase2a(b, v) action is the heart of the -Paxos consensus algorithm. It's a bit complicated, but I've tried a -number of times to write it in English, and it's much easier to -understand when written in mathematics. The LET/IN construct locally -defines Q1 to be the set of phase 1b messages sent in ballot number b -by acceptors in quorum Q; and it defines Q1bv to be the subset of those -messages indicating that the sender had voted in some ballot (which -must have been numbered less than b). You should study the IN clause -to convince yourself that it equals ShowsSafeAt(Q, b, v), defined in -module Voting, using the values of maxBal[a], maxVBal[a], and maxVal[a] -`a' sent in its phase 1b message to describe what votes it had cast -when it sent that message. Moreover, since `a' will no longer cast any -votes in ballots numbered less than b, the IN clause implies that -ShowsSafeAt(Q, b, v) is still true and will remain true forever. -Hence, this conjunct of Phase2a(b, v) checks the enabling condition - - /\ \E Q \in Quorum : ShowsSafeAt(Q, b, v) - -of module Voting's VoteFor(a, b, v) action. - -The type "2a" message sent by this action therefore tells every -acceptor `a' that, when it receives the message, all the enabling -conditions of VoteFor(a, b, v) but the first, maxBal[a] =< b, -are satisfied - - - -****************************************************************************) -Phase2a(b, v) == - /\ ~ \E m \in msgs : m.type = "2a" /\ m.bal = b - /\ \E Q \in Quorum : - LET Q1b == {m \in msgs : /\ m.type = "1b" - /\ m.acc \in Q - /\ m.bal = b} - Q1bv == {m \in Q1b : m.mbal >= 0} - IN /\ \A a \in Q : \E m \in Q1b : m.acc = a - /\ \/ Q1bv = {} - \/ \E m \in Q1bv : - /\ m.mval = v - /\ \A mm \in Q1bv : m.mbal >= mm.mbal - /\ Send([type |-> "2a", bal |-> b, val |-> v]) - /\ UNCHANGED <> - - -(*************************************************************************** -The Phase2b(a) action describes what acceptor `a' does when it -receives a phase 2a message m, which is sent by the leader of -ballot m.bal asking acceptors to vote for m.val in that ballot. -Acceptor `a' acts on that request, voting for m.val in ballot -number m.bal, iff m.bal >= maxBal[a], which means that `a' has -not participated in any ballot numbered greater than m.bal. - - ***************************************************************************) -Phase2b(a) == - \E m \in msgs : - /\ m.type = "2a" - /\ m.bal >= maxBal[a] - /\ maxBal' = [maxBal EXCEPT ![a] = m.bal] - /\ maxVBal' = [maxVBal EXCEPT ![a] = m.bal] - /\ maxVal' = [maxVal EXCEPT ![a] = m.val] - /\ Send([type |-> "2b", acc |-> a, - bal |-> m.bal, val |-> m.val]) - -Next == \/ \E b \in Ballot : \/ Phase1a(b) - \/ \E v \in Value : Phase2a(b, v) - \/ \E a \in Acceptor : Phase1b(a) \/ Phase2b(a) - -Spec == Init /\ [][Next]_vars ----------------------------------------------------------------------------- -votes == - [a \in Acceptor |-> - {<> : m \in {mm \in msgs: /\ mm.type = "2b" - /\ mm.acc = a }}] - -V == INSTANCE Voting - -Inv == - /\ TypeOK - /\ \A a \in Acceptor : maxBal[a] >= maxVBal[a] - /\ \A a \in Acceptor : IF maxVBal[a] = -1 - THEN maxVal[a] = None - ELSE <> \in votes[a] - /\ \A m \in msgs : - /\ (m.type = "1b") => /\ maxBal[m.acc] >= m.bal - /\ (m.mbal >= 0) => - <> \in votes[m.acc] - /\ (m.type = "2a") => /\ \E Q \in Quorum : - V!ShowsSafeAt(Q, m.bal, m.val) - /\ \A mm \in msgs : /\ mm.type ="2a" - /\ mm.bal = m.bal - => mm.val = m.val - /\ (m.type = "2b") => /\ maxVBal[m.acc] >= m.bal - /\ \E mm \in msgs : /\ mm.type = "2a" - /\ mm.bal = m.bal - /\ mm.val = m.val - -THEOREM Invariance == Spec => []Inv - -THEOREM Implementation == Spec => V!Spec -============================================================================ diff --git a/specifications/PaxosHowToWinATuringAward/Paxos.toolbox/TinyModel/Voting.tla b/specifications/PaxosHowToWinATuringAward/Paxos.toolbox/TinyModel/Voting.tla deleted file mode 100644 index 0cfd268e..00000000 --- a/specifications/PaxosHowToWinATuringAward/Paxos.toolbox/TinyModel/Voting.tla +++ /dev/null @@ -1,300 +0,0 @@ ------------------------------- MODULE Voting ------------------------------- -(***************************************************************************) -(* This is a high-level algorithm in which a set of processes *) -(* cooperatively choose a value. It is a high-level abstraction of the *) -(* Paxos consensus algorithm. Although I don't remember exactly what went *) -(* through my mind when I invented/discovered that algorithm, I'm pretty *) -(* sure that this spec formalizes the way I first thought of the *) -(* algorithm. It would have been very hard to find this algorithm had my *) -(* mind been distracted by the irrelevant details introduced by having the *) -(* processes communicate by messages. *) -(***************************************************************************) -EXTENDS Integers - -(***************************************************************************) -(* For historical reasons, the processes that choose a value are called *) -(* acceptors. We now declare the set Value of values, the set Acceptors *) -(* of acceptors, and another set Quorum that is a set of sets of acceptors *) -(* called quorums. *) -(***************************************************************************) -CONSTANTS Value, Acceptor, Quorum - -(***************************************************************************) -(* The following assumption asserts that Quorum is a set of subsets of the *) -(* set Acceptor, and that any two elements of Quorum have at least one *) -(* element (an acceptor) in common. Think of a quorum as a set consisting *) -(* of a majority (more than half) of the acceptors. *) -(***************************************************************************) -ASSUME /\ \A Q \in Quorum : Q \subseteq Acceptor - /\ \A Q1, Q2 \in Quorum : Q1 \cap Q2 /= {} - -(***************************************************************************) -(* Ballot is a set of "ballot numbers". For simplicity, we let it be the *) -(* set of natural numbers. However, we write Ballot for that set to *) -(* distinguish ballots from natural numbers used for other purposes. *) -(***************************************************************************) -Ballot == Nat ------------------------------------------------------------------------------ -(***************************************************************************) -(* The algorithm works by having acceptors cast votes in numbered ballots. *) -(* Each acceptor can cast one or more votes, where each vote cast by an *) -(* acceptor has the form <> indicating that the acceptor has voted *) -(* for value v in ballot number b. A value is chosen if a quorum of *) -(* acceptors have voted for it in the same ballot. *) -(* *) -(* We now declare the algorithm's variables 'votes' and 'maxBal'. For *) -(* each acceptor a, he value of votes[a] is the set of votes cast by `a'; *) -(* and maxBal[a] is an integer such that `a' will never cast any further *) -(* vote in a ballot numbered less than maxBal[a]. *) -(***************************************************************************) -VARIABLES votes, maxBal - -(***************************************************************************) -(* TypeOK asserts the "types" of the two variables. They are both *) -(* functions with domain Acceptor (arrays indexed by acceptors). For any *) -(* acceptor a, the value of votes[a] a set of <> pairs; and *) -(* the value of maxBal[a] is either a ballot number or -1. *) -(***************************************************************************) -TypeOK == - /\ votes \in [Acceptor -> SUBSET (Ballot \X Value)] - /\ maxBal \in [Acceptor -> Ballot \cup {-1}] - -(***************************************************************************) -(* Next comes a sequence of definitions of concepts used to explain the *) -(* algorithm. *) -(***************************************************************************) -VotedFor(a, b, v) == <> \in votes[a] - (************************************************************************) - (* True iff (if and only if) acceptor a has votted for value v in *) - (* ballot number b. *) - (************************************************************************) - -ChosenAt(b, v) == - \E Q \in Quorum : \A a \in Q : VotedFor(a, b, v) - (************************************************************************) - (* True iff a quorum of acceptors have all voted for value v in ballot *) - (* number b. *) - (************************************************************************) - -chosen == {v \in Value : \E b \in Ballot : ChosenAt(b, v)} - (************************************************************************) - (* Defines `chosen' to be the set of all values v for which ChosenAt(b, *) - (* v) is true for some ballot number b. This is the definition of what *) - (* it means for a value to be chosen under which the Voting algorithm *) - (* implements the Consensus specification. *) - (************************************************************************) - -DidNotVoteAt(a, b) == \A v \in Value : ~ VotedFor(a, b, v) - (************************************************************************) - (* True iff acceptor `a' has not voted in ballot number . *) - (************************************************************************) - -CannotVoteAt(a, b) == /\ maxBal[a] > b - /\ DidNotVoteAt(a, b) - (************************************************************************) - (* The algorithm will not allow acceptor `a' to vote in ballot number b *) - (* if maxBal[a] > b. Hence, CannotVoteAt(a, b) implies that `a' has *) - (* not and never will vote in ballot number b. *) - (************************************************************************) - -NoneOtherChoosableAt(b, v) == - \E Q \in Quorum : - \A a \in Q : VotedFor(a, b, v) \/ CannotVoteAt(a, b) - (************************************************************************) - (* This is true iff there is some quorum Q such that each acceptor `a' *) - (* in Q either has voted for v in ballot b or has not and never will *) - (* vote in ballot b. It implies that no value other than v has been or *) - (* ever can be chosen at ballot b. This is because for a value w to be *) - (* chosen at ballot b, all the acceptors in some quorum R must have *) - (* voted for w in ballot b. But any two ballots have an acceptor in *) - (* common, so some acceptor a in R that voted for w is in Q, and an *) - (* acceptor in Q can only have voted for v, so w must equal v. *) - (************************************************************************) - -SafeAt(b, v) == \A c \in 0..(b-1) : NoneOtherChoosableAt(c, v) - (************************************************************************) - (* True iff no value other than v has been or ever will be chosen in *) - (* any ballot numbered less than b. We read SafeAt(b, v) as "v is safe *) - (* at b". *) - (************************************************************************) - -(***************************************************************************) -(* This theorem asserts that every value is safe at ballot 0. *) -(***************************************************************************) -THEOREM AllSafeAtZero == \A v \in Value : SafeAt(0, v) - -(***************************************************************************) -(* The following theorem asserts that NoneOtherChoosableAt means what it's *) -(* name implies. The comments after its definition essentially contain a *) -(* proof of this theorem. *) -(***************************************************************************) -THEOREM ChoosableThm == - \A b \in Ballot, v \in Value : - ChosenAt(b, v) => NoneOtherChoosableAt(b, v) - -(***************************************************************************) -(* Now comes the definition of the inductive invariant Inv that *) -(* essentially explains why the algorithm is correct. *) -(***************************************************************************) -OneValuePerBallot == - \A a1, a2 \in Acceptor, b \in Ballot, v1, v2 \in Value : - VotedFor(a1, b, v1) /\ VotedFor(a2, b, v2) => (v1 = v2) - (************************************************************************) - (* This formula asserts that if any acceptors a1 and a2 have voted in a *) - (* ballot b, then they voted for the same value in ballot b. For *) - (* a1=a2, this implies that an acceptor can vote for at most one value *) - (* in any ballot. *) - (************************************************************************) - -VotesSafe == \A a \in Acceptor, b \in Ballot, v \in Value : - VotedFor(a, b, v) => SafeAt(b, v) - (************************************************************************) - (* This formula asserts that an acceptors can have voted in a ballot b *) - (* only if that value is safe at b. *) - (************************************************************************) - -(***************************************************************************) -(* The algorithm is essentially derived by ensuring that this formula Inv *) -(* is always true. *) -(***************************************************************************) -Inv == TypeOK /\ VotesSafe /\ OneValuePerBallot - -(***************************************************************************) -(* This definition is used in the defining the algorithm. You should *) -(* study it and make sure you understand what it says. *) -(***************************************************************************) -ShowsSafeAt(Q, b, v) == - /\ \A a \in Q : maxBal[a] >= b - /\ \E c \in -1..(b-1) : - /\ (c /= -1) => \E a \in Q : VotedFor(a, c, v) - /\ \A d \in (c+1)..(b-1), a \in Q : DidNotVoteAt(a, d) - -(***************************************************************************) -(* This is the theorem that's at the heart of the algorithm. It shows *) -(* that if the algorithm has maintained the invariance of Inv, then the *) -(* truth of ShowsSafeAt(Q, b, v) for some quorum Q ensures that v is safe *) -(* at b, so the algorithm can let an acceptor vote for v in ballot b *) -(* knowing VotesSafe will be preserved. *) -(***************************************************************************) -THEOREM ShowsSafety == - Inv => \A Q \in Quorum, b \in Ballot, v \in Value : - ShowsSafeAt(Q, b, v) => SafeAt(b, v) ------------------------------------------------------------------------------ -(***************************************************************************) -(* Finally, we get to the definition of the algorithm. The initial *) -(* predicate is obvious. *) -(***************************************************************************) -Init == /\ votes = [a \in Acceptor |-> {}] - /\ maxBal = [a \in Acceptor |-> -1] - -(***************************************************************************) -(* An acceptor `a' can increase maxBal[a] at any time. *) -(***************************************************************************) -IncreaseMaxBal(a, b) == - /\ b > maxBal[a] - /\ maxBal' = [maxBal EXCEPT ![a] = b] - /\ UNCHANGED votes - -(***************************************************************************) -(* The heart of the algorithm is the action in which an acceptor `a' votes *) -(* for a value v in ballot number b. The enabling condition contains the *) -(* following conjuncts, which ensure that the invariance of Inv is *) -(* maintained. *) -(* *) -(* - `a' cannot vote in a ballot numbered less than b *) -(* *) -(* - `a' cannot already have voted in ballot number b *) -(* *) -(* - No other acceptor can have voted for a value other than v *) -(* in ballot b. *) -(* *) -(* - Uses Theorem ShowsSafety to ensure that v is safe at b. *) -(* *) -(* In TLA+, a tuple t is a function (array) whose first element is t[1], *) -(* whose second element if t[2], and so on. Thus, a vote vt is the pair *) -(* <> *) -(***************************************************************************) -VoteFor(a, b, v) == - /\ maxBal[a] =< b - /\ \A vt \in votes[a] : vt[1] /= b - /\ \A c \in Acceptor \ {a} : - \A vt \in votes[c] : (vt[1] = b) => (vt[2] = v) - /\ \E Q \in Quorum : ShowsSafeAt(Q, b, v) - /\ votes' = [votes EXCEPT ![a] = votes[a] \cup {<>}] - /\ maxBal' = [maxBal EXCEPT ![a] = b] - -(***************************************************************************) -(* The rest of the spec is straightforward. *) -(***************************************************************************) -Next == \E a \in Acceptor, b \in Ballot : - \/ IncreaseMaxBal(a, b) - \/ \E v \in Value : VoteFor(a, b, v) - -Spec == Init /\ [][Next]_<> ------------------------------------------------------------------------------ -(***************************************************************************) -(* This theorem asserts that Inv is an invariant of the algorithm. The *) -(* high-level steps in its proof are given. *) -(***************************************************************************) -THEOREM Invariance == Spec => []Inv -<1>1. Init => Inv - -<1>2. Inv /\ [Next]_<> => Inv' - -<1>3. QED - BY <1>1, <1>2 DEF Spec ------------------------------------------------------------------------------ -(***************************************************************************) -(* This INSTANCE statement imports definitions from module Consensus into *) -(* the current module. All definition in module Consensus can be expanded *) -(* to definitions containing only TLA+ primitives and the declared names *) -(* Value and chosen. To import a definition from Consensus into the *) -(* current module, we have to say what expressions from the current module *) -(* are substituted for Value and chosen. The INSTANCE statement says that *) -(* expressions of the same name are substituted for them. (Because of *) -(* this, the WITH statement is redundant.) Note that in both modules, *) -(* Value is just a declared constant. However, in the current module, *) -(* `chosen' is an expression defined in terms of the variables votes and *) -(* maxBal while it is a variable in module consensus. The "C! ==" in the *) -(* statement means that defined identifiers are imported with "C!" *) -(* prepended to their names. Thus Spec of module Consensus is imported, *) -(* with these substitutions, as C!Spec. *) -(***************************************************************************) -C == INSTANCE Consensus - WITH Value <- Value, chosen <- chosen - -(***************************************************************************) -(* The following theorem asserts that the Voting algorithm implements the *) -(* Consensus specification, where the expression `chosen' of the current *) -(* module implements the variable `chosen' of Consensus. The high-level *) -(* steps of the the proof are also given. *) -(***************************************************************************) -THEOREM Implementation == Spec => C!Spec -<1>1. Init => C!Init - -<1>2. Inv /\ Inv' /\ [Next]_<> => [C!Next]_chosen - -<1>3. QED - BY <1>1, <1>2, Invariance DEF Spec, C!Spec - -(***************************************************************************) -(* You can run TLC on model SmallModel in a few seconds. That model *) -(* instantiates Acceptor and Values as symmetric sets of model values with *) -(* 3 acceptors and 2 values, and uses a definition override (on the Spec *) -(* Options page) to redefine Ballot to equal 0..2. It checks theorems *) -(* Invariance and Implementation stated above. TLC executes it in a *) -(* couple of seconds. *) -(* *) -(* After doing that, show why the assumption that any pair of quorums has *) -(* an element in common by modifying the model so that assumption doesn't *) -(* hold. (It's best to clone SmallModel and modify the clone.) Since TLC *) -(* reports an error if an assumption isn't true You will have to comment *) -(* out the second conjunct of the ASSUME statement, which asserts that *) -(* assumption. Comments can be written as follows: *) -(* *) -(* \* This is an end of line comment. *) -(* *) -(* (* This is another way to write a comment. *) -(* Note that comments can be nested. *) *) -(***************************************************************************) -============================================================================= diff --git a/specifications/PaxosHowToWinATuringAward/Voting.toolbox/.project b/specifications/PaxosHowToWinATuringAward/Voting.toolbox/.project deleted file mode 100644 index 9d851e42..00000000 --- a/specifications/PaxosHowToWinATuringAward/Voting.toolbox/.project +++ /dev/null @@ -1,29 +0,0 @@ - - - Voting - - - - - - toolbox.builder.TLAParserBuilder - - - - - - toolbox.natures.TLANature - - - - Consensus.tla - 1 - PARENT-1-PROJECT_LOC/Consensus.tla - - - Voting.tla - 1 - PARENT-1-PROJECT_LOC/Voting.tla - - - diff --git a/specifications/PaxosHowToWinATuringAward/Voting.toolbox/.settings/org.lamport.tla.toolbox.prefs b/specifications/PaxosHowToWinATuringAward/Voting.toolbox/.settings/org.lamport.tla.toolbox.prefs deleted file mode 100644 index 8a0e2766..00000000 --- a/specifications/PaxosHowToWinATuringAward/Voting.toolbox/.settings/org.lamport.tla.toolbox.prefs +++ /dev/null @@ -1,2 +0,0 @@ -ProjectRootFile=PARENT-1-PROJECT_LOC/Voting.tla -eclipse.preferences.version=1 diff --git a/specifications/PaxosHowToWinATuringAward/Voting.toolbox/SmallModel/Consensus.tla b/specifications/PaxosHowToWinATuringAward/Voting.toolbox/SmallModel/Consensus.tla deleted file mode 100644 index 5fa47a70..00000000 --- a/specifications/PaxosHowToWinATuringAward/Voting.toolbox/SmallModel/Consensus.tla +++ /dev/null @@ -1,113 +0,0 @@ ------------------------------ MODULE Consensus ------------------------------ -(***************************************************************************) -(* This is an very abstract specification of the consensus problem, in *) -(* which a set of processes must choose a single value. We abstract away *) -(* even the processes. We specify the simple requirement that at most one *) -(* value is chosen by describing the set of all chosen values. The naive *) -(* requirement is that this set never contains more than one value, which *) -(* is an invariance property. But a little thought shows that this *) -(* requirement allows a value to be chosen then unchosen, and then another *) -(* value to be chosen. So we specify that the set of chosen values is *) -(* initially empty, it can be set to a single value, and then it can never *) -(* change. *) -(* *) -(* We are ignoring liveness, so we do not any requirement that a value is *) -(* eventually chosen. *) -(***************************************************************************) - -EXTENDS Naturals, FiniteSets - (*************************************************************************) - (* Imports standard modules that define operators of arithmetic on *) - (* natural numbers and the Cardinality operator, where Cardinality(S) is *) - (* the number of elements in the set S, if S is finite. *) - (*************************************************************************) -CONSTANT Value - (*************************************************************************) - (* The set of all values that can be chosen. *) - (*************************************************************************) -VARIABLE chosen - (*************************************************************************) - (* The set of all values that have been chosen. *) - (*************************************************************************) - -(***************************************************************************) -(* The type-correctness invariant asserting the "type" of the variable *) -(* 'chosen'. It isn't part of the spec itself--that is, the formula *) -(* describing the possible sequence of values that 'chosen' can have in a *) -(* behavior correct behavior of the system, but is an invariance property *) -(* that the spec should satisfy. *) -(***************************************************************************) -TypeOK == /\ chosen \subseteq Value - /\ IsFiniteSet(chosen) - -(***************************************************************************) -(* The initial predicate describing the possible initial state of *) -(* 'chosen'. *) -(***************************************************************************) -Init == chosen = {} - -(***************************************************************************) -(* The next-state relation describing how 'chosen' can change from one *) -(* step to the next. Note that is enabled (equals true for some next *) -(* value chosen' of choseen) if and only if chosen equals the empty set. *) -(***************************************************************************) -Next == /\ chosen = {} - /\ \E v \in Value : chosen' = {v} - -(***************************************************************************) -(* The TLA+ temporal formula that is the spec. *) -(***************************************************************************) -Spec == Init /\ [][Next]_chosen - ------------------------------------------------------------------------------ -(***************************************************************************) -(* The specification should imply the safety property that 'chosen' can *) -(* contain at most one value in any reachable state. This condition on *) -(* the state is expressed by Inv defined here. *) -(***************************************************************************) -Inv == /\ TypeOK - /\ Cardinality(chosen) \leq 1 - -(***************************************************************************) -(* The following theorem asserts the desired safety propert. Its proof *) -(* appears after the theorem. This proof is easily checked by the TLAPS *) -(* prover. *) -(***************************************************************************) -THEOREM Invariance == Spec => []Inv -<1>1. Init => Inv - -<1>2. Inv /\ [Next]_chosen => Inv' - -<1>3. QED - BY <1>1, <1>2 DEF Spec - -(***************************************************************************) -(* If you are reading this specification in the Toolbox as you should be *) -(* (either the source file or its pretty-printed version), then you have *) -(* already opened the specification in the Toolbox. If not, you should do *) -(* that now. Download and run the Toolbox. Open a new specification with *) -(* this module file (Consensus.tla) as the root file, using the default *) -(* specification name, which is the name of the root file. Along with the *) -(* module, this will install a TLC model named 3Values. Open that model. *) -(* You will see that the model specifies three things: *) -(* *) -(* - The specification is formula Spec. *) -(* *) -(* - Three unspecified constants a, b, and c (called model values) *) -(* are substituted for the declared constants Values. *) -(* *) -(* - TLC should check that formula Inv is an invariant (a *) -(* formula true on all reachable states of he specification. *) -(* *) -(* Run TLC on the model. For this tiny spec, this just takes perhaps a *) -(* millisecond plus the couple of seconds that TLC needs to start and stop *) -(* running any spec. *) -(* *) -(* TLC's default setting to check for deadlock would cause it to report a *) -(* deadlock because no action is possible after a value is chosen. We *) -(* would say that the system terminated, but termination is just deadlock *) -(* that we want to happen, and the model tells TLC that we want deadlock *) -(* by disabling its check for it. *) -(***************************************************************************) - -============================================================================= diff --git a/specifications/PaxosHowToWinATuringAward/Voting.toolbox/SmallModel/FiniteSets.tla b/specifications/PaxosHowToWinATuringAward/Voting.toolbox/SmallModel/FiniteSets.tla deleted file mode 100644 index 57ac4023..00000000 --- a/specifications/PaxosHowToWinATuringAward/Voting.toolbox/SmallModel/FiniteSets.tla +++ /dev/null @@ -1,23 +0,0 @@ ----------------------------- MODULE FiniteSets ----------------------------- -LOCAL INSTANCE Naturals -LOCAL INSTANCE Sequences - (*************************************************************************) - (* Imports the definitions from Naturals and Sequences, but doesn't *) - (* export them. *) - (*************************************************************************) - -IsFiniteSet(S) == - (*************************************************************************) - (* A set S is finite iff there is a finite sequence containing all its *) - (* elements. *) - (*************************************************************************) - \E seq \in Seq(S) : \A s \in S : \E n \in 1..Len(seq) : seq[n] = s - -Cardinality(S) == - (*************************************************************************) - (* Cardinality is defined only for finite sets. *) - (*************************************************************************) - LET CS[T \in SUBSET S] == IF T = {} THEN 0 - ELSE 1 + CS[T \ {CHOOSE x : x \in T}] - IN CS[S] -============================================================================= diff --git a/specifications/PaxosHowToWinATuringAward/Voting.toolbox/SmallModel/Voting.tla b/specifications/PaxosHowToWinATuringAward/Voting.toolbox/SmallModel/Voting.tla deleted file mode 100644 index 6a6892c8..00000000 --- a/specifications/PaxosHowToWinATuringAward/Voting.toolbox/SmallModel/Voting.tla +++ /dev/null @@ -1,315 +0,0 @@ ------------------------------- MODULE Voting ------------------------------- -(***************************************************************************) -(* This is a high-level algorithm in which a set of processes *) -(* cooperatively choose a value. It is a high-level abstraction of the *) -(* Paxos consensus algorithm. Although I don't remember exactly what went *) -(* through my mind when I invented/discovered that algorithm, I'm pretty *) -(* sure that this spec formalizes the way I first thought of the *) -(* algorithm. It would have been very hard to find this algorithm had my *) -(* mind been distracted by the irrelevant details introduced by having the *) -(* processes communicate by messages. *) -(***************************************************************************) -EXTENDS Integers - -(***************************************************************************) -(* For historical reasons, the processes that choose a value are called *) -(* acceptors. We now declare the set Value of values, the set Acceptors *) -(* of acceptors, and another set Quorum that is a set of sets of acceptors *) -(* called quorums. *) -(***************************************************************************) -CONSTANTS Value, Acceptor, Quorum - -(***************************************************************************) -(* The following assumption asserts that Quorum is a set of subsets of the *) -(* set Acceptor, and that any two elements of Quorum have at least one *) -(* element (an acceptor) in common. Think of a quorum as a set consisting *) -(* of a majority (more than half) of the acceptors. *) -(***************************************************************************) -ASSUME /\ \A Q \in Quorum : Q \subseteq Acceptor - /\ \A Q1, Q2 \in Quorum : Q1 \cap Q2 /= {} - -(***************************************************************************) -(* Ballot is a set of "ballot numbers". For simplicity, we let it be the *) -(* set of natural numbers. However, we write Ballot for that set to *) -(* distinguish ballots from natural numbers used for other purposes. *) -(***************************************************************************) -Ballot == Nat ------------------------------------------------------------------------------ -(***************************************************************************) -(* The algorithm works by having acceptors cast votes in numbered ballots. *) -(* Each acceptor can cast one or more votes, where each vote cast by an *) -(* acceptor has the form <> indicating that the acceptor has voted *) -(* for value v in ballot number b. A value is chosen if a quorum of *) -(* acceptors have voted for it in the same ballot. *) -(* *) -(* We now declare the algorithm's variables 'votes' and 'maxBal'. For *) -(* each acceptor a, he value of votes[a] is the set of votes cast by `a'; *) -(* and maxBal[a] is an integer such that `a' will never cast any further *) -(* vote in a ballot numbered less than maxBal[a]. *) -(***************************************************************************) -VARIABLES votes, maxBal - -(***************************************************************************) -(* TypeOK asserts the "types" of the two variables. They are both *) -(* functions with domain Acceptor (arrays indexed by acceptors). For any *) -(* acceptor a, the value of votes[a] a set of <> pairs; and *) -(* the value of maxBal[a] is either a ballot number or -1. *) -(***************************************************************************) -TypeOK == - /\ votes \in [Acceptor -> SUBSET (Ballot \X Value)] - /\ maxBal \in [Acceptor -> Ballot \cup {-1}] - -(***************************************************************************) -(* Next comes a sequence of definitions of concepts used to explain the *) -(* algorithm. *) -(***************************************************************************) -VotedFor(a, b, v) == <> \in votes[a] - (************************************************************************) - (* True iff (if and only if) acceptor a has votted for value v in *) - (* ballot number b. *) - (************************************************************************) - -ChosenAt(b, v) == - \E Q \in Quorum : \A a \in Q : VotedFor(a, b, v) - (************************************************************************) - (* True iff a quorum of acceptors have all voted for value v in ballot *) - (* number b. *) - (************************************************************************) - -chosen == {v \in Value : \E b \in Ballot : ChosenAt(b, v)} - (************************************************************************) - (* Defines `chosen' to be the set of all values v for which ChosenAt(b, *) - (* v) is true for some ballot number b. This is the definition of what *) - (* it means for a value to be chosen under which the Voting algorithm *) - (* implements the Consensus specification. *) - (************************************************************************) - -DidNotVoteAt(a, b) == \A v \in Value : ~ VotedFor(a, b, v) - (************************************************************************) - (* True iff acceptor `a' has not voted in ballot number . *) - (************************************************************************) - -CannotVoteAt(a, b) == /\ maxBal[a] > b - /\ DidNotVoteAt(a, b) - (************************************************************************) - (* The algorithm will not allow acceptor `a' to vote in ballot number b *) - (* if maxBal[a] > b. Hence, CannotVoteAt(a, b) implies that `a' has *) - (* not and never will vote in ballot number b. *) - (************************************************************************) - -NoneOtherChoosableAt(b, v) == - \E Q \in Quorum : - \A a \in Q : VotedFor(a, b, v) \/ CannotVoteAt(a, b) - (************************************************************************) - (* This is true iff there is some quorum Q such that each acceptor `a' *) - (* in Q either has voted for v in ballot b or has not and never will *) - (* vote in ballot b. It implies that no value other than v has been or *) - (* ever can be chosen at ballot b. This is because for a value w to be *) - (* chosen at ballot b, all the acceptors in some quorum R must have *) - (* voted for w in ballot b. But any two ballots have an acceptor in *) - (* common, so some acceptor a in R that voted for w is in Q, and an *) - (* acceptor in Q can only have voted for v, so w must equal v. *) - (************************************************************************) - -SafeAt(b, v) == \A c \in 0..(b-1) : NoneOtherChoosableAt(c, v) - (************************************************************************) - (* True iff no value other than v has been or ever will be chosen in *) - (* any ballot numbered less than b. We read SafeAt(b, v) as "v is safe *) - (* at b". *) - (************************************************************************) - -(***************************************************************************) -(* This theorem asserts that every value is safe at ballot 0. *) -(***************************************************************************) -THEOREM AllSafeAtZero == \A v \in Value : SafeAt(0, v) - -(***************************************************************************) -(* The following theorem asserts that NoneOtherChoosableAt means what it's *) -(* name implies. The comments after its definition essentially contain a *) -(* proof of this theorem. *) -(***************************************************************************) -THEOREM ChoosableThm == - \A b \in Ballot, v \in Value : - ChosenAt(b, v) => NoneOtherChoosableAt(b, v) - -(***************************************************************************) -(* Now comes the definition of the inductive invariant Inv that *) -(* essentially explains why the algorithm is correct. *) -(***************************************************************************) -OneValuePerBallot == - \A a1, a2 \in Acceptor, b \in Ballot, v1, v2 \in Value : - VotedFor(a1, b, v1) /\ VotedFor(a2, b, v2) => (v1 = v2) - (************************************************************************) - (* This formula asserts that if any acceptors a1 and a2 have voted in a *) - (* ballot b, then they voted for the same value in ballot b. For *) - (* a1=a2, this implies that an acceptor can vote for at most one value *) - (* in any ballot. *) - (************************************************************************) - -VotesSafe == \A a \in Acceptor, b \in Ballot, v \in Value : - VotedFor(a, b, v) => SafeAt(b, v) - (************************************************************************) - (* This formula asserts that an acceptors can have voted in a ballot b *) - (* only if that value is safe at b. *) - (************************************************************************) - -(***************************************************************************) -(* The algorithm is essentially derived by ensuring that this formula Inv *) -(* is always true. *) -(***************************************************************************) -Inv == TypeOK /\ VotesSafe /\ OneValuePerBallot - -(***************************************************************************) -(* This definition is used in the defining the algorithm. You should *) -(* study it and make sure you understand what it says. *) -(***************************************************************************) -ShowsSafeAt(Q, b, v) == - /\ \A a \in Q : maxBal[a] >= b - /\ \E c \in -1..(b-1) : - /\ (c /= -1) => \E a \in Q : VotedFor(a, c, v) - /\ \A d \in (c+1)..(b-1), a \in Q : DidNotVoteAt(a, d) - -(***************************************************************************) -(* This is the theorem that's at the heart of the algorithm. It shows *) -(* that if the algorithm has maintained the invariance of Inv, then the *) -(* truth of ShowsSafeAt(Q, b, v) for some quorum Q ensures that v is safe *) -(* at b, so the algorithm can let an acceptor vote for v in ballot b *) -(* knowing VotesSafe will be preserved. *) -(***************************************************************************) -THEOREM ShowsSafety == - Inv => \A Q \in Quorum, b \in Ballot, v \in Value : - ShowsSafeAt(Q, b, v) => SafeAt(b, v) ------------------------------------------------------------------------------ -(***************************************************************************) -(* Finally, we get to the definition of the algorithm. The initial *) -(* predicate is obvious. *) -(***************************************************************************) -Init == /\ votes = [a \in Acceptor |-> {}] - /\ maxBal = [a \in Acceptor |-> -1] - -(***************************************************************************) -(* An acceptor `a' can increase maxBal[a] at any time. *) -(***************************************************************************) -IncreaseMaxBal(a, b) == - /\ b > maxBal[a] - /\ maxBal' = [maxBal EXCEPT ![a] = b] - /\ UNCHANGED votes - -(***************************************************************************) -(* The heart of the algorithm is the action in which an acceptor `a' votes *) -(* for a value v in ballot number b. The enabling condition contains the *) -(* following conjuncts, which ensure that the invariance of Inv is *) -(* maintained. *) -(* *) -(* - `a' cannot vote in a ballot numbered less than b *) -(* *) -(* - `a' cannot already have voted in ballot number b *) -(* *) -(* - No other acceptor can have voted for a value other than v *) -(* in ballot b. *) -(* *) -(* - Uses Theorem ShowsSafety to ensure that v is safe at b. *) -(* *) -(* In TLA+, a tuple t is a function (array) whose first element is t[1], *) -(* whose second element if t[2], and so on. Thus, a vote vt is the pair *) -(* <> *) -(***************************************************************************) -VoteFor(a, b, v) == - /\ maxBal[a] =< b - /\ \A vt \in votes[a] : vt[1] /= b - /\ \A c \in Acceptor \ {a} : - \A vt \in votes[c] : (vt[1] = b) => (vt[2] = v) - /\ \E Q \in Quorum : ShowsSafeAt(Q, b, v) - /\ votes' = [votes EXCEPT ![a] = votes[a] \cup {<>}] - /\ maxBal' = [maxBal EXCEPT ![a] = b] - -(***************************************************************************) -(* The rest of the spec is straightforward. *) -(***************************************************************************) -Next == \E a \in Acceptor, b \in Ballot : - \/ IncreaseMaxBal(a, b) - \/ \E v \in Value : VoteFor(a, b, v) - -Spec == Init /\ [][Next]_<> ------------------------------------------------------------------------------ -(***************************************************************************) -(* This theorem asserts that Inv is an invariant of the algorithm. The *) -(* high-level steps in its proof are given. *) -(***************************************************************************) -THEOREM Invariance == Spec => []Inv -<1>1. Init => Inv - -<1>2. Inv /\ [Next]_<> => Inv' - -<1>3. QED - BY <1>1, <1>2 DEF Spec ------------------------------------------------------------------------------ -(***************************************************************************) -(* This INSTANCE statement imports definitions from module Consensus into *) -(* the current module. All definition in module Consensus can be expanded *) -(* to definitions containing only TLA+ primitives and the declared names *) -(* Value and chosen. To import a definition from Consensus into the *) -(* current module, we have to say what expressions from the current module *) -(* are substituted for Value and chosen. The INSTANCE statement says that *) -(* expressions of the same name are substituted for them. (Because of *) -(* this, the WITH statement is redundant.) Note that in both modules, *) -(* Value is just a declared constant. However, in the current module, *) -(* `chosen' is an expression defined in terms of the variables votes and *) -(* maxBal while it is a variable in module consensus. The "C! ==" in the *) -(* statement means that defined identifiers are imported with "C!" *) -(* prepended to their names. Thus Spec of module Consensus is imported, *) -(* with these substitutions, as C!Spec. *) -(***************************************************************************) -C == INSTANCE Consensus - WITH Value <- Value, chosen <- chosen - -(***************************************************************************) -(* The following theorem asserts that the Voting algorithm implements the *) -(* Consensus specification, where the expression `chosen' of the current *) -(* module implements the variable `chosen' of Consensus. The high-level *) -(* steps of the the proof are also given. *) -(***************************************************************************) -THEOREM Implementation == Spec => C!Spec -<1>1. Init => C!Init - -<1>2. Inv /\ Inv' /\ [Next]_<> => [C!Next]_chosen - -<1>3. QED - BY <1>1, <1>2, Invariance DEF Spec, C!Spec - -(***************************************************************************) -(* This Voting specification comes with a TLC model named SmallModel. *) -(* That model tells TLC that Spec is the specification, that Acceptor and *) -(* Values should equal sets of model values with 3 acceptors and 2 values *) -(* and Quorums should equal the indicated set of values, and that it *) -(* should check theorems Invariance and Implementation. Observe that you *) -(* can't tell TLC simply to check those theorems; you have to tell TLC to *) -(* check the properties the theorems assert that Spec satisfies. (Instead *) -(* of telling TLC that Inv should be an invariant, you can tell it that *) -(* the spec should satisfy the temporal property []Inv.) *) -(* *) -(* Even though the constants are finite sets, the spec has infinitely many *) -(* reachable sets because a ballot number can be any element of the set *) -(* Nat of natural numbers. The model modifies the spec so it has a finite *) -(* set of reachable states by using a definition override (on the Spec *) -(* Options page) to redefine Ballot to equal 0..2. (Alternatively, we *) -(* could override the definition of Nat to equal 0..2.) *) -(* *) -(* Run TLC on the model. It should just take a couple of seconds. *) -(* *) -(* After doing that, show why the assumption that any pair of quorums has *) -(* an element in common is necessary by modifying the model so that *) -(* assumption doesn't hold. (It's best to clone SmallModel and modify the *) -(* clone.) Since TLC reports an error if an assumption isn't true, you *) -(* will have to comment out the second conjunct of the ASSUME statement, *) -(* which asserts that assumption. Comments can be written as follows: *) -(* *) -(* \* This is an end-of-line comment. *) -(* *) -(* (* This is another way to write a comment. *) -(* Note that comments can be nested. *) *) -(* *) -(* To help you see what the problem is, use the Trace Explorer on the *) -(* Error page to show the value of `chosen' in each state of the trace. *) -(***************************************************************************) -============================================================================= diff --git a/specifications/PaxosHowToWinATuringAward/Voting.toolbox/Voting.pdf b/specifications/PaxosHowToWinATuringAward/Voting.toolbox/Voting.pdf deleted file mode 100644 index d3167c0fddea20bb965a29a90e59c5c34ef24da0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 182660 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
aP1BU-fXi!M(uxt)Yb7uP- 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -