Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Retain all signatures during a soft rollback #5749

Merged
merged 28 commits into from
Oct 25, 2023

Conversation

eddyashton
Copy link
Member

Following #5674 (comment).

Includes a scenario that reproduces the failure (and will act as a regression test going forward), and a modification to raft.h to resolve the failure.

This issue was introduced by my change in #3971. Prior to that, committable_indices had meant "all signature transactions", and so last_committable_index() was "last signature". To avoid committing entries from prior terms, we changed the meaning of committable_indices to mean only "signatures from the current term". Uses of last_committable_index() which required the last signature (such as in this "soft rollback") were now incorrect.

"Soft rollback" is not a term we use in the code, but I think is a helpful concept here. We call rollback() in 2 scenarios: when we become aware of a new term, and when we receive an AppendEntries which conflicts with our ledger. The latter is a "hard rollback", in that it can remove any entry up to our commit index - we have a signal from a primary that this is safe to discard, and discarding may be necessary to resync with the primary. The former is a much softer signal, and all we intend to do here is drop unsigned state so that we reason purely about signed state in future.

Opening as a draft to gauge test coverage, and while I triage other uses of last_committable_index().

@achamayou
Copy link
Member

Excellent find!

"Soft rollback" is not a term we use in the code, but I think is a helpful concept here. We call rollback() in 2 scenarios: when we become aware of a new term, and when we receive an AppendEntries which conflicts with our ledger. The latter is a "hard rollback", in that it can remove any entry up to our commit index - we have a signal from a primary that this is safe to discard, and discarding may be necessary to resync with the primary. The former is a much softer signal, and all we intend to do here is drop unsigned state so that we reason purely about signed state in future.

I think of "soft rollback" as "rollback_uncommittable_suffix()" and "hard rollback" as "rollback_conflicting_suffix()", which can roll back some committable (but obviously not committed) entries as well.

@ccf-bot
Copy link
Collaborator

ccf-bot commented Oct 20, 2023

soft_rollback_retains_signatures@77781 aka 20231025.14 vs main ewma over 20 builds from 77052 to 77722

Click to see table

main

