Currently in testing: the GitHub code will be opened once complete.

E · Error

Structurerefresh

The response when a request can't be processed. Instead of a key, a reason (reason) text is sent in its place — the key is never echoed back, so during pipelining you can't tell which request failed from the frame alone. Therefore every E is connection-fatal. The server flushes E when possible and closes the connection; official clients also discard that session. Every acquire for which at least one byte was sent and no definitive reply arrived ends as Indeterminate, never as assumed success or failure.

reasoncauseconnection
auth_failedauth handshake digest mismatchclosed
bad_opunknown op codeclosed
bad_requestfixed header too short (10 bytes for A, 8 for R)closed
bad_leaselease is 0 or 251..255closed
bad_keykey missing / exceeds 128B / contains whitespace or newline / not UTF-8closed
line_too_longframe exceeds 192Bclosed
no_leader(cluster) leader currently unknown — an election is in progressclosed
not_activenode can't serve — it's shutting downclosed
  • These are the complete eight reasons, and every one closes the connection. A raw client may use E for diagnostics, but must not try to resynchronize and reuse that stream.
  • Official clients validate keys and time ranges before sending, so bad_* is not a normal API result.
  • no_leader/not_active are temporary node states, but E carries no owner/key and cannot be correlated safely. Discard the session; only requests not yet sent may be tried on a new one. Never automatically resend an acquire that may have been sent.
  • M, L, no_leader, and not_active only appear in cluster mode — a single server never sends them.
  • A full wait queue comes back as B (busy), not as an E — because it echoes the key and owner, so you can tell exactly which request was rejected.

Byte notation: op is an ASCII character, and reason is ASCII text (variable-length, shown as N in the structure). The trailing \n is 0A.

Flow

Client
Server
invalid frame (e.g. exceeds 192B)
E · line_too_long
flushes E, then closes the connection
any sent acquire remains Indeterminate
requestresponse

E lets a peer observe diagnostic information, but never permits safe stream reuse. Recoverable capacity rejection uses B (busy), which echoes owner and key.