Skip to content
Merged
10 changes: 10 additions & 0 deletions .github/workflows/ci-verification.yml
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,16 @@ jobs:
- run: cd tla && ./tlc.py mc consistency/MCMultiNode.tla
- run: cd tla && ./tlc.py mc consistency/MCMultiNodeReads.tla
- run: cd tla && ./tlc.py mc consistency/MCMultiNodeReadsAlt.tla
# These traces are hard-coded because generating rollbacks requires a
# partitions test, where election and transaction timing are difficult
# to control deterministically.
- name: Validate consistency election traces
run: |
cd tla
for trace in consistency/traces/*.ndjson; do
echo "Validating ${trace}"
JSON="${trace}" ./tlc.py --workers 1 tv --disable-dfs consistency/TraceMultiNodeReads.tla
done

- name: Upload TLC traces
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
Expand Down
9 changes: 8 additions & 1 deletion tla/consistency/TraceMultiNodeReads.tla
Original file line number Diff line number Diff line change
Expand Up @@ -160,8 +160,15 @@ BackfillLedgerBranches ==
\* Similar to TruncateLedgerAction, but only advances the view
/\ LET view == logline.tx_id[1]
seqno == logline.tx_id[2]
sourceBranch == Last(ledgerBranches)
prefixLength == Min({seqno - 1, Len(sourceBranch)})
IN /\ Len(ledgerBranches) < view
/\ ledgerBranches' = Append(ledgerBranches, Last(ledgerBranches))
\* A new primary may reuse seqno after rolling back an uncommitted
\* suffix. Copying that suffix would prevent the logged transaction
\* from occupying seqno in the new view.
/\ ledgerBranches' = Append(
ledgerBranches,
SubSeq(sourceBranch, 1, prefixLength))
/\ UNCHANGED history

TraceNext ==
Expand Down
8 changes: 8 additions & 0 deletions tla/consistency/traces/election_no_rollback.ndjson
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{"action":"RwTxRequestAction","type":"RwTxRequest","tx":0}
{"action":"RwTxExecuteAction","type":"RwTxExecute","tx":0,"tx_id":[2,10]}
{"action":"RwTxResponseAction","type":"RwTxResponse","tx":0,"tx_id":[2,10]}
{"action":"StatusCommittedResponseAction","type":"TxStatusReceived","tx_id":[2,10],"status":"CommittedStatus"}
{"action":"RwTxRequestAction","type":"RwTxRequest","tx":1}
{"action":"RwTxExecuteAction","type":"RwTxExecute","tx":1,"tx_id":[3,11]}
{"action":"RwTxResponseAction","type":"RwTxResponse","tx":1,"tx_id":[3,11]}
{"action":"StatusCommittedResponseAction","type":"TxStatusReceived","tx_id":[3,11],"status":"CommittedStatus"}
8 changes: 8 additions & 0 deletions tla/consistency/traces/election_non_contiguous_view.ndjson
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{"action":"RwTxRequestAction","type":"RwTxRequest","tx":0}
{"action":"RwTxExecuteAction","type":"RwTxExecute","tx":0,"tx_id":[2,10]}
{"action":"RwTxResponseAction","type":"RwTxResponse","tx":0,"tx_id":[2,10]}
{"action":"StatusCommittedResponseAction","type":"TxStatusReceived","tx_id":[2,10],"status":"CommittedStatus"}
{"action":"RwTxRequestAction","type":"RwTxRequest","tx":1}
{"action":"RwTxExecuteAction","type":"RwTxExecute","tx":1,"tx_id":[5,11]}
{"action":"RwTxResponseAction","type":"RwTxResponse","tx":1,"tx_id":[5,11]}
{"action":"StatusCommittedResponseAction","type":"TxStatusReceived","tx_id":[5,11],"status":"CommittedStatus"}
11 changes: 11 additions & 0 deletions tla/consistency/traces/rollback_same_seqno.ndjson
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{"action":"RwTxRequestAction","type":"RwTxRequest","tx":0}
{"action":"RwTxExecuteAction","type":"RwTxExecute","tx":0,"tx_id":[2,10]}
{"action":"RwTxResponseAction","type":"RwTxResponse","tx":0,"tx_id":[2,10]}
{"action":"StatusCommittedResponseAction","type":"TxStatusReceived","tx_id":[2,10],"status":"CommittedStatus"}
{"action":"RwTxRequestAction","type":"RwTxRequest","tx":1}
{"action":"RwTxExecuteAction","type":"RwTxExecute","tx":1,"tx_id":[2,11]}
{"action":"RwTxResponseAction","type":"RwTxResponse","tx":1,"tx_id":[2,11]}
{"action":"StatusInvalidResponseAction","type":"TxStatusReceived","tx_id":[2,11],"status":"InvalidStatus"}
{"action":"RwTxRequestAction","type":"RwTxRequest","tx":2}
{"action":"RwTxExecuteAction","type":"RwTxExecute","tx":2,"tx_id":[3,11]}
{"action":"RwTxResponseAction","type":"RwTxResponse","tx":2,"tx_id":[3,11]}
16 changes: 16 additions & 0 deletions tla/consistency/traces/rollback_two_transactions.ndjson
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{"action":"RwTxRequestAction","type":"RwTxRequest","tx":0}
{"action":"RwTxExecuteAction","type":"RwTxExecute","tx":0,"tx_id":[2,10]}
{"action":"RwTxResponseAction","type":"RwTxResponse","tx":0,"tx_id":[2,10]}
{"action":"StatusCommittedResponseAction","type":"TxStatusReceived","tx_id":[2,10],"status":"CommittedStatus"}
{"action":"RwTxRequestAction","type":"RwTxRequest","tx":1}
{"action":"RwTxExecuteAction","type":"RwTxExecute","tx":1,"tx_id":[2,11]}
{"action":"RwTxResponseAction","type":"RwTxResponse","tx":1,"tx_id":[2,11]}
{"action":"RwTxRequestAction","type":"RwTxRequest","tx":2}
{"action":"RwTxExecuteAction","type":"RwTxExecute","tx":2,"tx_id":[2,12]}
{"action":"RwTxResponseAction","type":"RwTxResponse","tx":2,"tx_id":[2,12]}
{"action":"StatusInvalidResponseAction","type":"TxStatusReceived","tx_id":[2,11],"status":"InvalidStatus"}
{"action":"StatusInvalidResponseAction","type":"TxStatusReceived","tx_id":[2,12],"status":"InvalidStatus"}
{"action":"RwTxRequestAction","type":"RwTxRequest","tx":3}
{"action":"RwTxExecuteAction","type":"RwTxExecute","tx":3,"tx_id":[3,11]}
{"action":"RwTxResponseAction","type":"RwTxResponse","tx":3,"tx_id":[3,11]}
{"action":"StatusCommittedResponseAction","type":"TxStatusReceived","tx_id":[3,11],"status":"CommittedStatus"}