build_id build_number pi_basic_mt_sgx_cft^ pi_basic_mt_sgx_cft_mem Commit latency factor tpcc_sgx_cft^ tpcc_sgx_cft_mem pi_basic_mt_virtual_cft^ tpcc_virtual_cft^ ls_virtual_cft^ ls_sgx_cft^ ls_sgx_cft_mem pi_ls_virtual_cft^ pi_ls_sgx_cft^ pi_ls_sgx_cft_mem pi_basic_virtual_cft^ pi_basic_sgx_cft^ pi_basic_sgx_cft_mem pi_basic_js_virtual_cft^ ls_jwt_virtual_cft^ pi_ls_jwt_virtual_cft^ ls_js_virtual_cft^ ls_full_js_virtual_cft^ pi_basic_js_sgx_cft^ pi_basic_js_sgx_cft_mem ls_js_jwt_virtual_cft^ ls_jwt_sgx_cft^ ls_jwt_sgx_cft_mem pi_ls_jwt_sgx_cft^ pi_ls_jwt_sgx_cft_mem ls_js_sgx_cft^ ls_js_sgx_cft_mem ls_full_js_sgx_cft^ ls_full_js_sgx_cft_mem hist_sgx_cft^ ls_js_jwt_sgx_cft^ ls_js_jwt_sgx_cft_mem RB put (/s)^ CHAMP put (/s)^ RB get (/s)^ CHAMP get (/s)^
77052 20231010.17 27851.7 2.51822e+07 0.805827 5614.03 8.59996e+07 87071.8 17123.9 45707.2 14004.1 1.88908e+07 48521.1 14072.2 1.05021e+07 53548.8 15532.7 1.25993e+07 4435.4 17238.9 19725.4 17064.9 16932.1 1434.8 1.25993e+07 9900.42 6879.16 1.88908e+07 6931.4 6.30784e+06 5811.67 1.67936e+07 5725.25 1.88908e+07 39661.9 3978.87 1.67936e+07 835356 1.17508e+06 8.12795e+06 3.02453e+07
77065 20231010.21 27866.2 2.51822e+07 0.805254 5593.79 8.59996e+07 76791.9 17453.5 45981.3 13984.2 1.88908e+07 47639.7 14076.6 1.05021e+07 53782.5 15457.8 1.46964e+07 4471.3 17159.7 19727 17221.9 16835.2 1431.7 1.25993e+07 9888.21 6839.77 1.67936e+07 6882.8 6.30784e+06 5802.59 1.67936e+07 5713.9 1.67936e+07 47354.4 3982.91 1.67936e+07 831464 1.17023e+06 8.14609e+06 3.06028e+07
77080 20231011.6 28231.3 2.30851e+07 0.805739 5614.98 8.59996e+07 77100.4 17356.8 45541.3 14016.4 1.67936e+07 47443.3 14058.7 1.05021e+07 53459.3 15607.1 1.25993e+07 4480.6 17192.9 19626.7 16932.3 16704.5 1435.6 1.25993e+07 9841.59 6865.39 1.88908e+07 6917 6.30784e+06 5768.86 1.67936e+07 5749.11 1.67936e+07 44338.6 3974.5 1.67936e+07 839572 1.1863e+06 8.14557e+06 3.07489e+07
77087 20231011.8 27891.2 2.51822e+07 0.821071 5620.28 8.59996e+07 83135 17648.9 45716.6 14043.4 1.88908e+07 48214.1 14129.4 1.05021e+07 53475.5 15619 1.46964e+07 4431.6 17316.9 19004.2 17758.2 16880.7 1427.7 1.25993e+07 9849.81 6872.29 1.67936e+07 7079.7 6.30784e+06 5780.82 1.67936e+07 5765.08 1.67936e+07 40652.5 3974.44 1.67936e+07 827510 1.16961e+06 8.14036e+06 3.30899e+07
77124 20231011.20 27859.9 2.51822e+07 0.810686 5576.3 8.59996e+07 81677.3 17272.2 45763.1 13934.9 1.88908e+07 48479 14029.2 1.05021e+07 54961.6 15421.8 1.25993e+07 4431 17497.2 19917.1 17216.9 16806.9 1419.9 1.25993e+07 9875.23 6782.48 1.67936e+07 7028.9 6.30784e+06 5759.88 1.67936e+07 5495.58 1.88908e+07 42920 3980.45 1.67936e+07 829281 1.17704e+06 8.02253e+06 3.09324e+07
77138 20231011.24 27788.7 2.51822e+07 0.817166 5505.15 8.59996e+07 79701.7 17450.2 43714.5 13944.3 1.88908e+07 47439 14007.9 1.05021e+07 54645.3 15414.3 1.46964e+07 4386.8 16999.7 19561.8 17388.6 14746.3 1420.9 1.25993e+07 9915 6826.31 1.88908e+07 6933.7 6.30784e+06 5805.03 1.67936e+07 5491.25 1.67936e+07 39122 3992.65 1.67936e+07 838714 1.18152e+06 8.09934e+06 3.09754e+07
77148 20231012.2 28066.3 2.51822e+07 0.806977 5622.22 8.59996e+07 88890.3 17218.1 46048.4 14012.7 1.88908e+07 48655.6 14136.8 1.05021e+07 55217 15607.9 1.25993e+07 4449.2 17077.4 19720.8 17064.5 15135.1 1437.4 1.25993e+07 9799.03 6885.22 1.88908e+07 6981.9 6.30784e+06 5813.57 1.67936e+07 5723.57 1.88908e+07 45326.3 4000.45 1.67936e+07 828634 1.17897e+06 8.14758e+06 3.07383e+07
77236 20231016.5 27858.7 2.51822e+07 0.79596 5620.83 8.59996e+07 59377 17148.6 45783.9 13995.4 1.88908e+07 48719.4 14108.1 1.05021e+07 54902.8 15609.7 1.46964e+07 4441 17077.1 18804.1 17198.3 15291.6 1442 1.25993e+07 9993.77 6827.74 1.67936e+07 7065.1 6.30784e+06 5817.83 1.67936e+07 5743.02 1.67936e+07 44154.4 4006.32 1.67936e+07 838342 1.17813e+06 8.15154e+06 3.18804e+07
77284 20231016.20 27801.1 2.30851e+07 0.800376 5523.42 8.59996e+07 76928.2 17222.7 45566.9 13858.5 1.88908e+07 48808.1 14093.4 1.05021e+07 54701.8 15419 1.46964e+07 4442.5 17018.1 19157.5 17650.8 14639.8 1423.4 1.05021e+07 9852.83 6815.4 1.88908e+07 6872.8 6.30784e+06 5802.5 1.67936e+07 5472.72 1.67936e+07 43502.1 3973.37 1.67936e+07 833609 1.17767e+06 8.15537e+06 3.06513e+07
77294 20231016.23 27413.6 2.51822e+07 0.822085 5504.43 8.59996e+07 84572 17297.3 45995.1 14028.1 1.88908e+07 48594.2 14087.6 1.05021e+07 53897 15527 1.46964e+07 4439.9 17262.3 19125.2 17406.6 14896.4 1420.2 1.05021e+07 9812.12 6819.85 1.88908e+07 6931.4 6.30784e+06 5754.38 1.67936e+07 5710.32 1.67936e+07 41300 3992.44 1.67936e+07 823461 1.17985e+06 8.1493e+06 3.05375e+07
77306 20231017.4 27907.4 2.30851e+07 0.806546 5649.91 8.59996e+07 60982.9 17275.1 46102.1 13997.7 1.88908e+07 47686.9 14120.3 1.05021e+07 53983.1 15513.7 1.46964e+07 4424.7 17066.2 19713 14599.9 14833.6 1427.4 1.25993e+07 9890.99 6895.99 1.67936e+07 6972.2 6.30784e+06 5811.89 1.67936e+07 5778.4 1.67936e+07 45776.1 4010.44 1.67936e+07 832093 1.181e+06 8.15615e+06 3.10764e+07
77410 20231019.5 27911.2 2.30851e+07 0.79845 5633.52 8.59996e+07 89839.8 17335.1 43709 14034.4 1.88908e+07 47970.1 14172.6 1.05021e+07 54598 15641.4 1.25993e+07 4449.7 17103.2 19628.2 14821.2 14920.8 1439.9 1.25993e+07 9802.6 6838.11 1.67936e+07 7046.5 6.30784e+06 5772.37 1.67936e+07 5751.39 1.67936e+07 42755.2 4007.97 1.67936e+07 840034 1.18128e+06 8.17441e+06 3.06839e+07
77459 20231020.5 27942.3 2.51822e+07 0.806882 5609.6 8.59996e+07 83682.7 17271.7 45556.9 14027.3 1.88908e+07 48282.6 14086.4 1.05021e+07 53165.7 15436.7 1.46964e+07 4426.2 17066.3 17662.5 16990.3 14844.7 1431.9 1.25993e+07 9889.88 6873.38 1.88908e+07 6974.5 6.30784e+06 5805.89 1.67936e+07 5491.04 1.67936e+07 42113.3 3972.9 1.67936e+07 830635 1.18094e+06 8.16668e+06 3.0923e+07
77461 20231020.6 27968.8 2.30851e+07 0.797578 5645.01 8.59996e+07 86522.6 17246.7 45887.8 13956.1 1.88908e+07 48453.6 14152 1.05021e+07 54176.2 15499.4 1.46964e+07 4426.2 17079.1 19435.2 15003.7 14699.8 1437.7 1.25993e+07 9770.09 7235.96 1.67936e+07 7078.7 6.30784e+06 5801.29 1.67936e+07 5742.38 1.67936e+07 43030.2 3995.17 1.67936e+07 825201 1.1798e+06 8.16489e+06 3.14443e+07
77485 20231020.14 27955.5 2.51822e+07 0.827982 5614.45 8.59996e+07 67488.2 17203.3 45720.2 14042.3 1.67936e+07 47505.9 14155.3 1.05021e+07 52771.4 15587 1.46964e+07 4441 17168.5 19652.2 16950.7 14720 1441.5 1.25993e+07 9771.33 7220.81 1.67936e+07 6925.4 6.30784e+06 5824.33 1.67936e+07 5745.31 1.67936e+07 46913.9 3980.22 1.67936e+07 831368 1.1798e+06 8.12782e+06 3.08955e+07
77532 20231020.31 27967.5 2.51822e+07 0.835073 5614.22 8.59996e+07 60943.5 17092.6 43713.6 14001.1 1.88908e+07 47796.6 14174.9 1.05021e+07 52609.1 15520.9 1.46964e+07 4332.3 17195.4 19336.7 17022.6 14750.8 1429.6 1.25993e+07 10188.5 7252.76 1.67936e+07 7086.5 6.30784e+06 5806.4 1.67936e+07 5491.29 1.67936e+07 40351.5 4001.82 1.67936e+07 833120 1.18235e+06 8.17343e+06 3.12829e+07
77555 20231023.5 28238.2 2.51822e+07 0.816011 5639.66 8.59996e+07 74767.3 17264.2 45924.9 14029.3 1.88908e+07 47674 14118.1 1.05021e+07 53843.3 15640.2 1.46964e+07 4365.2 17152.3 19152.3 17286.3 14910.6 1432.7 1.25993e+07 10169.6 7273.33 1.67936e+07 6953.5 6.30784e+06 5781.01 1.67936e+07 5742.5 1.67936e+07 43068.6 3995.51 1.67936e+07 829052 1.18151e+06 8.148e+06 3.09408e+07
77584 20231023.15 27775.2 2.51822e+07 0.839543 5525.06 8.59996e+07 63643 17237.3 43785.4 13936 1.88908e+07 47940.2 13990.4 1.05021e+07 54114.3 15424.6 1.46964e+07 4430 17010.7 19396.4 17307.2 14810.6 1427 1.25993e+07 9823.55 6853.5 1.88908e+07 6881.2 6.30784e+06 5758.93 1.67936e+07 5762.09 1.67936e+07 42679.4 3983.52 1.67936e+07 825381 1.18095e+06 8.16893e+06 3.13159e+07
77665 20231024.10 28077.5 2.30851e+07 0.782853 5565 8.59996e+07 71956.1 17332.4 43627.5 13918.6 1.88908e+07 47460.4 14015.8 1.05021e+07 55764.1 15439.4 1.46964e+07 4480.7 16984.5 19600.5 17210.4 15032.4 1417.5 1.25993e+07 9934.79 6827.52 1.88908e+07 6933.8 6.30784e+06 5759.87 1.67936e+07 5778.73 1.67936e+07 42277.7 3994.77 1.67936e+07 837727 1.17659e+06 8.1335e+06 3.08424e+07
77722 20231024.29 28002.9 2.51822e+07 0.808583 5477.83 8.59996e+07 68825.6 17482.9 43910 13980.7 1.88908e+07 47389.3 14011.7 1.05021e+07 55105.8 15103.3 1.46964e+07 4422.3 16897.2 19100.4 17082.1 15051.5 1409.7 1.25993e+07 9901.25 6842.46 1.88908e+07 6811.8 6.30784e+06 5772.89 1.67936e+07 5489.45 1.67936e+07 43837.6 4013.18 1.67936e+07 824014 1.17985e+06 8.16421e+06 3.03628e+07

