Contraintes de champs et plages de valeurs
Champs de requête (C→S)
| Champ | Type | Plage valide | Signification | En cas de violation |
|---|---|---|---|---|
op | ASCII 1B | A(0x41) · R(0x52) | Type de requête | E bad_op |
wait | u8 | 0 à 255 (secondes) | 0 tente immédiatement sans file ; 1..255 borne l'attente d'acquisition | — (toujours valide par le type) |
lease | u8 | 1 à 250 (secondes) | Bail ; 0 et 251..255 sont rejetés/réservés | E bad_lease |
owner | u64 BE | toute la plage 0 – 2^64-1 | Identifiant de la tentative d'acquisition (généré par le client) | — (le serveur ne le valide pas) |
token | u64 BE | valeur émise par le serveur | Désigne ce qu'il faut libérer (R uniquement) | N en cas de non-correspondance |
key | UTF-8 | 1 – 128 octets | Nom du verrou. Espace (0x20) et retour à la ligne (0x0A) interdits | E bad_key |
- Il n'existe aucune attente ni aucun bail infini. Les clients officiels arrondissent les fractions de seconde vers le haut, valident la plage et renvoient une erreur d'entrée explicite avant envoi, sans clamp. Le bail par défaut est de 30 secondes.
- Dans l'API client officielle,
waitest la limite globale de l'acquire, depuis l'entrée de l'appel jusqu'à la réponse, en incluant la local queue, les nouvelles tentatives dont l'absence d'envoi est certaine et le write. Un unique monotonic operation deadline est créé ; juste avant l'envoi réel, le writer place dans lewaitde la frame l'arrondi supérieur u8 du temps restant. Une connexion tardive ou un failover certainement non envoyé ne peut donc pas recommencer le server wait. À la deadline, une requête encore en queue expire avec certitude sans avoir été envoyée ; si un seul byte a pu partir, la session exacte est fermée et le résultat estIndeterminate. Seul unwait=0d'origine utilise wire0, et cette tentative immédiate possède une deadline I/O finie distincte pour ne jamais attendre indéfiniment un transport bloqué. Si unAdéjà corrélé juste avant la deadline n'est découvert qu'au gate de livraison du Ticket, le server waiter est déjà résolu : la session reste ouverte, l'exact token connu est libéré en compensation et le résultat estIndeterminate. LesT/Bcorrélés restent des non-acquisitions définitives. - Pour un
wait=0d'origine, le comportement wire et server reste une seule tentative immédiate sans queue. Dans sa deadline transport distincte de cinq secondes, une défaillance certainement non envoyée peut choisir une autre connexion et retry avec le même owner. Dès qu'un seul byte a pu être envoyé, l'acquire n'est jamais retransmis. - L'API officielle exige
min_work_budget, absent du wire. Il couvretravail critique + pause prévue + fin du commit/rollback DB, vaut0..250secondes et ne dépasse pas le bail normalisé. Sinon, l'appel échoue avant envoi avec une erreur de typeUnsupportedDuration/InsufficientLease. - La longueur de la clé se mesure en octets, pas en caractères — les caractères accentués occupent 2 octets en UTF-8, donc une clé entièrement accentuée atteint 64 caractères.
ownern'est qu'un identifiant de corrélation de réponse, pas une autorité. Le réutiliser ne rend pas un active token et ne renouvelle pas le bail. Les requêtes simultanées d'un client utilisent des valeurs non nulles distinctes ; si le compteur atteint 0 ou wrap, les clients officiels échouent en mode fermé.- Un release explicite ou compensatoire d'un token connu dispose de 5 secondes absolues depuis call/enqueue, reconnexions et tentatives incluses.
Rconfirme le succès ;Nsignifie déjà absent ou token non courant. Une absence de réponse n'est jamais supposée être un succès ; une file compensatoire bornée pleine retombe sur l'expiration du bail. bad_keycouvre à la fois une clé vide, une clé dépassant 128 octets, une clé contenant un espace ou un retour à la ligne, et un encodage UTF-8 invalide. Les clients officiels n'envoient en plus jamais\r— une clé se terminant par\rdeviendrait silencieusement une clé différente.
Champs de réponse (S→C)
| Champ | Type | Plage | Présent dans |
|---|---|---|---|
token | u64 BE | 1 ou plus, croissant à chaque octroi | A (nouvelle émission) · R/N (écho de la requête) |
owner | u64 BE | la valeur de la requête telle quelle | A · T · B (écho de la requête) |
key | UTF-8 | la valeur de la requête telle quelle (1–128 o) | A · T · B · R · N |
addr | UTF-8 | host:port | M · L |
reason | ASCII | l'une des huit | E |
Le serveur n'émet jamais le token 0. Le mode single utilise un compteur limité à la durée de vie du processus ; le cluster utilise un compteur répliqué par consensus et échoue en mode fermé avant overflow. Ni l'horloge murale ni l'aléatoire ne garantissent la monotonie après redémarrage.
Longueurs d'en-tête fixe
La portion binaire de longueur fixe qui suit l'op. Ces octets peuvent contenir 0x0A : un analyseur doit donc en consommer exactement ce nombre avant de chercher le retour à la ligne.
| Sens | op | En-tête fixe | Composition |
|---|---|---|---|
| C→S | A | 10 B | wait(1) + lease(1) + owner(8) |
| C→S | R | 8 o | token(8) |
| S→C | A | 16 o | token(8) + owner(8) |
| S→C | T · B | 8 o | owner(8) |
| S→C | R · N | 8 o | token(8) |
| S→C | M · L · E | 0 o | aucun (le texte commence juste après l'op) |
S'il manque des octets, la réponse est E bad_request.
Taille de trame
| Élément | Valeur |
|---|---|
Limite de trame (hors \n) | 192 octets — au-delà : E line_too_long |
Plus grande requête A | 1 + 10 + 128 + 1 = 140 o |
Plus grande requête R | 1 + 8 + 128 + 1 = 138 o |
Plus grande réponse A | 1 + 16 + 128 + 1 = 146 o |
Trame vide (\n seul) | keep-alive — ignorée par le serveur |
La limite de 192B dépasse la plus grande trame (146B), donc un client conforme ne l'atteint pas. Après une trame structurellement invalide ou oversized, le framing n'est plus fiable et la connexion est fermée.
Handshake d'authentification
| Élément | Valeur |
|---|---|
| Hachage | SHA-256 (indiqué dans la ligne de challenge) |
| nonce | 8 caractères base64url |
| Condensat de réponse | 43 caractères base64url (sans padding) |
| Limite de ligne | 256 octets |
| Délai limite | 10 secondes (négociation TLS incluse) — la connexion est fermée en cas de dépassement |
Voir Handshake d'authentification pour la procédure complète.
Limites côté serveur
Ces valeurs ne sont pas fixées directement par le client, mais influencent son comportement.
| Élément | Défaut | Réglage | En cas de dépassement |
|---|---|---|---|
| Waiters par clé | 2048 (plafond 16384) | MAX_WAITERS | B (busy) |
| Total des waiters | 16384 (plafond 65536) | MAX_TOTAL_WAITERS | B pour cet acquire |
| Connexions client simultanées | 1024 (plafond 8192) | MAX_CONNECTIONS | Connexion fermée immédiatement |
| Replies en attente par connexion | 256 | constante de compilation | Connexion lente fermée |
| Acquires in-flight globaux | 4096 | constante de compilation | B pour cet acquire |
| Releases in-flight globaux | 512, lane séparée | constante de compilation | Attente bornée jusqu'à fermeture |
| Clés actives du cluster | 65536 | constante de compilation | B pour une nouvelle clé |
Le read buffer (4096B), le batch de réponses (64), le progress timeout d'une trame client commencée (5 s) et le sweep d'expiration single (5 s) sont des constantes de compilation. Le cluster emploie un deadline min-heap validant les tokens plutôt qu'un scan complet. Voir la configuration.
L'admission des acquires, nouvelles clés et waiters globaux ferme à 90 % de chaque hard limit et ne rouvre qu'en dessous de 75 %. Un nouvel acquire peut donc recevoir B avant la limite ; la capacité réservée au release et à la récupération Raft est distincte de cette hystérésis.
Récapitulatif : violation → réponse
| Situation | Réponse | Connexion |
|---|---|---|
| op inconnu | E bad_op | fermée |
| En-tête fixe incomplet | E bad_request | fermée |
lease = 0 ou 251..255 | E bad_lease | fermée |
| Clé vide / plus de 128 o / contenant espace ou retour à la ligne / non UTF-8 | E bad_key | fermée |
| Trame de plus de 192 o | E line_too_long | fermée |
| Condensat d'authentification non concordant | E auth_failed | fermée |
| File d'attente saturée | B + owner + key | maintenue |
| Jeton de libération non concordant | N + token + key | maintenue |
Pour tous les motifs d'erreur et le traitement de la connexion, voir Réponse · Erreur E.