要約

  • 第13版は wheresort-bylocaledirectionoffset または cursorlimit の順を定め、sublist-limit を子コレクションの制約として分離している。
  • 有効なカーソルと整列済みページが示すのは問い合わせ位置であり、同じ時点、同じ NACM ビュー、全順序、あるいは入れ子を含む完全なデータ集合ではない。

ページングの事故は、サーバーが誤ったページを返したときだけ起きるのではない。各ページがそれぞれ正しくても、結合した一覧が一度も実在しなかった、という形でも起きる。最初のページを読んだ後に経路のメトリックが変わり、インターフェースが消え、アクセス規則が更新されれば、次ページは新しい現実に対して正しく応答する。その二つを一枚の静止画として扱うところに証拠上の飛躍がある。

draft-ietf-netconf-list-pagination-13 は、この飛躍を防ぐための材料を多く提供している。処理は where による絞り込みから始まり、sort-bylocale による並べ替え、directionoffset または cursor による位置決め、そして limit へ進む。sublist-limit は対象リストの件数ではなく、返された各要素の下にある list と leaf-list を制約する。

第13版は 2026 年 7 月 6 日に提出された。IETF Datatracker では、NETCONF ワーキンググループの有効な Internet-Draft、Standards Track 向け、WG 状態 In WG Last Call、タグ Revised I-D Needed - Issue raised by WGLC、IESG 状態 I-D Exists と表示されている。現在の YANG Validation は三件のエラーを集計し、表示される pyangyanglint の出力は同じ行折り返し付近のエスケープを指している。これは文書と検証ツールの現状であり、実装、配備、実データの障害を示すものではない。

同じ質問を続ける仕組み

カーソル走査は cursor=first で初期化される。この時点で wheresort-bylocale が決まり、サーバーが返す nextprevious はその条件を保持する。以後変更できるのは limitsublist-limit に限られる。途中で検索条件を差し替えながら一続きの結果と称することはできない。

守られているのは質問の同一性である。データの同一性ではない。仕様には読み取りスナップショット ID、共通時刻、トランザクション番号、複数バックエンドを束ねるリビジョンベクトルがない。同じ質問を忠実に再実行しても、対象の世界は変わり得る。

offsetcursor は同時に使えない。offset は所定件数を飛ばすだけなので、その前に挿入や削除が起きると境界が動く。カーソルは下位システムのキーやインデックスを表す不透明な値で、クライアントに位置解釈を任せない。ただし、ほかの項目の追加、削除、ソートキー変更を止める力はない。

RESTCONF の関連草案は、サーバーが次・前のカーソルやページについて状態を保持しないと明記する。リンクは予約済み結果集合への入口ではなく、後で再評価される継続指示である。ステートレス設計は運用しやすいが、リンクそのものをスナップショット証拠にすることはできない。

ロケールを記録しても全順序にはならない

sort-by がなければ YANG リスト本来の順序が使われる。指定した場合、選択した子ノードの値を持たない項目は値を持つ項目の後に置かれる。localesort-by なしでは無効であり、クライアントが省略するとサーバーが選び、その値を YANG メタデータで返す。

ロケールを返すことは重要だ。暗黙の機械設定を監査対象にできる。しかし BCP 47 のタグは、Unicode データ版、照合ライブラリ、正規化、同値判定まで指定しない。連携する二つのストアが同じタグを受け入れても、アクセントや大文字小文字、等価文字の並びが同じとは限らない。

さらに草案には副ソートがない。主キーが同値の要素は、問い合わせに現れない内部基準で並ぶ。ページ境界が同値群の途中に入れば、再起動、別ノード、インデックス更新によって境界の内外が入れ替わる可能性がある。主キーによる並べ替え自体は正しくても、再現可能な全順序とは限らない。

証拠として必要なのは、実際に同値を解消した識別子、または全順序ではなかったという明示である。「名前順」というラベルだけでは、重複と欠落がなかったことを説明できない。

能力は実行結果ではない

動的な config false リストでは、任意の XPath を評価することが高価な場合がある。第13版は RFC 9196 の system-capabilities を拡張し、ノードが constrained か、どの子が indexed か、cursor-supported かを宣言できるようにする。制約付きリストでは、フィルターとソートは索引対象ノードに限られ、サブリストを越えて式を下げることもできない。

これにより、クライアントは不可能な問い合わせを事前に避けられる。だが、索引が宣言されたことと、今回その索引が使用され、最新で、すべてのデータ源を含んだことは別である。RFC 9196 の能力はハードウェア、ライセンス、稼働条件で変わり得る。ページごとに能力集合の同一性を残さなければならない。

RFC 8525 の YANG Library content-id は、モジュールとスキーマ内容を識別する。応答をどの文法で解釈したかを確定できるが、その文法で表現された経路やインターフェースの時点を表す番号ではない。スキーマ証拠とデータ証拠を混ぜてはならない。

認可ビューも時間とともに変わる

RFC 8341 の NACM は、主体ごとに操作とデータへのアクセスを制限する。したがって where は内部の全件ではなく、その主体に許された集合に対して評価される。ページ間でグループ、ルール、対象オブジェクトの権限が変われば、同じ主体名と同じ条件でも見える母集団は変化する。

