Actuellement en test : le code GitHub sera ouvert une fois terminé.

Matrice requête × état de la clé

A (Acquisition)

État de la cléAction du serveurRéponseMoment
Non enregistréeEnregistre (expiration = maintenant+lease), émet un jetonA+token+owner+keyImmédiatement
Enregistrée + expiréeRenouvelle (maintenant+lease), nouveau jetonA+token+owner+keyImmédiatement
Enregistrée + holder valide + wait=0Ne pas mettre en fileT+owner+keyImmédiat
Enregistrée + holder valide + wait>0Mettre en file, réponse suspendueA ou T+owner+keyAcquisition par release/expiry, ou T à la fin de wait
File ou capacité serveur au plafondNe pas mettre en fileB+owner+keyImmédiat
  • Le chemin de libération est équitable en FIFO : quand le détenteur fait R, la clé est remise directement à l'attendant en tête de file (sans nouvelle mise en concurrence, avec un nouveau jeton).
  • Seul le chemin d'expiration n'est pas FIFO.
  • Un owner identique à celui du holder courant ne reçoit aucun traitement spécial. Il n'autorise ni le retour d'un active token ni le renouvellement du bail ; les règles ordinaires d'une clé détenue s'appliquent.
  • Les réponses pouvant être désordonnées, le client les associe par owner renvoyé. R (Libération)
État de la cléAction du serveurRéponse
Enregistrée + jeton concordant, avec attendantsRemise directe à l'attendant en tête de file (nouveau jeton)R+token+key
Enregistrée + jeton concordant, sans attendantSuppression de la cléR+token+key
Enregistrée + jeton non concordantAucune (le verrou est conservé)N+token+key
Non enregistréeAucuneN+token+key

Moment du traitement de l'expiration

  • Le mode simple traite l'expiration de façon paresseuse (lazy) — une clé passée son expiration est reprise sur place par la prochaine acquisition (deuxième ligne du tableau ci-dessus), et un balayage séparé toutes les 5 secondes nettoie les clés expirées sans attendant. Une libération sur une clé expirée mais pas encore nettoyée peut donc recevoir R plutôt que N.
  • En mode cluster, le leader attend la prochaine échéance d'un deadline min-heap validant le token, puis commit la commande Expire par consensus avant la disparition de la clé. Les écarts d'horloge ne divisent ainsi pas l'état du verrou.