forked from Azure/azure-cosmos-tla
-
Notifications
You must be signed in to change notification settings - Fork 5
/
show521677.tla
128 lines (98 loc) · 3.79 KB
/
show521677.tla
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
---- MODULE show521677 ----
EXTENDS TLC, Naturals, Sequences
CONSTANTS StrongConsistency, BoundedStaleness,
SessionConsistency, ConsistentPrefix,
EventualConsistency
CONSTANTS VersionBound, StalenessBound
VARIABLES log, commitIndex, readIndex, epoch, WriteConsistencyLevel
Keys == {"taskKey"}
Values == {"taskValue"}
NoValue == "NoValue"
VARIABLES network, returnAddrMap
ClientIDs == {"frontdoor", "worker"}
SystemID == "SystemID"
clientVarsExceptNetwork == <<log, commitIndex, readIndex, epoch, WriteConsistencyLevel, returnAddrMap>>
clientVars == <<clientVarsExceptNetwork, network>>
Client == INSTANCE CosmosDBClient WITH
NetworkIsLossy <- FALSE,
ModelFailure <- FALSE
---------------------------------------------------------------------
TypesOK == Client!TypesOK
VARIABLE serviceBus, frontdoorPC, frontdoorToken, workerPC, workerToken, workerValue
specVars == <<serviceBus, frontdoorPC, frontdoorToken, workerPC, workerToken, workerValue>>
vars == <<clientVars, specVars>>
frontdoorWriteTaskDataSend ==
/\ frontdoorPC = "frontdoorWriteTaskDataSend"
/\ Client!RequestWrite("frontdoor", "taskKey", "taskValue", frontdoorToken)
/\ frontdoorPC' = "frontdoorWriteTaskDataReceive"
/\ UNCHANGED <<clientVarsExceptNetwork, serviceBus, frontdoorToken, workerPC, workerToken, workerValue>>
frontdoorWriteTaskDataReceive ==
/\ frontdoorPC = "frontdoorWriteTaskDataReceive"
/\ Client!ReceiveWriteResult("frontdoor")
/\ frontdoorToken' = Client!ReceivedWriteToken("frontdoor")
/\ serviceBus' = <<"taskKey">>
/\ frontdoorPC' = "Done"
/\ UNCHANGED <<clientVarsExceptNetwork, workerPC, workerToken, workerValue>>
frontdoorDone ==
/\ frontdoorPC = "Done"
/\ UNCHANGED vars
workerBeginTaskSend ==
/\ workerPC = "workerBeginTaskSend"
/\ serviceBus # <<>>
/\ LET taskKey == Head(serviceBus)
IN /\ serviceBus' = Tail(serviceBus)
/\ Client!RequestRead("worker", taskKey, SessionConsistency, workerToken)
/\ workerPC' = "workerBeginTaskReceive"
/\ UNCHANGED <<clientVarsExceptNetwork, frontdoorToken, frontdoorPC, workerToken, workerValue>>
workerBeginTaskReceive ==
/\ workerPC = "workerBeginTaskReceive"
/\ Client!ReceiveReadResult("worker")
/\ workerToken' = Client!ReceivedReadToken("worker")
/\ workerValue' = Client!ReceivedRead("worker")
/\ workerPC' = "Done"
/\ UNCHANGED <<clientVarsExceptNetwork, serviceBus, frontdoorToken, frontdoorPC>>
workerDone ==
/\ workerPC = "Done"
/\ UNCHANGED vars
---------------------------------------------------------------------
Init ==
/\ WriteConsistencyLevel = SessionConsistency
/\ serviceBus = <<>>
/\ frontdoorPC = "frontdoorWriteTaskDataSend"
/\ frontdoorToken = Client!NoSessionToken
/\ workerPC = "workerBeginTaskSend"
/\ workerToken = Client!NoSessionToken
/\ workerValue = NoValue
/\ Client!Init
frontdoor ==
\/ frontdoorWriteTaskDataSend
\/ frontdoorWriteTaskDataReceive
\/ frontdoorDone
worker ==
\/ workerBeginTaskSend
\/ workerBeginTaskReceive
\/ workerDone
client ==
/\ Client!Next
/\ UNCHANGED specVars
Next ==
\/ frontdoor
\/ worker
\/ client
Spec == /\ Init /\ [][Next]_vars
/\ WF_vars(frontdoor)
/\ WF_vars(worker)
/\ WF_vars(client)
---------------------------------------------------------------------
SpecificStateSpace ==
\* Don't model data loss. It is not needed, and it allows a session
\* token to expire after being acquired. Handling that would
\* complicate this spec.
/\ epoch = 1
---------------------------------------------------------------------
Termination ==
<>(/\ frontdoorPC = "Done"
/\ workerPC = "Done")
WorkerReceivesCorrectValue ==
workerPC = "Done" => workerValue = "taskValue"
====