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

応答マッチングルール(クライアント実装)

レスポンスはリクエストに対して順不同で届くことがあるため(待機していた獲得への応答は、 順番が来た時点で届く)、クライアントは次のルールを使ってレスポンスをリクエストに 対応付ける必要があります — 1つの接続上で入り交じったレスポンスを元のリクエストへ 振り分けるデマルチプレクシングの仕組みです。

ルール詳細
マッチングキーqueue/server capacity満杯による確定拒否。即時Busyを返し、内部自動再試行なし
同じ(op, key)を持つ複数のリクエストFIFOを前提にしてはいけない — 必ず識別子で特定する。下記参照
登録のタイミング待機者はリクエストを送信する前に登録する(レスポンスが先に届いてしまう競合を防ぐため)
N/Tの扱い非エラー値として返す(「存在しなかった」/「タイムアウトした」)
Bの扱い待機キューが満杯 — 即座に失敗させず、waitの予算内でバックオフして再試行する
Mの扱いallowlist内addressだけをleader hintに保存して接続を閉じる。owner/keyがなく送信済みpendingに相関不可
Lの扱いleader hintのみ更新して接続維持。request応答ではなくserver通知
E no_leader / E not_active / E auth_failed接続を閉じerror別backoff。no_leaderはleader hintも無効化
その他のE/未知のレスポンス相関不能なのでconnection-fatal。送信済みacquireはIndeterminate
マッチする待機者がないレスポンスprotocol/session不一致として接続終了。Aなら既知exact tokenをreserved release laneへ

FIFOではなく識別子でマッチングすべき理由

同じkeyでも即時成功、queue待機、B拒否は完了時点が異なります。複数keyも1接続でpipelineされるため、応答順は要求順と一致しません。FIFOではなくechoされたidentifier、op、keyを全て確認します。

中断されたリクエストと孤立したロック

中断したrequestがserverで既にgrantされていればlockが残る場合があります。request byteを1つでも送った後に確定応答がなければIndeterminateです。同じownerでstatus照会のようにAを再送してはいけません。tokenを既にparseした場合のみbest-effort exact-token Rを送り、未知tokenのgrantはlease expiryが回収します。

送信後cancelやframing errorで接続を閉じる理由も同じです。pendingだけ破棄すると発行済み応答が孤立します。ただしsocket closeはcommit済みgrantのrelease証明ではありません。token既知ならexact-token R、未知ならlease expiryまでIndeterminateです。