Ablasi
Matikan salah satu aturan di bawah ini, lalu jalankan lagi. Aturan yang tampak berlebihan akan menunjukkan gunanya begitu ia tidak ada.
Setiap aturan yang tidak jelas alasannya di Raft menjaga satu properti keamanan tertentu. Matikan aturannya, lalu lihat propertinya gagal. Itulah rute tercepat untuk memahami mengapa aturan itu ada.
Setiap guard hidup di lib/raft/rules.ts dan dikonsultasikan di tepat satu tempat. Itulah yang membuat sakelar ini jujur dan bukan sekadar label: tidak ada tempat kedua yang diam-diam masih menegakkan aturannya. Setiap sakelar juga punya tes yang membuktikan pelanggarannya benar-benar terjadi.
Raft tanpa modifikasi — semua aturan ditegakkan.
Election restriction
Kalau aturan ini dimatikan, janji berikut bisa gagal: Catatan yang sudah sah tidak akan pernah hilang dari ketua mana pun sesudahnya.
Pemilih menolak candidate yang log-nya kurang up-to-date dibanding log miliknya sendiri — dibandingkan lewat term terakhir dulu, baru index. Inilah yang membuat Leader Completeness berlaku.
- Menjaga:
- Leader Completeness
- Bagian makalah:
- §5.4.1
- Letak di Figure 2:
- RequestVote RPC, receiver rule 2
- Satu-satunya call site:
- lib/raft/election.ts — handleRequestVote
- Skenario yang membuktikannya:
- election-restriction-overwrite
Current-term commit rule
Kalau aturan ini dimatikan, janji berikut bisa gagal: Tidak akan ada dua komputer yang menjalankan isi berbeda pada baris yang sama.
Leader hanya boleh menyatakan sebuah entry committed lewat hitungan replika kalau entry itu berasal dari term-nya sendiri. Entry dari term lama ikut commit secara tidak langsung. Mematikannya mereproduksi Figure 8.
- Menjaga:
- State Machine Safety
- Bagian makalah:
- §5.4.2
- Letak di Figure 2:
- Rules for Servers, Leaders, final rule
- Satu-satunya call site:
- lib/raft/commit.ts — advanceCommitIndex
- Skenario yang membuktikannya:
- figure-8
AppendEntries consistency check
Kalau aturan ini dimatikan, janji berikut bisa gagal: Kalau dua komputer punya catatan yang sama di satu baris, seluruh catatan di atasnya juga sama.
AppendEntries membawa prevLogIndex dan prevLogTerm; follower menolak kalau tidak cocok, dan leader menelusuri nextIndex mundur sampai kedua log bertemu. Hanya bagian pencocokan term yang diablasi di sini — menerima melewati ujung log akan melubangi log, bukan membuatnya menyimpang.
- Menjaga:
- Log Matching
- Bagian makalah:
- §5.3
- Letak di Figure 2:
- AppendEntries RPC, receiver rule 2
- Satu-satunya call site:
- lib/raft/replication.ts — handleAppendEntries
- Skenario yang membuktikannya:
- log-matching-break
Term increment on candidacy
Kalau aturan ini dimatikan, janji berikut bisa gagal: Tidak pernah ada dua ketua sekaligus dalam satu putaran.
Menaikkan term adalah yang membuat sebuah pencalonan menjadi pemungutan suara baru. Tanpanya, node yang sudah memilih orang lain mencalonkan diri di term yang sama dan menimpa suaranya sendiri.
- Menjaga:
- Election Safety
- Bagian makalah:
- §5.2
- Letak di Figure 2:
- Rules for Servers, Candidates, rule 1
- Satu-satunya call site:
- lib/raft/election.ts — startElection
- Skenario yang membuktikannya:
- double-candidacy
Step down on higher term
Kalau aturan ini dimatikan, janji berikut bisa gagal: Tidak pernah ada dua ketua sekaligus dalam satu putaran.
Server mana pun yang melihat term lebih tinggi mengadopsinya dan kembali menjadi follower. Yang diablasi hanya perubahan peran, bukan pengadopsian term — mematikan keduanya membuat election buntu, bukan melanggar keamanan.
- Menjaga:
- Election Safety
- Bagian makalah:
- §5.1
- Letak di Figure 2:
- Rules for Servers, All Servers, rule 2
- Satu-satunya call site:
- lib/raft/node.ts — observeTerm
- Skenario yang membuktikannya:
- partition-stranded-leader
votedFor persistent
Kalau aturan ini dimatikan, janji berikut bisa gagal: Tidak pernah ada dua ketua sekaligus dalam satu putaran.
votedFor adalah persistent state dan bertahan melewati restart. Kalau hilang, satu node bisa memilih dua kali dalam satu term dan melahirkan dua leader.
- Menjaga:
- Election Safety
- Bagian makalah:
- §5.2
- Letak di Figure 2:
- State, Persistent state on all servers
- Satu-satunya call site:
- lib/raft/node.ts — restart
- Skenario yang membuktikannya:
- double-vote-restart
Joint consensus
Kalau aturan ini dimatikan, janji berikut bisa gagal: Tidak pernah ada dua ketua sekaligus dalam satu putaran.
Perubahan keanggotaan melewati konfigurasi peralihan C-old,new, di mana kesepakatan menuntut mayoritas dari himpunan lama *dan* himpunan baru sekaligus. Tanpa itu, cluster berpindah langsung dari C-old ke C-new — dan karena tidak ada satu saat pun semua server berpindah bersamaan, dua mayoritas yang tidak beririsan bisa memilih dua leader di term yang sama. Itulah Figure 10.
- Menjaga:
- Election Safety
- Bagian makalah:
- §6
- Letak di Figure 2:
- Not in Figure 2 — Figure 10, and §6
- Satu-satunya call site:
- lib/raft/replication.ts — beginConfigurationChange
- Skenario yang membuktikannya:
- membership-change