Commandes répliquées
Chaque changement d'état de verrou est répliqué sous la forme d'une des commandes ci-dessous, transportée comme entrée de journal dans AppendEntries, et appliquée par chaque nœud dans le même ordre après un commit majoritaire.
Commandes (proposées par le leader)
| Commande | Champs | Signification |
|---|---|---|
Grant | key, lease_ms | Acquiert une clé. Le jeton n'est pas dans la commande — la machine à états de chaque nœud l'assigne de façon déterministe au moment de l'application, si bien que chaque nœud calcule le même jeton |
Release | key | Libère une clé |
Expire | key, token | Expiration de lease pilotée par le leader. Supprimée uniquement si token correspond — une expiration tardive ou dupliquée ne peut pas supprimer un verrou fraîchement octroyé entre-temps (idempotent) |
Résultats appliqués (machine à états → leader)
| Résultat | Signification |
|---|---|
Granted { token } | Acquisition réussie — le jeton de fencing émis |
GrantRejected | Un Grant est arrivé pour une clé déjà détenue (défensif — ne se produit jamais dans le flux normal) |
Released | Libéré |
NotFound | La clé à libérer n'existait pas |
Expired { existed } | Expiration traitée — existed indique si elle a réellement été supprimée |
Noop | Rien ne s'est produit |
Chaque nœud suit le temps restant d'un lease avec sa propre horloge locale, mais la suppression réelle ne se produit toujours que via une commande Expire validée — c'est pourquoi une dérive d'horloge entre nœuds ne peut jamais diviser l'état des verrous. Si un client se déconnecte avant de recevoir sa réponse, le leader propose lui-même un Release juste après l'octroi, pour nettoyer immédiatement le verrou fantôme.
Flux — réplication d'un Expire
Même l'expiration n'est qu'une commande de plus qui passe par la proposition du leader → le commit majoritaire. Grâce à la vérification du token, même si la même clé a été réoctroyée pendant qu'un commit était retardé, un Expire appliqué tardivement ne peut pas supprimer le nouveau verrou.
Terminologie
- Machine à états (state machine) — la partie qui applique les commandes validées dans l'ordre pour produire l'état courant (ici, la table des verrous). Comme chaque nœud applique les mêmes commandes dans le même ordre, ils convergent toujours vers le même état.
- Commit — le statut « final » qu'un état atteint une fois enregistré par une majorité de nœuds. Seules les commandes validées sont appliquées à la machine à états.
- Idempotent — une propriété où appliquer la même commande deux fois par erreur ne change pas le résultat.