B · ビジー
構造refresh
獲得リクエスト(A)が届いたものの、そのキーの 待機キューがサーバーの上限(max_waiters、デフォルト16,384)に達していたため、 キューに並べられなかったという応答です。ロックを得られなかっただけであり、リクエスト自体が 不正だったわけではありません。
ownerはリクエストに載せた値をそのまま返した相関子です — どの獲得試行が拒否されたのかを 正確に知ることができます (応答マッチングルール)。
クライアントの処理
即座に失敗させてはいけません。 waitの予算が残っている限り、バックオフを入れて再試行して ください(公式クライアント: 10msから始めて200msまで倍増)。キューが空けば、その次の試行は 通常どおりキューに並びます。waitが尽きるまで満杯が続いた場合に初めて、「ビジー」エラーとして 呼び出し元に伝えます。
再試行は同じownerで送る必要があります — そうすれば、その間に獲得が成立していても サーバーが同じ獲得と認識します。
バイト表記:
opはASCII文字、ownerはバイナリ(u64、ビッグエンディアン)、keyはUTF-8 テキスト(可変長、構造上はNと表記)です。末尾の\nは0Aです。固定ヘッダはバイナリ値のため0x0Aを含みうるので、改行を探す前にバイト数で先に消費しなければなりません。
フロー
クライアント
サーバー
A · 獲得 (key · owner)
このキーの待機キューがmax_waitersに到達
B · ビジー (ownerをエコー)
バックオフ後、同じownerで再試行
A · 獲得 (再試行)
空きができたら → A · 獲得済み (token)
リクエストレスポンス
この上限はフロー制御ではなくメモリの防衛線です — 認証済みのクライアントが1つのキーに 無制限に待機を積み上げ、サーバーのメモリを枯渇させることを防ぎます。通常のファンアウトより 十分に余裕をもって設定されているため、平常時にこの応答を目にすることはありません。上限は クラスタ設定のmax_waitersで調整します。