Numbers from the laptop (i7-1270P, Docker Desktop on WSL2, a Samsung PM9A1 NVMe), five nodes in containers, each result committed with the code that produced it. The design notes behind them, including what didn't work, are in the repository.
How long a succession takes
The Don is killed with SIGKILL under 200 writes a second, ten times per election timeout. The gap is the widest silence between two acknowledged writes, as a client sees it.
| election timeout | clients waited, median | range | new Don chosen after |
|---|---|---|---|
| 150ms | 204 ms | 181 ms – 249 ms | 174 ms |
| 300ms | 388 ms | 340 ms – 436 ms | 351 ms |
| 600ms | 720 ms | 645 ms – 853 ms | 694 ms |
| 1s | 1,306 ms | 1,041 ms – 2,005 ms | 1,270 ms |
How long a dead service stays listed
An instance registered with a 2 s lease is killed, and a client watching the registry times how long it still sees it. A new Don gives every lease its full time again, so losing the Don as well adds an election.
| what died | median | min | max | kills |
|---|---|---|---|---|
| the instance | 1,785 ms | 1,476 ms | 2,067 ms | 10 |
| the instance and the Don | 3,445 ms | 3,114 ms | 3,747 ms | 10 |
Real faults, checked
Kills, pauses, partitions, slow links, membership changes and leadership handovers on a real five-node cluster, with every client operation recorded and the whole history checked for linearizability afterwards.
| run | faults | operations | linearizable | states equal |
|---|---|---|---|---|
| 20261015-seed2-3m | 27 in 180 s | 41,208 | yes | yes |
| 20261016-seed3-3m-members | 27 in 180 s | 48,902 | yes | yes |
| 20261016-seed4-3m-membership-heavy | 32 in 180 s | 49,766 | yes | yes |
Bugs planted on purpose
The same checks against builds with a known bug switched on, to show what the net catches on a real cluster and what it doesn't. The simulator catches every one of them; these runs were 90 seconds each.
| bug | operations | linearizable | states equal | caught |
|---|---|---|---|---|
| anyvote | 2,002 | Illegal | no | yes |
| figure8 | 20,026 | yes | yes | not in 90 s |
| prevterm | 23,129 | yes | yes | not in 90 s |
| staleterm | 21,504 | yes | yes | not in 90 s |