soft_rollback_retains_signatures

build_id build_number pi_basic_mt_virtual_cft^ pi_basic_mt_sgx_cft^ pi_basic_mt_sgx_cft_mem Commit latency factor tpcc_virtual_cft^ ls_virtual_cft^ pi_ls_virtual_cft^ pi_basic_virtual_cft^ tpcc_sgx_cft^ tpcc_sgx_cft_mem pi_basic_js_virtual_cft^ ls_jwt_virtual_cft^ pi_ls_jwt_virtual_cft^ ls_js_virtual_cft^ ls_full_js_virtual_cft^ ls_sgx_cft^ ls_sgx_cft_mem pi_ls_sgx_cft^ pi_ls_sgx_cft_mem ls_js_jwt_virtual_cft^ pi_basic_sgx_cft^ pi_basic_sgx_cft_mem pi_basic_js_sgx_cft^ pi_basic_js_sgx_cft_mem hist_sgx_cft^ ls_jwt_sgx_cft^ ls_jwt_sgx_cft_mem pi_ls_jwt_sgx_cft^ pi_ls_jwt_sgx_cft_mem ls_js_sgx_cft^ ls_js_sgx_cft_mem ls_full_js_sgx_cft^ ls_full_js_sgx_cft_mem ls_js_jwt_sgx_cft^ ls_js_jwt_sgx_cft_mem RB put (/s)^ CHAMP put (/s)^ RB get (/s)^ CHAMP get (/s)^
77714 20231024.26 76819.6 27633 2.30851e+07 0.785967 17522.9 45739.6 49153.6 55092.6 5478.52 8.59996e+07 4382.2 17065 19533.5 17482.9 15053.9 13952.2 1.88908e+07 14121.8 1.05021e+07 9933.53 15525.3 1.25993e+07 1433.6 1.25993e+07 44391.4 6829.67 1.67936e+07 6922.7 6.30784e+06 5763.86 1.67936e+07 5734.77 1.67936e+07 3991.42 1.67936e+07 827489 1.17654e+06 8.17001e+06 3.25203e+07
77735 20231024.33 65129.1 26821.5 2.51822e+07 0.795532 17139.1 43600.5 46136.7 53227.8 5627.46 8.59996e+07 4275.6 17333.9 18948.7 17370.3 14817.8 14127.6 1.67936e+07 14227.2 1.05021e+07 10416.8 15725.8 1.46964e+07 1439.1 1.25993e+07 44511.3 6872.7 1.88908e+07 6971.9 6.30784e+06 5815.92 1.67936e+07 5755.35 1.67936e+07 3981.37 1.67936e+07 823411 1.17309e+06 8.13728e+06 3.10717e+07
77757 20231025.5 85251.5 27955 2.51822e+07 0.792144 17244.9 45634.9 47472.6 54238.6 5590.45 8.59996e+07 4410.1 17080.4 19408.8 17380.1 14602.5 14068.1 1.88908e+07 14147.2 1.05021e+07 10387.7 15621.9 1.46964e+07 1436.1 1.25993e+07 46328.2 6802.8 1.67936e+07 6941.2 6.30784e+06 5763.44 1.67936e+07 5777.6 1.67936e+07 3999.43 1.67936e+07 830136 1.18247e+06 8.15316e+06 3.06908e+07
77768 20231025.9 65249.6 27959.9 2.51822e+07 0.771476 17282.3 45886.3 47910.2 54019.3 5532.2 8.59996e+07 4360 17143.7 19086.5 14737.1 14787 13972.1 1.88908e+07 14050.4 1.05021e+07 10298.3 15376.3 1.46964e+07 1420 1.25993e+07 43333.8 6805.3 1.88908e+07 6994.3 6.30784e+06 5748.88 1.67936e+07 5473.42 1.67936e+07 3982.25 1.67936e+07 833970 1.18199e+06 8.14414e+06 3.06849e+07
77781 20231025.14 77214.3 27916 2.30851e+07 0.816939 17248.2 45778.6 37278.4 54370.2 5639.9 8.59996e+07 4408 17336.4 19624.4 17430.9 14627.3 14046.2 1.88908e+07 14154.2 1.05021e+07 10243.3 15588.2 1.46964e+07 1434.3 1.25993e+07 44733.8 6857.99 1.88908e+07 6949.2 6.30784e+06 5774.83 1.67936e+07 5742.01 1.67936e+07 4004.89 1.67936e+07 833629 1.18387e+06 8.15394e+06 3.07097e+07

