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

A · Acquisition

Structurerefresh

Requête d'acquisition du verrou. lease est le filet de sécurité qui permet au serveur de récupérer la clé après expiration si le client disparaît sans release. wait borne l'attente en secondes ; 0 effectue une seule tentative immédiate sans entrer dans la file. Il n'existe pas d'attente infinie. Le succès renvoie Acquis A, l'échec d'attente Timeout T, et une capacité de file/serveur pleine Occupé B.

owner — Identifiant de corrélation de réponse

owner est l'identifiant de réponse d'une tentative d'acquisition. Le client en crée un nouveau à chaque appel et le serveur le renvoie dans A, T et B afin de corréler les réponses pipelinées.

owner n'est ni une autorité sur le verrou ni un fencing token. Renvoyer la même clé et le même owner ne rend pas l'active token et ne renouvelle pas le bail. Dès qu'un octet a pu être envoyé sans réponse confirmée, le client ne doit pas retransmettre automatiquement cet acquire avec le même owner : le résultat est Indeterminate. Il est interdit d'entrer dans la section critique ; un grant non observé est récupéré au plus tard à l'expiration du bail.

Les clients officiels créent une seule deadline monotonic couvrant toute l'opération à partir du wait normalisé du caller, et conservent cette deadline et le même owner lors des retries certainement non envoyés. Juste avant l'envoi, le writer arrondit le temps restant vers le haut et recalcule le wait wire ; une connexion tardive ne peut donc pas commencer une nouvelle attente de 255 secondes sur le server. Une requête encore queued après la deadline globale n'est pas envoyée ; si elle a pu l'être, sa session exacte est fermée et le résultat est Indeterminate. Si un A déjà corrélé juste avant la deadline est découvert tardivement au gate de livraison du Ticket, il n'est pas nécessaire de fermer la session, mais un release compensatoire de l'exact token est planifié et Indeterminate est renvoyé. Les T et B corrélés restent respectivement un timeout et un busy définitifs.

Un wait=0 d'origine reste une tentative immédiate sur le wire. Pendant sa deadline transport distincte de cinq secondes, le client peut choisir une autre connexion et retry avec le même owner uniquement tant que la requête est certainement non envoyée ; la tentative server-side réelle reste exactement unique. Il ne retransmet jamais après un envoi possible.

Notation des octets : op est un caractère ASCII, wait/lease sont binaires (u8, big-endian), owner est binaire (u64, big-endian), et key est du texte UTF-8 (longueur variable, notée N dans la structure). Le \n final est 0A. L'en-tête fixe est une valeur binaire et peut contenir 0x0A : il faut donc le consommer d'abord selon son nombre d'octets, avant de chercher le retour à la ligne.

Flux

Client
Serveur
A · acquisition (key · wait · lease · owner)
clé non détenue → émise immédiatement
A · acquis (token)
détenue → attend son tour dans la file FIFO
le tour arrive → A · acquis (token)
wait dépassé → T · timeout
wait=0 + verrou détenu → T · échec immédiat
file saturée → B · occupé
requêteréponse

Voir la Matrice requête × état de la clé pour les règles complètes du comportement selon l'état de la clé.