Ticketing
Dokumentasi

Command yang Direplikasi

Setiap perubahan status lock direplikasi sebagai salah satu command berikut, dibawa sebagai entry log dalam AppendEntries, dan diterapkan oleh setiap node dalam urutan yang sama setelah commit mayoritas.

Command (diusulkan oleh leader)

CommandFieldMakna
Grantkey, lease_msAcquire sebuah key. Token tidak ada di command — state machine setiap node memberikannya secara deterministik saat diterapkan, sehingga setiap node menghitung token yang sama
ReleasekeyRelease sebuah key
Expirekey, tokenExpiry lease yang diinisiasi leader. Dihapus hanya jika token cocok — expiry yang terlambat atau duplikat tidak bisa menghapus lock yang baru saja diberikan (idempotent)

Hasil penerapan (state machine → leader)

HasilMakna
Granted { token }Acquire berhasil — fencing token yang diterbitkan
GrantRejectedGrant tiba untuk key yang sudah dipegang (defensif — tidak pernah terjadi di alur normal)
ReleasedBerhasil di-release
NotFoundKey yang akan di-release tidak ada
Expired { existed }Expiry diproses — existed menunjukkan apakah benar-benar dihapus
NoopTidak terjadi apa-apa

Setiap node melacak sisa waktu lease dengan jam lokalnya sendiri, tapi penghapusan sebenarnya selalu hanya terjadi lewat command Expire yang di-commit — inilah alasan perbedaan jam antar-node tidak pernah bisa memecah status lock. Jika klien terputus sebelum menerima responsnya, leader mengusulkan Release untuk dirinya sendiri tepat setelah acquire, untuk langsung membersihkan lock hantu tersebut.

Alur — Mereplikasi Expire

Leader
Follower 1
Follower 2
mendeteksi lease expired lewat jam lokalnya
AppendEntries · Expire (key, token)
AppendEntries · Expire (key, token)
OK
commit mayoritas → setiap node menerapkan dengan urutan sama
token tidak cocok → diabaikan — melindungi lock yang baru diberikan
RPC konsensus (Raft)

Bahkan expiry pun hanyalah command lain yang melalui usulan leader → commit mayoritas. Berkat pengecekan token, walau key yang sama sudah diberikan ulang saat commit tertunda, Expire yang diterapkan terlambat tidak bisa menghapus lock yang baru.

Terminologi

  • state machine — bagian yang menerapkan command yang di-commit secara berurutan untuk menghasilkan status saat ini (di sini, tabel lock). Karena setiap node menerapkan command yang sama dalam urutan yang sama, mereka selalu konvergen ke status yang sama.
  • commit — status "final" yang dicapai suatu status setelah mayoritas node mencatatnya. Hanya command yang di-commit yang diterapkan ke state machine.
  • idempotent — sifat di mana menerapkan command yang sama dua kali secara tidak sengaja tidak mengubah hasilnya.