RFC 9865 の SCIM カーソルを扱った既存の BTW 記事は、カーソル保持が失効した権限を延命してはならないという論点を中心にする。本稿の中心は異なる。毎回正しく再認可しても、二つの認可ビューの和集合が一つの整合した一覧になるとは限らない。ページ単位の正当性から集合の完全性は導けない。

主体、NACM ポリシー版、適用ルール、実効ビューを各ページに結び付ける必要がある。途中で変化したなら「異なる二つの認可ビューで観測した」と記録すべきで、変化を消して単一一覧と呼ぶべきではない。

operational データには別の時計がある

RFC 8342 の operational データストアは、適用済み設定とシステム状態を、場合によっては複数の由来から構成する。経路は収束し、カウンターは増え、インターフェースは変化する。ページングは読み取り量を扱いやすくするが、その動きを停止しない。

一ページ目がソートキー m で終わったとする。m より前にいた要素がキーを z に変えれば後で再登場する。後ろにいた要素が a に変われば、どのページにも現れない可能性がある。offset は挿入と削除に影響され、カーソルも他要素の移動までは制御できない。複数バックエンドの更新周期もそろわない。

共通スナップショットやリビジョンを提供できる場合は、それを全ページに結び付けるべきだ。できない場合は、ページと由来ごとの観測時刻、境界キー、重複・欠落検査を残し、「ある時間幅での走査」と表現する。動くデータを動くデータとして使うことに問題はない。瞬間的な完全一覧だったと装うことが問題なのである。

子リストの完全性は別に追う

limit は対象リストを、sublist-limit は各要素内の子リストを制限する。remaining は正の件数を返す場合も unknown の場合もある。すべての装置を得たからといって、装置ごとの全インターフェースや全経路を得たことにはならない。

切り詰められた各子リストには、親 ID、問い合わせ、カーソル系列、応答ハッシュ、残数または不明状態が必要になる。上位ページの完了だけを保存すると、容器の完全性を内容の完全性に取り違える。証拠構造は一本の列ではなく、親ごとに分岐する木になる。

ページ証拠と集合証拠を分ける

ページ証拠には、主体と NACM ポリシー、データストア、YANG Library と能力集合、全パラメータ、要求・応答ハッシュ、カーソル系列、返却キーとソート値、remaining、サーバー時刻、バックエンド ID とリビジョンを含める。

集合証拠は別に作る。重複、想定外の欠落、境界逆転を検出し、前ページ末尾と次ページ先頭の順序タプルを比較し、ポリシー、能力、ロケール、由来の変更を記録する。最後に、共通スナップショット、限定的な不整合、変化中の連続観測のどれかを宣言する。

これは運用側の証拠設計であり、Internet-Draft がすでに要求する機能ではない。カーソルの価値を過小評価する必要も、過大評価する必要もない。カーソルは問い合わせ文脈の中で位置を覚える。時刻と完全性は、別の計測器と別の責任者が証明する。

一次資料

調査資料は現行本文と保存版、Datatracker、版間差分、NETCONF/RESTCONF 関連草案、旧版に対する三件の歴史的レビュー、基礎 RFC からなる: https://datatracker.ietf.org/doc/html/draft-ietf-netconf-list-pagination-13; https://www.ietf.org/archive/id/draft-ietf-netconf-list-pagination-13.txt; https://datatracker.ietf.org/doc/draft-ietf-netconf-list-pagination/; https://datatracker.ietf.org/doc/draft-ietf-netconf-list-pagination/history/; https://author-tools.ietf.org/iddiff?url1=draft-ietf-netconf-list-pagination-12&url2=draft-ietf-netconf-list-pagination-13; https://datatracker.ietf.org/doc/html/draft-ietf-netconf-list-pagination-nc-12; https://datatracker.ietf.org/doc/draft-ietf-netconf-list-pagination-nc/; https://datatracker.ietf.org/doc/html/draft-ietf-netconf-list-pagination-rc-11; https://datatracker.ietf.org/doc/draft-ietf-netconf-list-pagination-rc/; https://datatracker.ietf.org/doc/review-ietf-netconf-list-pagination-07-opsdir-early-linkova-2025-05-10/; https://datatracker.ietf.org/doc/review-ietf-netconf-list-pagination-07-yangdoctors-early-lhotka-2025-04-28/; https://datatracker.ietf.org/doc/review-ietf-netconf-list-pagination-03-yangdoctors-lc-lhotka-2024-05-01/; https://www.rfc-editor.org/rfc/rfc6241.html; https://www.rfc-editor.org/rfc/rfc6242.html; https://www.rfc-editor.org/rfc/rfc5646.html; https://www.rfc-editor.org/rfc/rfc7950.html; https://www.rfc-editor.org/rfc/rfc7951.html; https://www.rfc-editor.org/rfc/rfc7952.html; https://www.rfc-editor.org/rfc/rfc8040.html; https://www.rfc-editor.org/rfc/rfc8341.html; https://www.rfc-editor.org/rfc/rfc8342.html; https://www.rfc-editor.org/rfc/rfc8407.html; https://www.rfc-editor.org/rfc/rfc8525.html; https://www.rfc-editor.org/rfc/rfc9196.html; https://www.rfc-editor.org/rfc/rfc9911.html。