要約

  • 9P2000のTwalkは、指定した名前要素をすべてwalkできたときだけ、未使用のnewfidを結果に結び付ける。部分的なRwalkは解決済みの接頭部分のqidを返し得るが、どちらのfidも移動させない。
  • Topenは独立した要求である。アクセスモードを指定し、サーバーに権限確認を行わせ、fidを後続のread/writeに備えさせる。RopenそのものはデータI/Oの完了証明ではない。
  • 歴史的帰属も分ける必要がある。Ken Thompsonがプロトコルを始め、Pikeが名前付けを統合し、Dave Presottoがネットワークを構築した。Plan 9の論文と後年の方言にはそれぞれの共同執筆者がいる。

運用ログに「walk完了」とだけ残り、担当者がそれを「ファイルを開いた」と説明する。後でreadが一度も送られていなかったと分かる。9Pの仕様に矛盾はない。ログの説明が、別々の状態遷移を一つに縮めただけだ。

Twalkは有効なfidから始まり、newfidと順序付きの名前列を渡す。開始fidと同じ番号を意図的に使う場合を除き、newfidは未使用でなければならない。サーバーは一要素ずつ進み、通過する各ディレクトリで検索権限を要求する。すべて成功すると、Rwalkは要素ごとのqidを返し、newfidが到達先を表す。

これは具体的な証拠である。この接続、このサーバー、この開始位置で、名前列がその順に解決された。しかしopenは含まれない。9Pの導入文書はfidを、開かれているかどうかにかかわらず「現在のファイル」を示す、クライアント選択の32ビット識別子と説明する。fid空間は接続内で共有される。versionをやり直せばセッションは初期化され、未完了I/Oも中止される。fidを接続外の恒久的なハンドルとして扱う根拠はない。

部分成功はさらに重要だ。最初の要素で失敗すればエラーになる。途中で失敗すると、Rwalkは成功した接頭部分のqidを返すことがある。ただし9P2000では、全要素が成功しない限り元のfidもnewfidも変化しない。「10要素中8要素を解決」を利用可能なnewfidとして保存する監視系は、仕様にない状態を作っている。

名前要素がゼロのTwalkは経路を進まず、fidをnewfidへ複製する。また、1メッセージ16要素というMAXWELEMは論理パス長の上限ではない。複数のwalkを続けられる。パケット列を監査記録へ変換するとき、複製と分割を通常の経路解決と混同してはならない。

次の境界がTopenである。fidがすでに表すファイルに対し、read、write、read/write、executeなどのモードを要求する。サーバーはここで権限を確認し、後続I/Oのためにfidを準備する。Ropenが返すのはqidとiounitであり、データの受け渡しではない。具体的な転送は後のTreadまたはTwriteと応答が証明する。

権限には時点がある。openの文書は、権限がopen時に確認され、その後の権限変更はすでに開いたファイルへのアクセス能力を変えないとする。walkで通過できたディレクトリ検索権限は、後のopenモードを保証しない。完全walk後のopen拒否は、要求モードや状態が違えば整合する。一方、ポリシー変更前に開いたfidはアクセスを維持し得る。時系列を消した「許可済み」という一語では両者を表せない。

qidもグローバル識別子ではない。同じサーバー階層内でファイルを一意に識別し、削除・再作成ではpath部分が変わるべきものだ。表示パスより強いが、別サーバー間の普遍的IDでもコンテンツハッシュでもない。

この局所性はPlan 9の狙いである。The Use of Name Spaces in Plan 9はRob Pike、Dave Presotto、Ken Thompson、Howard Trickey、Phil Winterbottomの共同著作で、プロセスごとの名前空間を小さなファイルプロトコルで構成する。Plan 9 from Bell LabsはPike、Presotto、Sean Dorward、Bob Flandrena、Thompson、Trickey、Winterbottomの名で、名前空間の構成がクライアント側にあることを説明する。普遍的な一本の木がないからこそ、用途に応じて資源を組み合わせられる。

Pikeを単独発明者にするのも同じ種類の拡張である。第2版序文は、Thompsonがプロトコルを始め、Pikeが名前システムを統合し、Presottoがネットワークを作ったと述べ、Winterbottomを含む多くの貢献者を挙げる。正確な共同性はPikeの貢献を小さくせず、統合の意味を明確にする。

方言差も保存しなければならない。第4版序文は、新しい9Pへの移行を主に旧来の名前要素27バイト制限の解消と、効率、柔軟性、カプセル化の改善に結び付ける。Linux v9fsは9p2000、9p2000.u、9p2000.Lを扱う。UNIX拡張とLinux方言には独自の文書があり、9P2000.Lはwalkの形を保ちながらopenではTlopen/RlopenとLinuxフラグを使う。二段階の境界は比較できても、フィールドを同一視はできない。

さらにv9fsのキャッシュモードは、クライアント観測とサーバーの現在値との距離を変える。したがって監査記録は、方言、接続、サーバー/export、attach文脈、開始fid/qid、名前列、全qid、完全・部分・ゼロ要素の別、newfid、openモードとフラグ、Ropenのqid/iounit、後続I/O、キャッシュ、セッション終了を保持する必要がある。

その記録があれば、「walkは成功した」は十分に強い。名前が解決されたことを正しく語り、開いていないものを開いたとは言わないからである。

Sources