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

M · 移動

構造refresh

このノードはリーダーではないので、代わりにリーダーへ行くようにクライアントへ伝えます (クラスタのみ)。ボディはテキストとしてのリーダーのクライアントアドレス (host:port)です — クライアント自身が接続するアドレスであり、Raftポートではありません。

公式クライアントは、あらかじめallowlistに登録されたアドレスと完全一致する場合だけleader hintとして 記憶し、そのsessionを閉じます。1バイトでも送信したacquireをMへ恣意的に対応付けて再送せず、 Indeterminateとして終了します。 以後の独立requestやwriterがまだ保持していない未送信requestは 新しいleader接続を使います。リーダーがまだ選出されておらず案内できるアドレスがない場合は、代わりに E no_leaderが送られます。

クラスタ全体の動作はプロトコル (クラスタ)を参照してください。

バイト表記: opはASCII文字、addrはUTF-8テキスト(可変長、構造上はNと表記)です。 末尾の\n0Aです。

フロー

クライアント
フォロワー
リーダー
A · 獲得 (key)
M · 移動 (リーダーのアドレス)
既存sessionを閉じる · 送信済みacquireはIndeterminate
次の独立acquireをleaderで開始
リクエストレスポンス

Mにはownerとkeyがなく、1つのsessionには複数のacquireが混在できます。leaderからfollowerへ 切り替わる瞬間にはcommit中のrequestとfollowerが拒否したrequestが共存し得るため、1つのMを 特定pendingの確定未獲得証拠にはしません。この保守的な規則が重複acquireとsame-owner lease延長を防ぎます。