Derzeit im Test: Der GitHub-Code wird nach Abschluss veröffentlicht.

B · Belegt

Strukturrefresh

Antwort auf einen Acquire Request (A), der wegen erreichter Grenzen der Key-Queue oder globaler key/waiter/pending/memory admission nicht angenommen wurde. Diese Anfrage hat den Lock definitiv nicht erworben; ihr Frame war nicht ungültig.

owner ist der unverändert zurückgegebene Request-Wert als Correlator und identifiziert den abgelehnten Acquire (siehe Matching-Regeln).

Client-Verarbeitung

Offizielle Clients geben ein korreliertes B sofort als Busy/Capacity-Fehler an den Caller und senden denselben logischen Acquire intern nicht erneut. Für einen Retry legt der Caller einen globalen Application-Deadline und Backoff fest und startet ausdrücklich einen neuen Acquire mit neuem Owner.

Ein tatsächlich beobachtetes B beweist Nicht-Erwerb, daher ist ein separater neuer Call sicher. Aus einem Senden ohne Antwort darf niemals B gefolgert werden; das Ergebnis ist Indeterminate.

Byte-Notation: op ist ein ASCII-Zeichen, owner ist binär (u64, big-endian), und key ist UTF-8-Text (variable Länge, in der Struktur als N dargestellt). Das abschließende \n ist 0A. Der feste Header ist ein Binärwert und kann 0x0A enthalten — er muss daher zuerst anhand der Bytezahl verbraucht werden, bevor nach dem Zeilenumbruch gesucht wird.

Ablauf

Client
Server
A · acquire (key · owner)
Warteschlange dieses Schlüssels hat max_waiters erreicht
B · belegt (owner gespiegelt)
Busy zurückgeben — Caller entscheidet über neuen logischen Acquire
A · neuer Acquire (optionaler Retry)
bei freiem Platz → A · acquired (token)
AnfrageAntwort

Die Limits sind Memory Guardrails. Sie lehnen neue Acquires vor einem Daemon-OOM ab und reservieren Ressourcen für exact-token release, genehmigte Antworten, Cleanup und Raft recovery. Details wie key_busy, per_key_limit und global_overload stehen in Metrics/Logs, nicht im Wire.