images

@eddyashton
Copy link
Member Author

triage other uses of last_committable_index()

I found 4 other uses:

  • In get_previous_committable_seqno(). This appears to never be called, so I've simply removed it (in bee25e6)
  • In execute_append_entries_finish(), used to correct the view history. I think that this is safe, because it's done under the same lock as the AE batch is processed, so last_committable_index() == last_signature_index, but believe this really intends to use last_signature_index
  • In send_request_vote() and (I believe roughly symmetrically) in recv_request_vote(), to determine where we call elections and how we respond. I'm wary that these may have the same issue, but don't want to make changes until I have a repro scenario.
  • In become_leader(), to update election_index. election_index should be demoted from member to local variable, and then I think it could be removed. I don't think we ever need to rollback in become_leader - we should have abandoned unsigned state when we became either Follower or Candidate, and we must have moved to Candidate and accepted no unsigned state since to become Leader.

Summing that up, I think it's viable to remove last_committable_index() entirely, and then the only users of committable_indices.back() are in rollback(). I'm wavering on whether that (potentially unnecessary) larger cleanup goes in this PR, or we keep it minimal, but since I also need to resolve a Tracing failure to merge this I think the PR is larger than the minimal fix anyway, so may as well be full-throated.

@eddyashton
Copy link
Member Author

