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

B · Occupé

Structurerefresh

Réponse à une requête Acquire (A) non admise parce que la file de la clé ou l'admission globale key/waiter/pending/memory a atteint son plafond. Cette requête n'a certainement pas obtenu le verrou et sa trame n'était pas invalide.

owner est la valeur de la requête renvoyée comme correlator ; elle identifie exactement l'acquire refusé (voir règles d'association).

Traitement client

Les clients officiels rendent immédiatement le B corrélé au caller comme erreur Busy/Capacity et ne retransmettent pas en interne le même acquire logique. Pour réessayer, le caller fixe un deadline global et un backoff, puis démarre explicitement un nouvel acquire avec un nouvel owner.

Un B réellement observé prouve la non-acquisition, donc un autre appel est sûr. Ne jamais déduire B d'un envoi sans réponse ; ce résultat est Indeterminate.

Notation des octets : op est un caractère ASCII, 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 · owner)
la file de cette clé a atteint max_waiters
B · occupé (owner en écho)
renvoyer Busy — le caller décide d’un nouvel acquire logique
A · nouvel acquire (retry optionnel)
si une place se libère → A · acquis (token)
requêteréponse

Ces plafonds sont des memory guardrails. Ils refusent les nouveaux acquires avant un OOM du daemon tout en réservant des ressources à exact-token release, aux réponses approuvées, au cleanup et à Raft recovery. Les causes key_busy, per_key_limit, global_overload, etc. sont distinguées dans metrics/logs, pas sur le wire.