R · 解放
構造refresh
ロック解放リクエストです。tokenはその獲得が受け取った フェンシングトークンで、現在保有中のトークンと 一致した場合にのみ解放されます。応答は解放済み R または見つからない Nです。
token — 他人のロックを解放しないための仕組み
トークン検証がないと危険な順序が生まれます。解放リクエストがフェイルオーバーをまたいで 再試行されている間に、元のロックがlease失効で回収され別のクライアントに再付与されると、 遅れて届いた解放がその新しい保有者のロックを解いてしまいます。トークンが一致したときだけ 解放することで、この経路が塞がれます。
トークンが異なる場合はN(見つからない)が返り、ロックはそのまま維持されます。解放の再試行は 常に同じトークンで送る必要があり、応答のマッチングもエコーされたtokenで行います (応答マッチングルール)。
バイト表記:
opはASCII文字、tokenはバイナリ(u64、ビッグエンディアン)、keyはUTF-8 テキスト(可変長、構造上はNと表記)です。末尾の\nは0Aです。固定ヘッダはバイナリ値のため0x0Aを含みうるので、改行を探す前にバイト数で先に消費しなければなりません。
フロー
保有者X
サーバー
待機者Y
R · 解放 (key · token)
R · 解放済み
待機者がいれば → A · 直接引き継ぎ (新しいtoken)
キーが存在しない、またはトークンが異なる場合
N · 見つからない
リクエストレスポンス
解放されたキーに待機者がいれば、再競合なしでキューの先頭に直接引き継がれます — 解放者に送られるR(解放済み)とは別に、待機者は新しいトークンを持つA(獲得済み)を 受け取ります。