現在テスト中です: 完了後にGitHubのコードを公開する予定です。

B · ビジー

構造refresh

Acquire requestA)が来たものの、key queueまたはserver全体のkey/waiter/pending/memory admissionが上限に達し、受理されなかった応答です。このrequestは確定的にlockを取得しておらず、frame形式が不正なわけではありません。

ownerはrequest値をそのまま返すcorrelatorで、どのacquireが拒否されたか特定できます(応答match規則)。

クライアント処理

公式clientは相関したBを即時Busy/Capacity errorとしてcallerへ返し、同じ論理acquireを内部自動再送しません。callerが再試行するならapplication全体deadlineとbackoffを決め、新ownerの新acquireを明示的に開始します。

実際にBを観測したrequestは確定未取得なので別callは安全です。応答未確認の送信をBと推定してはいけず、その結果はIndeterminateです。

バイト表記: opはASCII文字、ownerはバイナリ(u64、ビッグエンディアン)、keyはUTF-8 テキスト(可変長、構造上はNと表記)です。末尾の\n0Aです。固定ヘッダはバイナリ値のため 0x0Aを含みうるので、改行を探す前にバイト数で先に消費しなければなりません。

フロー

クライアント
サーバー
A · 獲得 (key · owner)
このキーの待機キューがmax_waitersに到達
B · ビジー (ownerをエコー)
Busy返却 — callerが新しい論理acquireを判断
A · 新規acquire(任意の再試行)
空きができればA · acquired (token)
リクエストレスポンス

この上限はmemory guardrailです。daemonがOOMになる前に新規acquireを拒否し、exact-token release、承認済みresponse、cleanup、Raft recoveryの予約資源を残します。詳細原因はwireではなくserver metric/logのkey_busyper_key_limitglobal_overloadなどで区別します。