Saat ini dalam pengujian: kode GitHub akan dibuka setelah selesai.

Matriks Request × Status Key

A (Acquire)

Status keyAksi serverResponsWaktu
Belum terdaftarDaftarkan (expiry = now+lease), terbitkan tokenA+token+owner+keyLangsung
Terdaftar + sudah expiredPerbarui (now+lease), token baruA+token+owner+keyLangsung
Terdaftar + holder valid + wait=0Jangan antrekanT+owner+keyLangsung
Terdaftar + holder valid + wait>0Antrekan, respons ditahanA atau T+owner+keySaat didapat via release/expiry, atau T ketika wait habis
Queue atau capacity server mencapai batasJangan antrekanB+owner+keyLangsung
  • Jalur release bersifat adil secara FIFO: saat pemegang melakukan R, lock diserahkan langsung ke penunggu di depan antrean (tanpa perebutan ulang, token baru).
  • Hanya jalur expiry yang non-FIFO.
  • owner yang sama dengan holder saat ini tidak diperlakukan khusus. Ia bukan wewenang untuk mengembalikan active token atau memperbarui lease; aturan key yang sedang dipegang tetap berlaku.
  • Respons dapat tiba tidak sesuai urutan request; klien mencocokkan lewat owner yang di-echo. R (Release)
Status keyAksi serverRespons
Terdaftar + token cocok, ada penungguSerahkan langsung ke penunggu di depan (token baru)R+token+key
Terdaftar + token cocok, tidak ada penungguHapus keyR+token+key
Terdaftar + token tidak cocokTidak ada (lock tetap dipegang)N+token+key
Belum terdaftarTidak adaN+token+key

Kapan Expiry Diproses

  • Mode single memproses expiry secara lazy — key yang sudah lewat expiry-nya langsung diambil alih oleh acquire berikutnya (baris kedua di atas), dan sweep terpisah setiap 5 detik membersihkan key expired yang tidak punya penunggu. Jadi release pada key yang sudah expired tapi belum disapu bisa mendapat R, bukan N.
  • Dalam cluster mode, leader menunggu tenggat berikutnya pada token-validating deadline min-heap lalu commit perintah Expire melalui konsensus sebelum key hilang. Perbedaan clock antarnode tidak membelah status lock.