In send_request_vote() and (I believe roughly symmetrically) in recv_request_vote(), to determine where we call elections and how we respond. I'm wary that these may have the same issue, but don't want to make changes until I have a repro scenario.

This was unsafe, and a small extension (87495bf) to the new scenario makes this clear. All of those new asserts failed when the vote functions above used last_committable_index(), but pass (and do what I expect) with last_signature. I'm tempted to go further, to state->last_idx, but will only do so if I can convince myself there's a safety distinction between the 2.

I've made the further changes described in the comment above, and removed last_committable_index() entirely from the implementation. I'll look at making similar alterations to keep the spec in line, but the MVP for merging this is restoring trace matching.

@eddyashton
Copy link
Member Author

One of the changes above was too aggressive, and several tests are now failing. Will investigate that shortly.

Right now I'm trying to get the new scenario to Trace Validate correctly. First it fails at an emit_signature step, because of the following activation condition in ccfraft.tla:SignCommittableMessages:

    \* Make sure the leader does not create two signatures in a row
    /\ Last(log[i]).contentType # TypeSignature

I think this should be removed - its not a safety requirement, and we can produce valid scenarios/traces consisting purely of adjacent signatures. However, I thought this could also be trivially worked around by adding a replicate step to the scenario, yet that causes a further TLC error. trying to diagnose that:

: Attempted to access index 76 of tuple
#<<[msg |-> ...>>
which is out of bounds.

50. Line 221, column 27 to line 221, column 33 in Traceccfraft
51. Line 115, column 5 to line 115, column 15 in Traceccfraft

I think the problem is this:

    /\ committableIndices[logline.msg.state.node_id]' = Range(logline'.msg.committable_indices)

Attempting to use logline', which isn't valid if we're matching the last log line (eg - if the final line of the scenario is emit_signature). Can work around both of these in the scenario, will propose patches to the TLA later.

src/consensus/aft/raft.h Outdated Show resolved Hide resolved
@eddyashton eddyashton marked this pull request as ready for review October 20, 2023 15:17
@eddyashton eddyashton requested a review from a team as a code owner October 20, 2023 15:17
@eddyashton eddyashton added the tla TLA+ specifications label Oct 20, 2023
@lemmy
Copy link
Contributor

lemmy commented Oct 20, 2023

[...] However, I thought this could also be trivially worked around by adding a replicate step to the scenario, yet that causes a further TLC error. trying to diagnose that:

: Attempted to access index 76 of tuple
#<<[msg |-> ...>>
which is out of bounds.

50. Line 221, column 27 to line 221, column 33 in Traceccfraft
51. Line 115, column 5 to line 115, column 15 in Traceccfraft

I think the problem is this:

    /\ committableIndices[logline.msg.state.node_id]' = Range(logline'.msg.committable_indices)

Attempting to use logline', which isn't valid if we're matching the last log line (eg - if the final line of the scenario is emit_signature). Can work around both of these in the scenario, will propose patches to the TLA later.

@eddyashton Need/want help with this one?

@eddyashton
Copy link
Member Author

After discussion with @achamayou, we've gone for a simpler fix for this case. We've removed the committable_indices.clear() entirely. The committable_indices collection now has its original semantics, remembering all signature transactions more recent than commit_idx. We implement the "only commit entries from your own term" more explicitly, at the commit point - check if the entry you're about to commit is in the current term!

Its feasible to track the "committable because they're in my term" entries by construction, but there are several edge cases to consider including a potential liveness-of-commit-knowledge gap. Rather than trying to unpick these, and coming up with appropriate naming to distinguish the cases, its simpler and cleaner to make a small modification to the commit logic to rediscover the value there. In short, remembering all signatures means we definitely have the information we need, and any clearance of this structure is tricky to confirm as safe.

@lemmy lemmy added this to the TLA+ Trace Validation milestone Oct 23, 2023
src/consensus/aft/raft.h Outdated Show resolved Hide resolved
src/consensus/aft/raft.h Outdated Show resolved Hide resolved
src/consensus/aft/raft.h Outdated Show resolved Hide resolved
src/consensus/aft/raft.h Outdated Show resolved Hide resolved
@eddyashton eddyashton enabled auto-merge (squash) October 25, 2023 10:51
@eddyashton eddyashton merged commit 27b44fa into microsoft:main Oct 25, 2023
25 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
tla TLA+ specifications
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants