<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.35 (Ruby 2.6.10) -->
<?rfc docmapping="yes"?>
<?rfc comments="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-haynes-nfsv4-flexfiles-v2-proxy-server-04" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.33.0 -->
  <front>
    <title abbrev="FFv2 Proxy Server">Proxy-Driven Server for Flexible Files Version 2</title>
    <seriesInfo name="Internet-Draft" value="draft-haynes-nfsv4-flexfiles-v2-proxy-server-04"/>
    <author initials="T." surname="Haynes" fullname="Thomas Haynes">
      <organization>Hammerspace</organization>
      <address>
        <email>loghyr@gmail.com</email>
      </address>
    </author>
    <date/>
    <area>General</area>
    <workgroup>Network File System Version 4</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 44?>

<t>Parallel NFS (pNFS) with the Flexible Files Version 2 layout
type supports client-side erasure coding and per-chunk repair
between clients and data servers.  This document extends that
architecture with a proxy server role: a registered peer
of the metadata server that polls the metadata server for
work assignments and carries them out -- moving a file from one
layout to another, reconstructing a whole file from surviving
shards, or translating between encodings for clients that cannot
participate in the file's native encoding (including NFSv3
clients).  All proxy-server-to-metadata-server coordination is fore-channel: the
metadata server returns work assignments inline in the response
to a proxy-server-initiated PROXY_PROGRESS poll, and the proxy server reports
completion via a fore-channel PROXY_DONE.  No callback
operations are required for the proxy server protocol.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://ietf-wg-nfsv4.github.io/flexfiles-v2-proxy-server/draft-haynes-nfsv4-flexfiles-v2-proxy-server.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-haynes-nfsv4-flexfiles-v2-proxy-server/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Network File System Version 4 Working Group mailing list (<eref target="mailto:nfsv4@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/nfsv4/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/nfsv4/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/ietf-wg-nfsv4/flexfiles-v2-proxy-server"/>.</t>
    </note>
    <note>
      <name>Note to Readers</name>
      <?line 61?>

<t>This is an individual submission and does not reflect Working Group
consensus.  The "About This Document" section above has the current
discussion venue, latest rendering, and source location.</t>
    </note>
  </front>
  <middle>
    <?line 67?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The Flexible Files Version 2 layout type
(<xref target="I-D.haynes-nfsv4-flexfiles-v2"/>) introduces client-side
erasure coding for pNFS and a per-chunk repair protocol
(CB_CHUNK_REPAIR) that lets the metadata server direct an
active client to reconstruct individual damaged chunks.  That
mechanism is sufficient for repairs whose scope is a handful of
chunks in a file that has at least one live client.</t>
      <t>Three classes of work are outside the per-chunk repair model.
The first is whole-file repair: the case in which enough
data servers have failed that per-chunk reconstruction would
require visiting every chunk, or in which no live client is
available to drive the repair at all.  The second is layout
transitions: a file must move from one layout geometry to
another for policy reasons (migrating to a new encoding type, or
re-mirroring), for maintenance reasons (evacuating a data
server ahead of decommission), or for environmental reasons
(moving between transport-security profiles or between
filehandle backends).  The third is encoding translation: a
client that cannot participate in the file's native encoding --
including every NFSv3 client, and any legacy or minimal NFSv4
client that does not implement the file's encoding type --
still needs to read and write the file.</t>
      <t>This document specifies a proxy server role to
address those three cases with a single mechanism: the proxy server
opens a session to the metadata server and registers its
capabilities via PROXY_REGISTRATION; the proxy server then polls the
metadata server using PROXY_PROGRESS for work assignments (move, repair),
which the metadata server returns inline in the poll response; the proxy server
carries out each assignment and signals completion via
PROXY_DONE (or abort via PROXY_CANCEL).  All of the proxy-server-to-metadata-server
coordination is fore-channel; the proxy server does not require a
back-channel callback program.  A client reaches a proxied
file either by contacting the proxy server directly, as an ordinary
NFS server, or through a pNFS layout whose data server is
the proxy server.  While a migration is in progress every client
routes its I/O through the proxy server; for encoding translation, only
a client that cannot encode the file does.</t>
      <t>The flexible file v1 layout (<xref target="RFC8435"/>) provides no standardized mechanism
for migrating a file's layout while the file remains in use.  Without such
primitives, migration is left to implementation-specific
machinery and cannot be performed safely across
implementations.  This design codifies that mechanism, closing
what is today the single biggest interop gap between pNFS and
other parallel filesystems that already expose migration
primitives.</t>
    </section>
    <section anchor="requirements-language">
      <name>Requirements Language</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

</section>
    <section anchor="definitions">
      <name>Definitions</name>
      <t>The following terms are used with meanings defined in
<xref target="I-D.haynes-nfsv4-flexfiles-v2"/>:</t>
      <ul spacing="normal">
        <li>
          <t>data server, metadata server</t>
        </li>
        <li>
          <t>layout, mirror, mirror set, shard, stripe</t>
        </li>
        <li>
          <t>chunk (the unit of client-driven encoded write/read), and the
chunk state machine (PENDING / FINALIZED / COMMITTED)</t>
        </li>
        <li>
          <t>encoding type, k (number of data shards), m (number of
parity shards)</t>
        </li>
        <li>
          <t><tt>ffv2_layout4</tt>, <tt>ffv2_mirror4</tt>, <tt>ffv2_data_server4</tt>,
<tt>ffv2_encoding_type4</tt>, <tt>FFV2_DS_FLAGS_PROXY</tt> -- the layout XDR
types and flags</t>
        </li>
        <li>
          <t>CHUNK_READ, CHUNK_WRITE, CHUNK_FINALIZE, CHUNK_COMMIT -- the
chunk-level data-path operations</t>
        </li>
        <li>
          <t>TRUST_STATEID / REVOKE_STATEID / BULK_REVOKE_STATEID -- the
metadata-server-to-data-server control-plane fencing ops</t>
        </li>
      </ul>
      <t>Local terms defined in this document:</t>
      <dl>
        <dt>Proxy server (PS):</dt>
        <dd>
          <t>A host registered with the metadata server via
PROXY_REGISTRATION (<xref target="sec-PROXY_REGISTRATION"/>) that
accepts and drives file-level migration, repair, and
encoding-translation assignments on behalf of the metadata
server.  The proxy server is a pNFS client of the metadata
server (it drives OPEN + LAYOUTGET like any other pNFS
client), and it appears as a data server in the layouts the
metadata server issues to end clients while the proxy
operation is active.</t>
        </dd>
        <dt>Registered proxy server:</dt>
        <dd>
          <t>A proxy server whose PROXY_REGISTRATION has been accepted
by the metadata server and whose lease has not expired.</t>
        </dd>
        <dt>Proxy operation:</dt>
        <dd>
          <t>A metadata-server-orchestrated activity carried out by a
proxy server on a single file: a migration (<tt>PROXY_OP_MOVE</tt>), a
repair (<tt>PROXY_OP_REPAIR</tt>), or an encoding translation.  The
first two are delivered to the proxy server as work; either is
referred to as an "assignment" once the metadata server has
committed it to a specific proxy server and minted a
<tt>proxy_stateid</tt> for it (<xref target="sec-proxy-stateid"/>).  An encoding
translation has no <tt>proxy_op_kind4</tt> value and is never
assigned: the metadata server routes an encoding-ignorant
client to the proxy server by the layout it hands out, and the
file's own state does not change (<xref target="sec-encoding-translation"/>).</t>
        </dd>
        <dt>Migration:</dt>
        <dd>
          <t>A <tt>PROXY_OP_MOVE</tt> proxy operation that shifts a file
from one mirror set (L1, the source) to another (L2, the
destination).</t>
        </dd>
        <dt>Assignment:</dt>
        <dd>
          <t>A <tt>proxy_assignment4</tt> the metadata server has minted and is
delivering (or has delivered) to a specific proxy server;
named by its <tt>proxy_stateid</tt>.</t>
        </dd>
        <dt>L1, L2, L3:</dt>
        <dd>
          <t>The three mirror-set roles the metadata server tracks while
a proxy operation is in flight on a file.  L1 is the source
layout (the file's layout before the proxy operation
started), L2 is the destination layout (the file's layout
after PROXY_DONE succeeds), and L3 is the composite layout
naming the proxy server as a data server, issued to end
clients while the proxy operation is in flight and to the
proxy server via OPEN(CLAIM_PROXY).  Defined precisely in
<xref target="sec-design-model"/>.</t>
        </dd>
        <dt>Sidecar:</dt>
        <dd>
          <t>Per-migration reclaim state a metadata server <bcp14>MAY</bcp14> retain
across its own reboot to permit a reconnecting proxy server
to resume in-flight work.  Sidecar contents are
implementation-defined; the wire mechanism does not require
the metadata server to retain any sidecar.</t>
        </dd>
        <dt>Autopilot:</dt>
        <dd>
          <t>The metadata server's internal assignment-selection policy
engine.  The wire protocol does not constrain how the
autopilot chooses proxies or when it issues assignments;
the autopilot is named in this document only to
disambiguate metadata-server-initiated actions from
proxy-server-initiated ones.</t>
        </dd>
      </dl>
      <section anchor="sec-relation-to-parent">
        <name>Relation to Sibling Flexible File Version 2 Documents</name>
        <t><xref target="I-D.haynes-nfsv4-flexfiles-v2"/> defines CB_CHUNK_REPAIR and
the per-chunk repair model.  This document is the companion
whole-file and per-client mechanism.  Per-chunk and whole-file
operations are mutually exclusive for a given file at a given
time; coexistence rules are in <xref target="interaction"/>.</t>
      </section>
    </section>
    <section anchor="scope">
      <name>Scope</name>
      <t>This section draws the boundary between the wire-level
mechanism defined here and the much larger space of useful
behaviors a proxy implementation might support.  Drawing
the boundary tightly keeps the protocol small enough to
specify and implement in a single revision; everything
beyond the boundary is either future work or implementation
latitude, and both categories are called out below so later
readers know which is which.</t>
      <section anchor="in-scope">
        <name>In Scope</name>
        <t>This document defines a new protocol role, a new session,
and a small set of operations that flow on that session.
Around that core it specifies the layout conventions a
client observes while a proxy operation is active, the
credential-forwarding rules a translating proxy must
follow, and the recovery semantics for the three actor
failures that matter during an operation (proxy server, metadata server, data server).</t>
        <t>The new role is the proxy server, distinct from
the metadata server and data server roles defined in
<xref target="I-D.haynes-nfsv4-flexfiles-v2"/>.  A proxy server registers with a
metadata server and, on receipt of a directive from that metadata server, performs
a move, a repair, or an ongoing encoding translation on behalf
of a client.  The proxy server is opaque to most clients and is
visible to the metadata server through a dedicated NFSv4.1+ session that
the proxy server itself opens.  All proxy-server-to-metadata-server coordination is fore-channel:
the proxy server issues ops to the metadata server, and the metadata server returns work
assignments inline in its responses.  No callback channel is
required for the proxy server protocol.</t>
        <t>The fore-channel protocol is deliberately small.
PROXY_REGISTRATION (<xref target="sec-PROXY_REGISTRATION"/>) lets the proxy server
declare the encoding set it supports and its lease.
PROXY_PROGRESS
(<xref target="sec-PROXY_PROGRESS"/>) is the proxy server's heartbeat and
poll: the proxy server sends it within its registration lease and the
metadata server replies with zero or more new work assignments
inline.  PROXY_DONE
(<xref target="sec-PROXY_DONE"/>) commits or rolls back a migration when
the proxy server finishes it; PROXY_CANCEL (<xref target="sec-PROXY_CANCEL"/>) lets
the proxy server abort early.  All four ops are fore-channel
proxy-server-to-metadata-server.</t>
        <t>Around the operation set, the document specifies the layout
conventions a client sees during a proxy operation and how
a client discovers the proxy server in the first place.</t>
        <t>Encoding translation for encoding-ignorant clients, including
NFSv3 clients, is in scope, and is the one case that
stretches the move/repair vocabulary.  The same proxy
machinery that handles move and repair also provides the
persistent per-client translation that lets a client
incapable of participating in a file's native encoding still
read and write the file.  Unlike move and repair, which are
transient transitions on the file, encoding translation is an
ongoing routing arrangement that persists as long as the
encoding-ignorant client is active.</t>
        <t>Credential-forwarding rules for a proxy that translates on
behalf of a client are defined in the Security
Considerations section.  The proxy is a translator, not an
authority: authorization decisions <bcp14>MUST</bcp14> remain with the
metadata server, using the client's forwarded credentials.  Getting
this boundary wrong turns the proxy server into a privilege-elevation
vehicle, so the rules are stated normatively and enforced
at the metadata server rather than policed on the wire.</t>
        <t>Finally, the document defines recovery semantics for the
three actor failures that matter during a proxy operation
-- proxy server failure, metadata server failure, and data server failure -- each with its
own fencing and re-registration rules so that a
mid-operation crash does not leave a file in an
unrecoverable state.</t>
      </section>
      <section anchor="sec-scope-out">
        <name>Out of Scope</name>
        <t>The items below are deliberately deferred.  They split
into three groups: features whose absence was an explicit
design decision (delta journaling, partial-range moves),
orchestration that belongs to a layer above a single
proxy (multi-proxy pipelines, automated load balancing),
and proxy-internal behavior that does not appear on the
wire and therefore needs no standardization.  Nothing on
this list is precluded by the current design; each is a
reasonable future extension.</t>
        <dl>
          <dt>Journaling and partial moves:</dt>
          <dd>
            <t>Move assignments in this revision are always whole-file.
The proxy server performs a client-side mirroring write
(see the Client-Side Mirroring section of
<xref target="I-D.haynes-nfsv4-flexfiles-v2"/>) to all mirrors -- source
D, destination G, and any other mirrors in the file's
mirror set -- while reading source bytes from any mirror
in the source set; the two-layout state on the metadata server keeps
client traffic on L1 throughout, with an atomic swap to
L2 at PROXY_DONE time (<xref target="sec-two-layout-state"/>).</t>
          </dd>
          <dt>Orchestration beyond a single proxy:</dt>
          <dd>
            <t>Multi-proxy pipelines (staged moves for very large
files) and automated load balancing or predictive
selection across registered proxies are out of scope.
A metadata server in this revision selects a single proxy server per
operation; load distribution across many proxies, when
it matters, is expected to be handled by the metadata server's
selection policy and requires no new wire protocol.</t>
          </dd>
          <dt>Server-side copy as an alternative path:</dt>
          <dd>
            <t>Integration with server-side copy (<xref section="4" sectionFormat="of" target="RFC7862"/>)
as an alternative to proxy-server-driven moves for single-file
moves within one namespace is adjacent work.  The two
mechanisms are complementary (server-side copy is a
client-directed intra-server operation; the proxy-server-driven
move is a metadata-server-directed inter-server operation), and
their intersection -- for example, using server-side
copy under the hood of a proxy server move assignment -- is better
specified in its own extension rather than bolted into
this document.</t>
          </dd>
          <dt>Proxy-internal features that do not appear on the wire:</dt>
          <dd>
            <t>A proxy <bcp14>MAY</bcp14> implement content-integrity and
error-correction layers, encryption and compression
pass-through, log-structured write staging, and
sector-alignment normalization.  These are useful
motivating scenarios for the move/repair vocabulary but
do not require new protocol machinery beyond what the
PROXY_PROGRESS / PROXY_DONE / PROXY_CANCEL fore-channel
set already provides, and so they are left to
implementation rather than standardized here.</t>
          </dd>
        </dl>
      </section>
    </section>
    <section anchor="use-cases">
      <name>Use Cases</name>
      <t>Seven motivating scenarios converge on the same mechanism.
Six of them are transient transitions on the file itself: the
file is changing state (being ingested, re-coded, evacuated,
reconstructed, migrated between transport-security profiles,
or migrated between filehandle backends), and the transition
is what the proxy server drives to completion.  The seventh is
qualitatively different: the file is not changing, but
specific clients -- those that cannot participate in the
file's native encoding -- are routed through a proxy server persistently,
for as long as they are active.</t>
      <t>The distinction matters for how the metadata server schedules work.
Transient transitions have a terminal state; the metadata server expects
each one to complete (via PROXY_DONE, or to fail via
PROXY_DONE(FAIL) / PROXY_CANCEL) and then to retire the
associated layout.  The persistent routing case
has no terminal state for the file as a whole; the proxy server stays in
the layouts of encoding-ignorant clients as long as those
clients are open.</t>
      <t>In every case, a registered proxy server becomes the source of truth
for a file's data during the operation, and clients are
redirected to route I/O through that proxy server rather than directly
to the original layout's data servers.  The individual
scenarios are described below.</t>
      <section anchor="administrative-ingest">
        <name>Administrative Ingest</name>
        <t>An administrator rsyncs a file from an external source into the
cluster as a single-copy file.  Server policy requires the file
to be mirrored or erasure coded.  The metadata server queues a
<tt>PROXY_OP_MOVE</tt> assignment for the file; the next PROXY_PROGRESS poll from a
registered proxy whose encoding set covers the destination layout
returns the assignment in its response.  The proxy populates
the destination from the source, while any client that opens
the file during the move sees a layout that routes I/O through
the proxy.</t>
        <t>The source "layout" may not even be a flexible file layout; it
could be a non-pNFS NFS mount that the proxy reads as an
NFSv4.2 client.  Throughout the move the proxy presents the
file to pNFS clients as if the move had not started, while
populating the destination in the background.</t>
      </section>
      <section anchor="policy-driven-layout-transition">
        <name>Policy-Driven Layout Transition</name>
        <t>A server-objective or policy change ("files older than 30 days
must be erasure coded", "high-access-rate files must have
additional mirrors") requires transforming a file's layout
without user visibility.  The transformation is purely a layout
change; the file contents are unchanged except at the shard
level.  The <tt>PROXY_OP_MOVE</tt> assignment carries the new layout's geometry
and encoding type via the destination deviceid in
<tt>proxy_assignment4</tt>; the proxy reshapes the file's shards to
match.  Because the transformation type (encode / decode /
transcode) is entirely specified by the (source, destination)
deviceid pair plus the file's recorded layout type, the
assignment does not need a separate transformation-class
field.</t>
      </section>
      <section anchor="data-server-maintenance-evacuation">
        <name>Data Server Maintenance / Evacuation</name>
        <t>A data server is scheduled for maintenance (hardware
replacement, software upgrade, decommission).  All files whose
layouts reference that data server must be evacuated to replacement
data servers before it is taken offline.  The metadata server queues a
<tt>PROXY_OP_MOVE</tt> assignment per file (source = the outgoing data server, target = a
replacement); registered proxies pick the assignments up via
PROXY_PROGRESS polls.  Evacuation can be large-scale (thousands
or millions of files); running per-client per-chunk repair over
every file would be prohibitively expensive, but a single
registered proxy can drive many concurrent migrations subject
to the per-proxy server in-flight cap (<xref target="sec-multi-ps-fanout"/>).</t>
      </section>
      <section anchor="whole-file-repair">
        <name>Whole-File Repair</name>
        <t>Multiple data servers have failed such that per-chunk repair cannot
reconstruct the file in place.  The metadata server constructs a new layout
backed by replacement data servers and queues a <tt>PROXY_OP_REPAIR</tt> assignment.  The
next registered-proxy server PROXY_PROGRESS poll receives the assignment;
the proxy drives reconstruction from whatever surviving shards
remain.  If fewer than k shards survive across the mirror set,
the proxy reports terminal failure via PROXY_DONE with
<tt>pd_status</tt> set to <tt>NFS4ERR_PAYLOAD_LOST</tt>, matching the
per-chunk repair semantics in the Selecting the Repair Actor
section of <xref target="I-D.haynes-nfsv4-flexfiles-v2"/>.</t>
      </section>
      <section anchor="tls-coverage-transition">
        <name>TLS Coverage Transition</name>
        <t>Transport Layer Security (TLS) protects the RPC transport as specified
by RPC-over-TLS <xref target="RFC9289"/>.  A file whose layout currently points at
data servers that do not support it needs to be migrated to
TLS-capable data servers, or vice versa (an inventory change, a policy
change mandating transport security, onboarding a new storage class
whose data servers are TLS-only).
A <tt>PROXY_OP_MOVE</tt> assignment applies: the destination data servers
have the required transport security profile, the source data servers
are retired.  A
client that arrives mid-transition is routed through the proxy
and does not directly see the heterogeneous data server set.</t>
        <t>The proxy establishes its own RPC connections to source and
destination data servers, potentially with different transport security
profiles (non-TLS to source, mutual TLS <xref target="RFC9289"/> to
destination, or any other combination).  The proxy's per-data server
security is independent of the client's security to the proxy.</t>
      </section>
      <section anchor="filehandle-storage-backend-transition">
        <name>Filehandle / Storage-Backend Transition</name>
        <t>A data server changes the filehandles it issues for a file; this
happens when the data server's underlying storage is migrated (e.g.,
from one backend object store to another) and the old
filehandles become unresolvable on the new backend.  Without a
proxy, every client holding a layout has to be individually
recalled and re-issued.  With a proxy, the metadata server points all
clients at the proxy (keeping their existing stateids and filehandles
intact), the proxy reconciles old-to-new filehandles internally, and
clients are recalled only at the end.</t>
        <t>This same mechanism covers several related situations: an
NFSv3-to-NFSv4.2 data server protocol upgrade where the data server
filehandles change as a side effect of migrating from <xref target="RFC1813"/> to
<xref target="RFC7862"/> semantics; a data-server-side format change that
invalidates existing filehandles (for example, a transition from a
local POSIX store to an object store); and backend-opaque filehandle
migration where the data server's filehandle structure is internally
versioned and old clients hold stale versions.</t>
      </section>
      <section anchor="sec-encoding-translation">
        <name>Encoding Translation for Encoding-Ignorant Clients</name>
        <t>The coding-type registry defined in the IANA Considerations of
<xref target="I-D.haynes-nfsv4-flexfiles-v2"/> is expected to grow.  Not
every client is required to implement every registered encoding;
a minimal client, a legacy client, or an NFSv3 client typically
cannot participate in erasure-coded files at all.  Per the
encoding-negotiation rules in <xref target="I-D.haynes-nfsv4-flexfiles-v2"/>,
such a client either retries with a different supported_types
hint, falls back to metadata-server-terminated I/O, or (this case) is
routed through a proxy that translates on its behalf.</t>
        <t>Unlike the move, repair, evacuation, and transition use cases
above, encoding translation is persistent per client.  The
file itself is not changing state.  What changes is the layout
the metadata server hands to an encoding-ignorant client: that client gets a
single-data server layout naming a translating proxy server, with a coding_type
the client does support (typically FFV2_ENCODING_MIRRORED, or
for NFSv3 clients just a flat NFSv3 data path).  The proxy
encodes and decodes on the fly against the real data servers; the
client sees a flat file.</t>
        <t>The same file may be accessed directly by encoding-aware clients
(with a normal layout naming the real data servers) and through the
proxy by encoding-ignorant clients (with a proxy layout)
simultaneously.  The metadata server issues a different layout per
request; only the encoding-ignorant case routes through the proxy server.</t>
        <t>For NFSv4-family clients (NFSv4.0, NFSv4.1, or NFSv4.2
encoding-ignorant), the routing arrangement is on-wire: the metadata server
returns a proxy-fronted layout in LAYOUTGET, and the client's
existing mount continues to work; the metadata server, not the
client, decides that this client's next layout points at the proxy
server.</t>
        <t>NFSv3 client routing, by contrast, is NOT dynamic on the wire.  An
NFSv3 client cannot receive a pNFS layout, cannot observe the flexible file v2 layout
proxy indication, and has no protocol path by which the metadata
server can redirect an already-mounted NFSv3 client through the
proxy server.  NFSv3 routing is therefore an out-of-band front-door
export deployment, described here so implementers do not read the
NFSv3 flow diagrams as implying on-wire redirection:</t>
        <ul spacing="normal">
          <li>
            <t>The NFSv3 client mounts the proxy server's NFSv3 export from the
start.  The proxy server is the client's server for
<xref target="RFC1813"/> MOUNT and for every subsequent NFSv3 op; the
metadata server is invisible to the NFSv3 client.</t>
          </li>
          <li>
            <t>Filehandle authority belongs to the proxy server.  The proxy
server mints its own NFSv3 filehandles (opaque to the client per
<xref section="3.3.2" sectionFormat="of" target="RFC1813"/>) and maintains an internal mapping from each
NFSv3 filehandle to the (metadata-server file, current layout)
pair.  The NFSv3 filehandle bytes are not derived from and do
not need to match the metadata-server-issued nfs_fh4.</t>
          </li>
          <li>
            <t>Export namespace authority belongs to the proxy server.  The
proxy server owns the exports it serves to NFSv3 clients; a
given proxy server <bcp14>MAY</bcp14> re-export a subset of the metadata
server's namespace, and a deployment <bcp14>MAY</bcp14> run multiple proxy
servers each re-exporting different subsets.  The metadata
server is not required to be an NFSv3 server.</t>
          </li>
          <li>
            <t>Because the routing is fixed at mount time, no on-wire
discovery contract exists between the metadata server and the
NFSv3 client: the deployment operator directs NFSv3 clients at
the proxy server via the normal MOUNT protocol
(<xref section="5" sectionFormat="of" target="RFC1813"/>) and DNS or administrative means.
A metadata
server that decides to retire or migrate a proxy server <bcp14>MUST</bcp14>
coordinate that change with the operator; there is no
protocol path by which the metadata server can cause a mounted
NFSv3 client to fail over automatically.</t>
          </li>
        </ul>
        <t>The NFSv3 read/write flows described below are therefore what the
proxy server does when it receives an NFSv3 op from a client that
was mounted at the proxy server's endpoint from the start; they
are not what the metadata server does to redirect an existing
NFSv3 client.</t>
        <section anchor="mechanism">
          <name>Mechanism</name>
          <t>A translating proxy runs two sides that meet internally.  On
its client-facing side it speaks the protocol the
encoding-ignorant client can speak: for an NFSv3 <xref target="RFC1813"/>
client that is an NFSv3 server that re-exports the metadata server's
namespace; for a legacy NFSv4.2 client that understands only
some encodings, it is an NFSv4.2 data-server interface presenting
FFV2_ENCODING_MIRRORED (or an equivalent encoding the client
supports).  On its metadata-server-facing side it is an NFSv4.2
client to the metadata server plus whatever data server protocol the metadata server's real
data servers speak.  The proxy translates each client-facing op into
the corresponding metadata server or data server op, applies the encoding
transformation between the two, and returns results.</t>
          <t>For an NFSv3 client, a read flows:</t>
          <ul spacing="normal">
            <li>
              <t>Client: NFSv3 <tt>READ</tt> against the proxy.</t>
            </li>
            <li>
              <t>Proxy: if it does not hold a layout for the file, issues
<tt>LAYOUTGET</tt> on the metadata server with the client's forwarded
credentials (see Security Considerations).</t>
            </li>
            <li>
              <t>Proxy: issues <tt>CHUNK_READ</tt> (or v3 <tt>READ</tt> if the data server is
NFSv3) against the real data servers, decodes the shards back to
plaintext.</t>
            </li>
            <li>
              <t>Proxy: returns the plaintext bytes in the NFSv3 READ
reply.</t>
            </li>
          </ul>
          <t>A write flows:</t>
          <ul spacing="normal">
            <li>
              <t>Client: NFSv3 <tt>WRITE</tt> with stable_how and a byte range.</t>
            </li>
            <li>
              <t>Proxy: encodes the bytes per the file's encoding, issues
<tt>CHUNK_WRITE</tt> / <tt>CHUNK_FINALIZE</tt> / <tt>CHUNK_COMMIT</tt> against
the real data servers.  If the client requested <tt>FILE_SYNC</tt>
or <tt>DATA_SYNC</tt>, the proxy <bcp14>MUST NOT</bcp14> reply until every mirror
in the target set has committed the range at (at least) the
requested stability; if the back-end cannot provide that
stability, the proxy fails the WRITE per <xref section="3.3.7" sectionFormat="of" target="RFC1813"/>
(returning <tt>NFS3ERR_IO</tt>) rather than replying success at a
weaker stability.</t>
            </li>
            <li>
              <t>Proxy: for a successful WRITE, returns NFSv3 WRITE ok
reporting the stability actually achieved (which <bcp14>MUST</bcp14> be
&gt;= the requested stable_how; per <xref section="3.3.7" sectionFormat="of" target="RFC1813"/> a
server may return a stronger stability than requested but
<bcp14>MUST NOT</bcp14> return a weaker one).  For an <tt>UNSTABLE</tt> client
request the proxy <bcp14>MAY</bcp14> reply as soon as it has accepted the
data; a subsequent client <tt>COMMIT</tt> drives the range to
durability across every mirror in the target set (see the
M2 durability rule above).</t>
            </li>
          </ul>
        </section>
        <section anchor="stateid-binding-on-the-translated-path">
          <name>Stateid binding on the translated path</name>
          <t>Encoding translation crosses two RPC boundaries -- client &lt;-&gt;
proxy server and proxy server &lt;-&gt; real data server(s) -- and
each leg carries its own stateid, minted by the server on that
leg.</t>
          <t>On the client &lt;-&gt; proxy server leg, the client uses the stateids
the metadata server issued to it: the open, lock, and layout
stateids for the proxy layout it received from LAYOUTGET.  The
proxy server is that leg's data server for I/O purposes, so the
stateids the client carries are exactly what any flexible file v2 layout client
carries against any data server; the client does not present
(and does not know about) any proxy-side stateid.</t>
          <t>On the proxy server &lt;-&gt; real data server leg, the proxy server
uses the layout stateid it acquired from its own
<tt>OPEN(CLAIM_PROXY)</tt> + LAYOUTGET against <tt>pa_file_fh</tt> (see
<xref target="sec-claim-proxy"/>).  That layout is the L3 composite covering
both source and destination data servers, and its stateid
governs every <tt>CHUNK_READ</tt>, <tt>CHUNK_WRITE</tt>, <tt>CHUNK_FINALIZE</tt>, and
<tt>CHUNK_COMMIT</tt> the proxy issues on the back end.  The client's
stateid is not relayed to the real data servers, and the
<tt>proxy_stateid4</tt> -- which lives in the proxy server &lt;-&gt; metadata
server plane (<xref target="sec-proxy-stateid"/>) -- is never presented to a
data server.</t>
          <t>No <tt>TRUST_STATEID</tt> relay of the client's stateid to the back-end
data servers is required, because the proxy server operates on
the back end under its own layout stateid, not by impersonating
the client at the stateid layer.  Client-identity forwarding
happens at the credential layer (see
<xref target="sec-credential-forwarding"/>), independently of the stateid
each leg uses to name the file's I/O state.</t>
        </section>
        <section anchor="why-the-same-proxyregistration-machinery">
          <name>Why the same PROXY_REGISTRATION machinery</name>
          <t>The registered-proxy server mechanism gives the metadata server the information it
needs for translation-proxy selection: <tt>pra_encodings</tt> enumerates
the encodings the proxy server can translate between, the metadata server &lt;-&gt; proxy server
session carries the fore-channel control-plane traffic, and
the lease bounds the relationship.  No new op is required for
the translation case -- the existing <tt>PROXY_REGISTRATION</tt>
covers it.  <tt>PROXY_OP_MOVE</tt> and <tt>PROXY_OP_REPAIR</tt> assignments
are not used for pure translation (the file is not moving or
being repaired); the proxy server simply serves the encoding-ignorant
client's I/O requests against the unchanged source layout.</t>
        </section>
      </section>
    </section>
    <section anchor="sec-design-model">
      <name>Design Model</name>
      <section anchor="roles">
        <name>Roles</name>
        <t>This document introduces a third role alongside the pNFS
metadata server and data server:</t>
        <dl>
          <dt>Proxy server:</dt>
          <dd>
            <t>A persistent, registered peer of the metadata server that carries out
whole-file operations on the metadata server's behalf -- moving file
content between layouts, reconstructing files whose source
layout has been damaged, and translating encodings on behalf of
clients that cannot participate in the file's native
encoding.  A proxy server is a distinct role from a data server; a given server
<bcp14>MAY</bcp14> implement both, and typically does, but the protocol
does not require that.  The metadata server sees the proxy server through a
dedicated session whose direction is defined in
<xref target="sec-design-session"/>.</t>
          </dd>
        </dl>
        <t>The existing roles are unchanged:</t>
        <dl>
          <dt>Metadata server:</dt>
          <dd>
            <t>As defined in <xref target="I-D.haynes-nfsv4-flexfiles-v2"/>: the
coordinator for each file, and the authority that issues
layouts, manages stateids, and selects repair participants.</t>
          </dd>
          <dt>Data server:</dt>
          <dd>
            <t>As defined in <xref target="I-D.haynes-nfsv4-flexfiles-v2"/>: serves the
CHUNK data path to pNFS clients.</t>
          </dd>
        </dl>
        <t>Only one of the three pairs carries new ops in this document.
The metadata server &lt;-&gt; proxy server pair gains the new proxy-server-to-metadata-server regular ops for
registration, progress, and terminal reporting
(<xref target="sec-new-ops"/>).  No new callback ops are introduced; the
metadata server pulls work assignments to the proxy server in the PROXY_PROGRESS
reply on the fore-channel, and the proxy server reports completion or
cancellation back via PROXY_DONE / PROXY_CANCEL on the same
session, so no callback program is required for this protocol.
The Client &lt;-&gt; proxy server pair gains no new ops: clients reach a proxy server
through the normal pNFS data path, seeing it as the data server named
in a single-data server layout (<xref target="sec-layout-shape"/>).  The metadata server &lt;-&gt; data server pair is also
unchanged; the tight-coupling control session in
<xref target="I-D.haynes-nfsv4-flexfiles-v2"/> carries over as defined
there.</t>
      </section>
      <section anchor="layout-model">
        <name>Layout Model</name>
        <section anchor="single-layout-model">
          <name>Single-Layout Model</name>
          <t>This design uses a single layout naming the proxy server as the sole
data server rather than two linked layouts.  Three considerations drive
that choice.  pNFS clients already handle single layouts
cleanly, so no new layout-linkage mechanism needs to be
invented or implemented on the client.  The client's view of
the file -- "the file's data server is the proxy server" -- is the truth during
the operation, so exposing the source and destination data servers
directly would invite confusion about which entry to address
rather than clarify.  And late-arriving clients see the proxy
layout from the start, without any separate setup path to
join an operation already in progress.  The alternative -- a
source layout plus a destination layout linked by a
redirector record -- was considered and rejected on those
three grounds.</t>
          <t>Routing all client I/O through the proxy server has a cost deployments
must weigh.  For the duration of a migration the proxy server is a
data-path single point of failure for the file: the client
sees one data server, the proxy server, and the usual flexible file
mitigation -- client-side mirroring across several data servers -- is
unavailable to it.  A file under migration therefore has
lower availability than a normally-mirrored file until
PROXY_DONE.  The proxy server is also a throughput funnel: all client
read and write traffic for the file, plus the proxy server's own copy
traffic, passes through one proxy server, adding a latency hop and a
bandwidth bottleneck.  These costs are inherent to the
single-layout choice; they argue against migrating very
large files in a single proxy operation, and motivate the
multi-proxy and partial-range extensions listed as out of scope
(<xref target="sec-scope-out"/>).</t>
        </section>
        <section anchor="sec-two-layout-state">
          <name>Two-Layout State on the Metadata Server Side</name>
          <t>For each file F whose mirror on a draining data server D is being
migrated, the metadata server keeps three logical layout records.  Only
L3 backs a client-facing layout; L1 and L2 are metadata-server-internal
bookkeeping for the duration of the migration.</t>
          <dl>
            <dt>L1:</dt>
            <dd>
              <t>the pre-migration mirror set, including D.  This record
is metadata-server-internal: it preserves what the file's layout was
before the migration and is handed to no client while the
migration is active.</t>
            </dd>
            <dt>L2:</dt>
            <dd>
              <t>the post-migration mirror set: L1 with D replaced by the
target G.  Also metadata-server-internal; it becomes the file's
layout after the PROXY_DONE swap.</t>
            </dd>
            <dt>L3:</dt>
            <dd>
              <t>the composite the proxy server works from.  It backs the layout
every client is served during the migration: that
client-facing layout names the proxy server as its data server, and
the proxy server does the real I/O against L3's two mirror entries:
</t>
              <ul spacing="normal">
                <li>
                  <t><tt>M1</tt> (read source): the L1 mirror set.  The proxy server reads
source bytes from any mirror in M1.</t>
                </li>
                <li>
                  <t><tt>M2</tt> (write target): the L1 mirror set PLUS G.  The proxy server
writes via client-side mirroring to every mirror in M2.</t>
                </li>
              </ul>
            </dd>
          </dl>
          <t>During the migration every client of F -- whichever front
door it used -- is served a layout naming the proxy server; the proxy server is
the sole writer to M1 and M2.  No client addresses D or G
directly.  Because the proxy server is the sole writer, the M2
durability rule applies at the stability the client requested:
for a <tt>FILE_SYNC</tt> client write, or for a client-issued <tt>COMMIT</tt>,
the proxy server <bcp14>MUST NOT</bcp14> acknowledge until every mirror in M2
is durable at that byte range; for an <tt>UNSTABLE</tt> client write,
the proxy server <bcp14>MAY</bcp14> acknowledge as soon as it has accepted the
data and <bcp14>MUST NOT</bcp14> report a stability higher than what the
back-end mirrors have actually achieved.  A subsequent <tt>COMMIT</tt>
against that byte range <bcp14>MUST NOT</bcp14> return success until every
mirror in M2 has committed it.  The invariant is that a proxy
server crash cannot leave a byte range durable-per-client
(FILE_SYNC-ack'd or COMMIT-ack'd) but applied to only part of
the target mirror set; UNSTABLE writes acquire durability at
COMMIT time as they would against any NFS server.</t>
          <t>D's presence in M2 (alongside G) is intentional: the proxy server keeps
D a current mirror until the PROXY_DONE swap, so a cancelled
migration can fall back to L1 with no data loss.  The proxy server
writes both D and G, and because the proxy server is the only writer
they converge to the same byte image with no inter-writer
race.</t>
          <t>Either endpoint <bcp14>MAY</bcp14> be an NFSv3 data server.  The proxy server speaks
to each mirror in that mirror's own protocol: NFSv3 semantics to an
NFSv3 data server, CHUNK semantics to an NFSv4.2 one.  A migration may
therefore bridge in either direction, or in neither.  An NFSv3 mirror
holds the file under FFV2_ENCODING_PASSTHROUGH, since the chunked
encodings require NFSv4.2's CHUNK operations, so a migration that
changes the protocol of a mirror is also an encoding transition.  The
asymmetric-protocol bridging is the proxy server's responsibility and
is not visible to the client.</t>
        </section>
        <section anchor="pinned-definitions">
          <name>Pinned definitions</name>
          <ul spacing="normal">
            <li>
              <t>L1.mirrors = the file's pre-migration mirror set, includes D</t>
            </li>
            <li>
              <t>L2.mirrors = L1.mirrors without D, union {G}</t>
            </li>
            <li>
              <t>L3.M1 = L1.mirrors  (proxy server's read-source set)</t>
            </li>
            <li>
              <t>L3.M2 = L1.mirrors union {G}  (proxy server's
client-side mirroring write-target set)</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="sec-design-session">
        <name>Session Between Metadata Server and Proxy Server</name>
        <t>The proxy server opens an NFSv4.1+ session to the metadata server as a normal
client.  All proxy-server-to-metadata-server coordination flows on the fore-channel of
that session: PROXY_REGISTRATION establishes the relationship,
PROXY_PROGRESS heartbeats and pulls work assignments,
PROXY_DONE / PROXY_CANCEL report terminal state.  No callback
program is required for the proxy server protocol -- the session's
back-channel is unused by this draft (the proxy server may still
establish one for unrelated NFSv4.1 callbacks if it wishes,
but no proxy-server-protocol op rides on it).</t>
        <t>The session direction is intentionally opposite to the
metadata server -&gt; data server tight-coupling control session in
<xref target="I-D.haynes-nfsv4-flexfiles-v2"/>: that session is opened by
the metadata server to carry metadata-server-originated stateid management to a data server.
The metadata server &lt;-&gt; proxy server session is opened by the proxy server because registration
is a proxy-server-initiated act -- the proxy server is saying "here I am, with
these capabilities."  Without a proxy-server-to-metadata-server direction the
capability-advertisement would have to be inferred from
session-setup flags alone, which is inadequate for the range
of capabilities a proxy server can usefully advertise (encoding set
and -- as the DEVICEID_REGISTRATION open question
anticipates -- fault-zone coordinates and other deployment
attributes).</t>
        <t>A consequence of this direction choice is that a server that
implements both the data server and proxy server roles toward the same metadata server runs
two sessions between the same pair of hosts: the metadata server opens
the data server tight-coupling session toward the box, and the box's
proxy server opens the proxy server session toward the metadata server.  That is two
EXCHANGE_ID exchanges, two CREATE_SESSION exchanges, and two
TCP connections.  In deployments that use RPCSEC_GSS
(<xref target="RFC7861"/>) or RPC-over-TLS (<xref target="RFC9289"/>) on the proxy server
session -- which the credential-forwarding rules in
<xref target="sec-security"/> recommend for any proxy server that translates on
behalf of clients -- reserved-port trust is not in use and
the doubled connection has no security cost.  In a strict
AUTH_SYS-only deployment the second outbound reserved port
is a real but typically negligible cost, because a storage
box's outbound NFS traffic is usually limited to one
connection per metadata server it is registered with.</t>
      </section>
      <section anchor="flow-summary">
        <name>Flow Summary</name>
        <t>The proxy server opens a session to the metadata server and issues
PROXY_REGISTRATION, declaring its supported encodings; the metadata server
records the registration and returns a registration id with
a granted lease.  The proxy server then polls
the metadata server via PROXY_PROGRESS at lease/2 cadence (or as the
metadata server's <tt>ppr_lease_remaining_sec</tt> hint directs).  When the metadata server
decides to move or repair a file, it selects a registered proxy server
whose capabilities match the operation and queues an
assignment for that proxy server; the next PROXY_PROGRESS reply
delivers the assignment in its <tt>ppr_assignments&lt;&gt;</tt> array.
The proxy server picks the work up by issuing OPEN + LAYOUTGET on the
assignment's <tt>pa_file_fh</tt>, drives the data-movement phase
to completion, and reports terminal status by issuing
LAYOUTRETURN + PROXY_DONE in a single fore-channel compound
on the same session.  The metadata server may at any time retract an
assignment that the proxy server has not yet acknowledged via
OPEN+LAYOUTGET by including a <tt>PROXY_OP_CANCEL_PRIOR</tt>
assignment for the same <tt>(pa_file_fh, pa_target_deviceid)</tt>
pair in a subsequent PROXY_PROGRESS reply; the proxy server may cancel
work it has already started via the fore-channel
PROXY_CANCEL (<xref target="sec-PROXY_CANCEL"/>).</t>
        <t>Clients interact with the proxy server through the normal layout path.
During a proxy operation the metadata server hands out a single-data server
layout naming the proxy server; clients route CHUNK I/O to that data server.  Clients that arrive
mid-operation see the proxy layout from the start and need
no additional signalling; clients that held an older
(non-proxy) layout are recalled via CB_LAYOUTRECALL and
reacquire.</t>
      </section>
      <section anchor="message-sequence-policy-driven-move">
        <name>Message Sequence: Policy-Driven Move</name>
        <t>The simplest flow -- a quiesced whole-file move for a policy
transition.  Shown as a wire-level message sequence between
the three protocol actors; clients are elided because in the
quiesced case they are recalled before the proxy server work starts.</t>
        <figure anchor="fig-seq-policy-move">
          <name>Message sequence for a policy-driven move</name>
          <artwork><![CDATA[
  proxy server                                metadata server
  |                                 |
  | ---- CREATE_SESSION ----------> | (PS opens session to MDS)
  | <--- session est. ------------- |
  |                                 |
  | ---- PROXY_REGISTRATION ------> | (advertise encodings)
  | <--- reg_id, granted_lease ---- |
  |                                 |
  | ---- PROXY_PROGRESS ----------> | (heartbeat poll)
  | <--- NFS4_OK, ppr_assignments   | (zero or more entries; one
  |       includes MOVE assignment  |  delivers the MOVE work)
  |                                 |
  | ---- PUTFH(pa_file_fh) -------> | (PS picks up the work)
  | ---- OPEN(CLAIM_PROXY,          |
  |         pa_stateid) ----------> |
  | ---- LAYOUTGET (L3 composite) > |
  |                                 |
  |  [PS drives move: reads source  |
  |   DSes, encodes per destination |
  |   encoding, writes destination  |
  |   DSes via L3 fan-out]          |
  |                                 |
  | ---- PROXY_PROGRESS ----------> | (heartbeat; lease renewal,
  | <--- NFS4_OK, ppr_lease_rem.... |  no new assignment needed)
  |                                 |
  |  ...                            |
  |                                 |
  | ---- SEQUENCE                   |
  |      PUTFH(pa_file_fh)          |
  |      LAYOUTRETURN(L3_stid)      |
  |      PROXY_DONE(pa_stateid, OK)>| (terminal: PROXY_DONE
  |                                 |  carries the minted
  |                                 |  proxy_stateid, not the
  |                                 |  L3 layout stateid;
  |                                 |  commit L1 -> L2)
  | <--- NFS4_OK ------------------ |
  |                                 |
  |                                 | --- CB_LAYOUTRECALL --->
  |                                 |     (to clients holding L3;
  |                                 |      L1 was drained before
  |                                 |      PROXY_ACTIVE was
  |                                 |      entered)
  |                                 |
  |                                 | <-- LAYOUTRETURN ------
  |                                 |     (from each L3 client)
  |                                 |
  |                                 | (MDS retires source DSes;
  |                                 |  next LAYOUTGET on this
  |                                 |  file returns L2)
  v                                 v
]]></artwork>
        </figure>
      </section>
      <section anchor="message-sequence-whole-file-repair">
        <name>Message Sequence: Whole-File Repair</name>
        <t>Same shape as a move, but the assignment in PROXY_PROGRESS
carries <tt>pa_kind = PROXY_OP_REPAIR</tt> and the source layout is
degraded.  Terminal outcomes:</t>
        <ul spacing="normal">
          <li>
            <t><tt>NFS4_OK</tt> in <tt>pd_status</tt>: the proxy server reconstructed the file;
the metadata server proceeds as in <xref target="fig-seq-policy-move"/>.</t>
          </li>
          <li>
            <t><tt>NFS4ERR_PAYLOAD_LOST</tt> in <tt>pd_status</tt>: fewer than k
shards survived across the mirror set; the metadata server marks the
affected byte ranges lost and rolls back to L1.  No
CB_LAYOUTRECALL is issued because there is no valid
destination layout to issue.</t>
          </li>
        </ul>
      </section>
      <section anchor="message-sequence-metadata-server-initiated-cancellation">
        <name>Message Sequence: metadata-server-initiated Cancellation</name>
        <t>The metadata server may decide to retract an assignment.  Two cases:</t>
        <dl>
          <dt>Assignment not yet acknowledged by the proxy server:</dt>
          <dd>
            <t>The metadata server includes a <tt>PROXY_OP_CANCEL_PRIOR</tt> assignment in
the next PROXY_PROGRESS reply, naming the same
<tt>(pa_file_fh, pa_target_deviceid)</tt> pair as the prior
<tt>PROXY_OP_MOVE</tt> or <tt>PROXY_OP_REPAIR</tt> assignment.  The proxy server,
which has not yet issued <tt>OPEN(CLAIM_PROXY)</tt> for the file, simply
drops the prior assignment from its
in-flight queue.</t>
          </dd>
          <dt>Assignment acknowledged and in flight:</dt>
          <dd>
            <t>The metadata server internally aborts the migration and discards the
in-flight record; the proxy server's eventual PROXY_DONE returns
NFS4ERR_BAD_STATEID (the L3 layout stateid no longer
resolves to a record), and the proxy server abandons the work and
releases its OPEN.  The metadata server may also let the proxy server's
registration lease expire as a coarser cancellation.</t>
          </dd>
        </dl>
        <t>The proxy-server-initiated cancellation case uses the fore-channel
PROXY_CANCEL (<xref target="sec-PROXY_CANCEL"/>).</t>
        <figure anchor="fig-seq-cancel">
          <name>Message sequence for metadata-server-initiated cancellation (assignment not yet acknowledged)</name>
          <artwork><![CDATA[
  proxy server                                metadata server
  |                                 |
  |  [MOVE assignment delivered in  |
  |   prior PROXY_PROGRESS reply,   |
  |   not yet acknowledged]         |
  |                                 |
  |                                 | <-- (cancel decision)
  |                                 |
  | ---- PROXY_PROGRESS ----------> | (next heartbeat poll)
  | <--- NFS4_OK, ppr_assignments   | (CANCEL_PRIOR for the
  |       includes CANCEL_PRIOR     |  same pa_file_fh/target)
  |                                 |
  |  [PS drops the prior assignment |
  |   from its in-flight queue;     |
  |   no PROXY_DONE / PROXY_CANCEL  |
  |   is issued for this work]      |
  v                                 v
]]></artwork>
        </figure>
      </section>
    </section>
    <section anchor="sec-new-ops">
      <name>New NFSv4.2 Operations</name>
      <t>This document defines four new NFSv4.2 operations that a proxy server
issues to the metadata server on the
fore-channel of the proxy server -&gt; metadata server session defined in
<xref target="sec-design-session"/>.  PROXY_REGISTRATION (96) is issued
once at session setup and on renewal.  PROXY_PROGRESS (97) is
issued by the proxy server as a heartbeat-and-poll: the proxy server
renews its registration lease and requests new work; the metadata
server replies inline with zero or more new work assignments.
Per-migration terminal reporting is not carried on PROXY_PROGRESS.
PROXY_DONE (98) commits or rolls back an individual migration when
the proxy server finishes it; PROXY_CANCEL (99) lets the proxy server
abort early.  None of these operations is sent by pNFS clients.</t>
      <figure anchor="fig-proxy-server-opnums">
        <name>Proxy server operation numbers</name>
        <sourcecode type="xdr"><![CDATA[
/// /* New operations for the proxy server
///  * (proxy server -> metadata server)
///  */
///
/// const OP_PROXY_REGISTRATION   = 96;
/// const OP_PROXY_PROGRESS       = 97;
/// const OP_PROXY_DONE           = 98;
/// const OP_PROXY_CANCEL         = 99;
]]></sourcecode>
      </figure>
      <t>Opcodes 96 through 99 continue the control-plane range opened by
<xref target="I-D.haynes-nfsv4-flexfiles-v2"/>, which allocates 78 through 95, and
carry the proxy-server-to-metadata-server operations.  These values
<bcp14>MUST NOT</bcp14> overlap any value allocated by that document or by any other
document in the flexible file v2 layout family.</t>
      <t>This document also defines one new EXCHGID4_FLAG value used at
session establishment to identify a proxy-server session
(<xref target="sec-PROXY_REGISTRATION"/>):</t>
      <figure anchor="fig-exchgid-flag-use-proxy-server">
        <name>Proxy-server EXCHGID4 flag</name>
        <sourcecode type="xdr"><![CDATA[
/// const EXCHGID4_FLAG_USE_PROXY_SERVER = 0x00200000;
]]></sourcecode>
      </figure>
      <t>The value sits outside the existing MASK_PNFS block (0x00070000 in
<xref section="18.35.3" sectionFormat="of" target="RFC8881"/>) and adjacent to
<tt>EXCHGID4_FLAG_USE_ERASURE_DS</tt> (<tt>0x00100000</tt>,
<xref target="I-D.haynes-nfsv4-flexfiles-v2"/>), so that the erasure-data-server
bit and the proxy-server bit do not collide.  The registration is
requested in <xref target="iana-considerations"/>.</t>
      <t>The following amendment blocks extend the nfs_argop4 and
nfs_resop4 dispatch unions from <xref target="RFC7863"/> with the new ops.
A consumer that combines this document's extracted XDR with the
<xref target="RFC7863"/> XDR applies the amendments at the unions' extension
point.</t>
      <figure anchor="fig-nfs_argop4-amend">
        <name>nfs_argop4 amendment block</name>
        <sourcecode type="xdr"><![CDATA[
/// /* nfs_argop4 amendment block */
///
/// case OP_PROXY_REGISTRATION:
///     PROXY_REGISTRATION4args opproxyregistration;
/// case OP_PROXY_PROGRESS:
///     PROXY_PROGRESS4args opproxyprogress;
/// case OP_PROXY_DONE:
///     PROXY_DONE4args opproxydone;
/// case OP_PROXY_CANCEL:
///     PROXY_CANCEL4args opproxycancel;
]]></sourcecode>
      </figure>
      <figure anchor="fig-nfs_resop4-amend">
        <name>nfs_resop4 amendment block</name>
        <sourcecode type="xdr"><![CDATA[
/// /* nfs_resop4 amendment block */
///
/// case OP_PROXY_REGISTRATION:
///     PROXY_REGISTRATION4res opproxyregistration;
/// case OP_PROXY_PROGRESS:
///     PROXY_PROGRESS4res opproxyprogress;
/// case OP_PROXY_DONE:
///     PROXY_DONE4res opproxydone;
/// case OP_PROXY_CANCEL:
///     PROXY_CANCEL4res opproxycancel;
]]></sourcecode>
      </figure>
      <section anchor="sec-proxy-stateid">
        <name>proxy_stateid4: A New Stateid Type</name>
        <t>This document introduces <tt>proxy_stateid4</tt>, a new server-issued
stateid type used as the canonical handle for an in-flight
proxy migration.  The wire shape reuses the standard NFSv4
<tt>stateid4</tt> from <xref section="3.3.12" sectionFormat="of" target="RFC8881"/>; no new XDR type is added:</t>
        <figure anchor="fig-proxy_stateid4">
          <name>proxy_stateid4 wire shape</name>
          <sourcecode type="xdr"><![CDATA[
/// typedef stateid4  proxy_stateid4;
]]></sourcecode>
        </figure>
        <section anchor="value-space">
          <name>Value Space</name>
          <t>The proxy_stateid value space is disjoint from the open,
lock, layout, and delegation stateid value spaces defined in
<xref target="RFC8881"/>.  Disjointness is enforced by context, not by an in-band tag.
A <tt>proxy_stateid4</tt> appears in exactly four places: the PROXY_DONE
and PROXY_CANCEL arguments, the <tt>pa_stateid</tt> field of each
<tt>proxy_assignment4</tt> returned in a PROXY_PROGRESS reply
(<xref target="sec-PROXY_PROGRESS"/>), and the <tt>open_claim_proxy4</tt> operand of an
<tt>OPEN(CLAIM_PROXY)</tt> (<xref target="sec-claim-proxy"/>) -- where it is carried
inside the open claim, not in a stateid argument slot.  An implementation
<bcp14>MUST NOT</bcp14> use an open, lock, layout, or delegation stateid
lookup table to resolve a proxy_stateid.  Conversely, a
leaked proxy_stateid presented in the stateid argument of an
ordinary operation (e.g., READ, WRITE, SETATTR, CLOSE) <bcp14>MUST</bcp14>
be rejected with NFS4ERR_BAD_STATEID.</t>
        </section>
        <section anchor="metadata-server-minting">
          <name>Metadata Server Minting</name>
          <t>The metadata server mints a fresh proxy_stateid each time it accepts a
work assignment for delivery to a proxy server, and includes it as the
<tt>pa_stateid</tt> field of the <tt>proxy_assignment4</tt> carried in the
next PROXY_PROGRESS reply (<xref target="sec-PROXY_PROGRESS"/>).</t>
          <t>The metadata server guarantees that no two proxy_stateids in the same
(server_state, boot_seq) are equal.  An implementation <bcp14>MAY</bcp14> embed the
metadata server <tt>boot_seq</tt> in the high-order bytes of <tt>other[12]</tt> to
enable cheap NFS4ERR_STALE_STATEID detection across reboots.
<tt>other[12]</tt> is opaque on the wire, so how a metadata server structures
it is a local matter: no receiver parses it, and nothing in this
document depends on its internal layout.</t>
        </section>
        <section anchor="lifetime">
          <name>Lifetime</name>
          <t>A proxy_stateid is valid from the instant the metadata server mints it
until either:</t>
          <ul spacing="normal">
            <li>
              <t>The proxy server issues <tt>PROXY_DONE(proxy_stateid, ...)</tt> or
<tt>PROXY_CANCEL(proxy_stateid)</tt> and the metadata server acknowledges it.
On acknowledgment the proxy_stateid is retired; subsequent
references return <tt>NFS4ERR_BAD_STATEID</tt>.</t>
            </li>
            <li>
              <t>The proxy server's registration lease expires
(<xref target="sec-PROXY_REGISTRATION"/>), at which point all
proxy_stateids minted for that proxy server are abandoned.  Subsequent
references return <tt>NFS4ERR_BAD_STATEID</tt> (or
<tt>NFS4ERR_STALE_CLIENTID</tt> if the registration itself has been
purged).</t>
            </li>
            <li>
              <t>The metadata server reboots.  Subsequent references to a proxy_stateid
minted in a prior boot return <tt>NFS4ERR_STALE_STATEID</tt>.</t>
            </li>
          </ul>
        </section>
        <section anchor="renewal-semantics">
          <name>Renewal Semantics</name>
          <t>Renewal is implicit in the registration lease: any PROXY_PROGRESS
issued within the current lease renews all outstanding
proxy_stateids the metadata server has minted for this proxy server.
There is no per-assignment renewal operation, and neither the
PROXY_PROGRESS arguments nor its results carry a per-assignment
seqid bump.</t>
          <t>The <tt>seqid</tt> field of <tt>proxy_stateid4</tt> is set by the metadata server
at minting time (typically 1) and does not change over the
assignment's lifetime; the proxy server <bcp14>MUST</bcp14> echo the minted value
verbatim on PROXY_DONE and PROXY_CANCEL.  The metadata server <bcp14>MUST</bcp14>
validate exact seqid equality on those operations and <bcp14>MUST</bcp14> reject a
mismatch with <tt>NFS4ERR_OLD_STATEID</tt> (see PROXY_DONE authorization
step 6 in <xref target="sec-PROXY_DONE"/>, which PROXY_CANCEL imports).  The
seqid slot does not otherwise bump over the assignment's lifetime;
the exact-equality rule reduces to "the caller presents the
minted value unchanged" and is retained for consistency with the
general NFSv4 stateid shape in <xref section="8.2.4" sectionFormat="of" target="RFC8881"/> and for a
common failure-mode signal when a proxy server confuses one
assignment's stateid with another's.</t>
        </section>
        <section anchor="authorization">
          <name>Authorization</name>
          <t>Possession of a proxy_stateid is not sufficient to drive
PROXY_DONE or PROXY_CANCEL on the corresponding migration.
The metadata server additionally validates that the calling session's
registered-proxy server identity owns that migration (see the
"Authorization" subsection of <xref target="sec-PROXY_DONE"/> for the
full normative rule).  Without
this check, a proxy server that learned another proxy server's proxy_stateid
(through a packet capture, a leaked log, or any other channel)
could drive its PROXY_DONE / PROXY_CANCEL on a migration it
does not own.</t>
        </section>
      </section>
      <section anchor="sec-PROXY_REGISTRATION">
        <name>Operation 96: PROXY_REGISTRATION - Register as Proxy Server</name>
        <section anchor="arguments">
          <name>ARGUMENTS</name>
          <figure anchor="fig-PROXY_REGISTRATION4args">
            <name>XDR for PROXY_REGISTRATION4args</name>
            <sourcecode type="xdr"><![CDATA[
/// const PROXY_REGISTRATION_ID_NEW = 0;
/// const PROXY_MAX_ENCODINGS       = 32;
///
/// struct PROXY_REGISTRATION4args {
///     uint64_t             pra_registration_id;
///     ffv2_encoding_type4  pra_encodings<PROXY_MAX_ENCODINGS>;
///     uint32_t             pra_lease;
///     uint32_t             pra_flags;
/// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="results">
          <name>RESULTS</name>
          <figure anchor="fig-PROXY_REGISTRATION4res">
            <name>XDR for PROXY_REGISTRATION4res</name>
            <sourcecode type="xdr"><![CDATA[
/// struct PROXY_REGISTRATION4resok {
///     uint64_t           prr_registration_id;
///     uint32_t           prr_granted_lease;
/// };
///
/// union PROXY_REGISTRATION4res switch (nfsstat4 prr_status) {
///     case NFS4_OK:
///         PROXY_REGISTRATION4resok  prr_resok4;
///     default:
///         void;
/// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="description">
          <name>DESCRIPTION</name>
          <t>A proxy server calls PROXY_REGISTRATION on the
fore-channel of its session to the metadata server
(<xref target="sec-design-session"/>) to declare its capabilities.  The
metadata server records the registration and <bcp14>MAY</bcp14> select that proxy server for
subsequent <tt>PROXY_OP_MOVE</tt> or <tt>PROXY_OP_REPAIR</tt> work assignments
delivered inline in
the response to PROXY_PROGRESS.</t>
          <t>The pra_encodings field lists the ffv2_encoding_type4 values the
proxy server supports.  The proxy server <bcp14>MUST</bcp14> be able to encode, decode, and
transcode between any pair of values in this list.  Because
the transformation class of a <tt>PROXY_OP_MOVE</tt> assignment is
inherent in the (source, destination) layout pair, this
encoding-set membership is all the capability information the
metadata server needs to match.  An empty list results in NFS4ERR_INVAL
in this revision.</t>
          <t>The pra_lease field is the lease duration the proxy server requests in
seconds.  The metadata server <bcp14>MAY</bcp14> grant a shorter one, returned in
prr_granted_lease.  The proxy server <bcp14>MUST</bcp14> renew before the granted
lease expires; on expiry the metadata server drops the registration and
any in-flight migration record owned by this proxy server is abandoned
(rolled back to L1 per <xref target="sec-multi-ps-fanout"/>).</t>
          <t>The pra_flags field is reserved for future use.  In this
revision the proxy server <bcp14>MUST</bcp14> set pra_flags to 0, and a metadata server that
receives a PROXY_REGISTRATION with any bit of pra_flags set
<bcp14>MUST</bcp14> reject it with NFS4ERR_INVAL.</t>
          <t>The "reject, don't ignore" rule follows the NFSv4 extension
model in <xref target="RFC8178"/>.  <xref section="8" sectionFormat="of" target="RFC8178"/> specifies
that when a flag bit is used that is not known in the
specified minor version, NFS4ERR_INVAL is returned; <xref section="4.4.3" sectionFormat="of" target="RFC8178"/> then explains that this same error is how a requester
determines whether the responder understands the bit.  Silently
ignoring an unknown bit would break that discovery contract: a proxy
server that sets a future capability bit against a metadata server
that pre-dates the bit could not tell whether the metadata server
honored the capability or simply dropped it.</t>
          <t>A future revision of this specification (or a successor
document that updates it) <bcp14>MAY</bcp14> define new bit values in
pra_flags, following the extension rules of <xref section="4.2" sectionFormat="of" target="RFC8178"/>.  A proxy server that understands a newly defined bit <bcp14>MAY</bcp14>
set it when registering with a metadata server that supports it; on
NFS4ERR_INVAL the proxy server <bcp14>MAY</bcp14> retry with the bit cleared,
treating the response as the <xref section="4.4.3" sectionFormat="of" target="RFC8178"/> signal that
the metadata server does not recognize the bit.</t>
          <t>The pra_registration_id field carries the registration
identity the proxy server presents on this call.  On a
first-time registration the proxy server <bcp14>MUST</bcp14> set
<tt>pra_registration_id = PROXY_REGISTRATION_ID_NEW</tt> (0); the
metadata server assigns a fresh non-zero registration ID and
returns it in <tt>prr_registration_id</tt>.  On renewal (and on any
call intended to re-associate with an existing registration
across reconnect), the proxy server <bcp14>MUST</bcp14> set
<tt>pra_registration_id</tt> to the non-zero value the metadata server
previously returned in <tt>prr_registration_id</tt>; the metadata
server <bcp14>MUST</bcp14> match this against its live registration table.</t>
          <t>The metadata server distinguishes four cases:</t>
          <dl>
            <dt>Fresh registration:</dt>
            <dd>
              <t><tt>pra_registration_id = PROXY_REGISTRATION_ID_NEW</tt>.  The metadata
server <bcp14>MUST</bcp14> assign a new non-zero registration ID,
cryptographically bound (see below) to the caller's authenticated
identity, and return it in <tt>prr_registration_id</tt>.</t>
            </dd>
            <dt>Renewal:</dt>
            <dd>
              <t><tt>pra_registration_id</tt> matches a live registration under the caller's
authenticated identity.  The metadata server <bcp14>MUST</bcp14> refresh the
granted lease and return the same <tt>prr_registration_id</tt>.</t>
            </dd>
            <dt>Unknown or stale registration ID:</dt>
            <dd>
              <t><tt>pra_registration_id</tt> is non-zero but matches no live registration.
The metadata server <bcp14>MUST</bcp14> reject with <tt>NFS4ERR_STALE_CLIENTID</tt>.  This
is the outcome a reconnecting proxy server observes when the
metadata server has rebooted without persisting its registration
table (see <xref target="sec-mds-recovery"/>); the proxy server <bcp14>SHOULD</bcp14> retry
immediately with <tt>PROXY_REGISTRATION_ID_NEW</tt> (0) to obtain a fresh
registration.  The registration table is not required to survive a
metadata-server reboot: the wire mechanism does not oblige the
metadata server to persist <tt>(prr_registration_id, bound principal,
granted capabilities, lease)</tt> across its own restart, and a metadata
server that persists none of it is conformant.  In-flight migration
records tied to the stale <tt>prr_registration_id</tt> are lost per the
drop rules in <xref target="sec-lost-migration-records"/>; the fresh registration
returned by the retry has a new <tt>prr_registration_id</tt> and no prior
migration ownership.</t>
            </dd>
            <dt>Identity mismatch:</dt>
            <dd>
              <t><tt>pra_registration_id</tt> matches a live registration, but the caller's
authenticated identity differs from the identity bound to it.  The
metadata server <bcp14>MUST</bcp14> reject with <tt>NFS4ERR_PERM</tt>.  This is the
principal binding that prevents a malicious registrant from
hijacking another proxy server's slot by guessing its registration
ID.</t>
            </dd>
          </dl>
          <t>The metadata server <bcp14>MUST</bcp14> assign <tt>prr_registration_id</tt> values
that are unpredictable to any party other than the assigning
metadata server and the recipient proxy server (a random or
otherwise cryptographically unpredictable 64-bit value), so
that a passive observer cannot guess a valid ID to present.
Replay protection follows from the session's replay cache
(<xref section="2.10.6" sectionFormat="of" target="RFC8881"/>); replay of a captured
PROXY_REGISTRATION beyond the replay-cache window <bcp14>MUST</bcp14> fail
because a matched ID under a differently authenticated
principal is rejected as above.  The value 0 is reserved as
<tt>PROXY_REGISTRATION_ID_NEW</tt> and <bcp14>MUST NOT</bcp14> be assigned by the
metadata server; a registration ID of 0 in <tt>pra_registration_id</tt>
means "first registration" and never "renew".</t>
          <t>Registration conveys capabilities only; the proxy server's network
endpoint is conveyed through the same deviceinfo channel as
any other data server's address.  When the metadata server selects a proxy server for an
operation, the layout issued to clients includes a
ffv2_data_server4 entry pointing at the proxy server's existing
deviceinfo.</t>
          <t>PROXY_REGISTRATION is issued on the fore-channel of the
metadata server &lt;-&gt; proxy server session.  That session is opened by the proxy server, not by
the metadata server; it is distinct from the metadata server -&gt; data server tight-coupling
control session defined by <xref target="I-D.haynes-nfsv4-flexfiles-v2"/>
even when the same host acts as both data server and proxy server.  The proxy server <bcp14>MUST</bcp14>
present <tt>EXCHGID4_FLAG_USE_PROXY_SERVER</tt> on its EXCHANGE_ID so
that the metadata server can distinguish a proxy-server session
from both regular pNFS-client sessions and regular non-pNFS-client
sessions (<xref target="sec-new-ops"/>).  A metadata server that receives
PROXY_REGISTRATION on a session whose owning client did not
present <tt>EXCHGID4_FLAG_USE_PROXY_SERVER</tt> <bcp14>MUST</bcp14> reject it with
NFS4ERR_PERM.  The proxy server <bcp14>MUST NOT</bcp14> present
<tt>EXCHGID4_FLAG_USE_NON_PNFS</tt> on the same EXCHANGE_ID: it is a
pNFS client for the purposes of <xref section="13.1" sectionFormat="of" target="RFC8881"/> (it drives
LAYOUTGET as part of the CLAIM_PROXY pickup sequence,
<xref target="sec-claim-proxy"/>), distinguished from ordinary pNFS clients
only by its proxy-server role.</t>
          <t>Before recording the registration, the metadata server <bcp14>MUST</bcp14> authorize
the caller as a registered proxy server for this metadata server.  How that
authorization is established -- a deployment allowlist, a
per-metadata server provisioning step, integration with a directory
service, or any other mechanism -- is implementation.  The
metadata server <bcp14>MUST</bcp14> reject an unauthorized PROXY_REGISTRATION with
NFS4ERR_PERM.</t>
          <t>The authorization <bcp14>MUST</bcp14> be applied to a cryptographically
authenticated identity, per the metadata server &lt;-&gt; proxy server
transport-security requirements in <xref target="sec-credential-forwarding"/>.
AUTH_SYS is never sufficient for PROXY_REGISTRATION; the
metadata server <bcp14>MUST</bcp14> reject it.</t>
          <t>Registration conveys capabilities only; a metadata server may hold
multiple concurrent registrations from distinct authorized
identities (see <xref target="sec-multi-ps-fanout"/>), and the arrival of a new
authorized registration does not displace any prior one and does
not invalidate any client's cached filehandles.  To guard against a
misbehaving proxy server re-issuing PROXY_REGISTRATION under the
same identity while its prior registration still holds a valid
lease -- squatting on its own slot -- the metadata server <bcp14>MUST</bcp14>
refuse the duplicate: the metadata server returns NFS4ERR_DELAY and
<bcp14>SHOULD</bcp14> log the conflict.  A renewal -- distinguished by the proxy
server presenting in <tt>pra_registration_id</tt> the same non-zero
value it received in <tt>prr_registration_id</tt> on the prior
registration -- is not squatting and the metadata server <bcp14>MUST</bcp14>
accept it (refreshing the granted lease).  A call whose
<tt>pra_registration_id</tt> is <tt>PROXY_REGISTRATION_ID_NEW</tt> against an
identity that already holds a live registration is squatting
and <bcp14>MUST</bcp14> be refused.</t>
          <t>Registration revocation before lease expiry is not a dedicated
operation in this revision.  A metadata server that needs to revoke a proxy server
before its lease expires <bcp14>MUST</bcp14> cease delivering work
assignments to that proxy server in PROXY_PROGRESS replies; <bcp14>MUST</bcp14> return
NFS4ERR_STALE_CLIENTID on subsequent PROXY_PROGRESS or
PROXY_REGISTRATION-renewal from the revoked proxy server; and <bcp14>MUST</bcp14>
handle the proxy server's in-flight migration records as if the lease
had expired (see the lease-expiry paragraph above): the
records are abandoned and the affected layouts revert to the
pre-migration state.  The revoked proxy server, on its next
PROXY_PROGRESS, sees NFS4ERR_STALE_CLIENTID and may either
re-register (if the deployment policy allows) or shut down.</t>
        </section>
      </section>
      <section anchor="sec-PROXY_PROGRESS">
        <name>Operation 97: PROXY_PROGRESS - Heartbeat and Receive Work Assignments</name>
        <section anchor="arguments-1">
          <name>ARGUMENTS</name>
          <figure anchor="fig-PROXY_PROGRESS4args">
            <name>XDR for PROXY_PROGRESS4args</name>
            <sourcecode type="xdr"><![CDATA[
/// struct PROXY_PROGRESS4args {
///     uint32_t  ppa_flags;
/// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="results-1">
          <name>RESULTS</name>
          <figure anchor="fig-PROXY_PROGRESS4res">
            <name>XDR for PROXY_PROGRESS4res</name>
            <sourcecode type="xdr"><![CDATA[
/// enum proxy_op_kind4 {
///     PROXY_OP_MOVE         = 0,
///     PROXY_OP_REPAIR       = 1,
///     PROXY_OP_CANCEL_PRIOR = 2
/// };
///
/// const PROXY_MAX_DESCRIPTOR_BYTES   = 4096;
/// const PROXY_MAX_ASSIGNMENTS_PER_OP = 64;
///
/// struct proxy_assignment4 {
///     proxy_op_kind4    pa_kind;
///     proxy_stateid4    pa_stateid;
///     nfs_fh4           pa_file_fh;
///     deviceid4         pa_source_deviceid;
///     deviceid4         pa_target_deviceid;
///     opaque            pa_descriptor<PROXY_MAX_DESCRIPTOR_BYTES>;
/// };
///
/// struct PROXY_PROGRESS4resok {
///     uint32_t           ppr_lease_remaining_sec;
///     proxy_assignment4
///         ppr_assignments<PROXY_MAX_ASSIGNMENTS_PER_OP>;
/// };
///
/// union PROXY_PROGRESS4res switch (nfsstat4 ppr_status) {
/// case NFS4_OK:
///     PROXY_PROGRESS4resok ppr_resok4;
/// default:
///     void;
/// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="description-1">
          <name>DESCRIPTION</name>
          <t>A registered proxy server calls PROXY_PROGRESS on the
fore-channel of its session to the metadata server for two purposes:</t>
          <ol spacing="normal" type="1"><li>
              <t>Heartbeat: extend the proxy server's registration lease.  The metadata server
responds with <tt>ppr_lease_remaining_sec</tt> so the proxy server can size
its next poll interval.</t>
            </li>
            <li>
              <t>Receive work assignments: pick up zero or more units of
work the metadata server has queued for this proxy server.  Each assignment is a
<tt>proxy_assignment4</tt> describing one migration or repair the
metadata server wants this proxy server to drive.</t>
            </li>
          </ol>
          <t>Per <xref section="4.4.3" sectionFormat="of" target="RFC8178"/>, <tt>ppa_flags</tt> is a reserved-for-future-use
flag word; the metadata server <bcp14>MUST</bcp14> reject any non-zero bit with
<tt>NFS4ERR_INVAL</tt>.  The slot allows future revisions to add
proxy-server-side appetite signaling (e.g., "do not give me more
assignments right now") without an XDR break.</t>
          <t>The metadata server returns work assignments inline in
<tt>ppr_assignments&lt;PROXY_MAX_ASSIGNMENTS_PER_OP&gt;</tt>.  A single
PROXY_PROGRESS reply <bcp14>MUST NOT</bcp14> carry more than
<tt>PROXY_MAX_ASSIGNMENTS_PER_OP</tt> (64) assignments.  The
metadata server <bcp14>MUST</bcp14> additionally verify, before constructing
the reply, that the encoded PROXY_PROGRESS4resok fits within
the session's negotiated <tt>ca_maxresponsesize</tt> (<xref section="18.36" sectionFormat="of" target="RFC8881"/>); if the next assignment on its queue would overflow the
response, the metadata server <bcp14>MUST</bcp14> short-return (omit that assignment
and any that follow it from this reply) and <bcp14>MUST</bcp14> include the omitted
assignments in a subsequent PROXY_PROGRESS reply.  Short-return is not
itself an error; the delivery rules above ensure the omitted
assignments are re-offered on the next call.  A proxy server that does
not want new work simply ignores the assignments past its in-flight
cap; the metadata server does not retract assignments once
acknowledged (see below), other than via an explicit
<tt>PROXY_OP_CANCEL_PRIOR</tt> assignment in a later PROXY_PROGRESS reply.
Each assignment names the work type (<tt>pa_kind</tt>, described below), a
single file (<tt>pa_file_fh</tt>), the source and target data servers the
migration moves data between (<tt>pa_source_deviceid</tt> /
<tt>pa_target_deviceid</tt>), and an opaque descriptor
(<tt>pa_descriptor&lt;PROXY_MAX_DESCRIPTOR_BYTES&gt;</tt>, bounded at 4096 bytes)
reserved for future extensions (for example, a precomputed
source-layout descriptor so the proxy server can contact the source
data servers without a second LAYOUTGET).  The <tt>pa_stateid</tt>
field carries the <tt>proxy_stateid4</tt> (<xref target="sec-proxy-stateid"/>) the
metadata server has minted for this migration; the proxy server
presents it in the <tt>OPEN(CLAIM_PROXY)</tt> that binds it to the file
(<xref target="sec-claim-proxy"/>) and references it as the handle in the eventual
PROXY_DONE / PROXY_CANCEL.</t>
          <t>The <tt>pa_kind</tt> discriminates the work type:</t>
          <dl>
            <dt><tt>PROXY_OP_MOVE</tt>:</dt>
            <dd>
              <t>drain or migrate the file's data between the named data servers.
<tt>pa_stateid</tt> is the proxy_stateid the proxy server will reference
in PROXY_DONE / PROXY_CANCEL.</t>
            </dd>
            <dt><tt>PROXY_OP_REPAIR</tt>:</dt>
            <dd>
              <t>reconstruct a missing or corrupt mirror on
<tt>pa_target_deviceid</tt> from the surviving mirrors.
<tt>pa_stateid</tt> is the proxy_stateid the proxy server will reference
in PROXY_DONE / PROXY_CANCEL.</t>
            </dd>
            <dt><tt>PROXY_OP_CANCEL_PRIOR</tt>:</dt>
            <dd>
              <t>the metadata server rescinds an assignment it delivered in a prior
PROXY_PROGRESS reply, before the proxy server acknowledged it via
<tt>OPEN(CLAIM_PROXY)</tt> (see the delivery-and-acknowledgment
paragraph below).  <tt>pa_stateid</tt> is the proxy_stateid of the
assignment being rescinded; the proxy server <bcp14>MUST</bcp14> drop any
in-progress work tagged with this proxy_stateid and <bcp14>MUST
NOT</bcp14> issue PROXY_DONE / PROXY_CANCEL for it (the metadata server has
already cleaned up the in-flight migration record on its
side and retired the proxy_stateid).</t>
            </dd>
          </dl>
          <t>For each <tt>PROXY_OP_MOVE</tt> or <tt>PROXY_OP_REPAIR</tt> assignment, the
proxy
server begins by issuing a normal NFSv4 OPEN+LAYOUTGET against
<tt>pa_file_fh</tt> (the L3 composite layout), performs the data movement
<tt>pa_kind</tt> calls for, and reports terminal status via
PROXY_DONE(pa_stateid, ...) (<xref target="sec-PROXY_DONE"/>) or
PROXY_CANCEL(pa_stateid) (<xref target="sec-PROXY_CANCEL"/>).</t>
          <t>Delivery of a <tt>PROXY_OP_MOVE</tt> or <tt>PROXY_OP_REPAIR</tt> assignment is
at-least-once.  There is no explicit acknowledgment: the proxy
server's <tt>OPEN(CLAIM_PROXY)</tt> on the assignment's <tt>pa_file_fh</tt> serves
as one.</t>
          <t>After minting a <tt>proxy_stateid</tt> for an assignment, the metadata server
<bcp14>MUST</bcp14> repeat that <tt>proxy_assignment4</tt>, unchanged in every field, in
every subsequent PROXY_PROGRESS reply to the assigned proxy server.
Re-delivery stops when any of the following occurs:</t>
          <ul spacing="normal">
            <li>
              <t>The proxy server presents that <tt>proxy_stateid</tt> in an
<tt>OPEN(CLAIM_PROXY)</tt> against <tt>pa_file_fh</tt>.  The metadata server <bcp14>MUST</bcp14>
then cease re-delivery and treat the assignment as acknowledged
(ASSIGNED to PROXY_ACTIVE, <xref target="sec-state-machine"/>).</t>
            </li>
            <li>
              <t>The metadata server rescinds the assignment via
<tt>PROXY_OP_CANCEL_PRIOR</tt>.</t>
            </li>
            <li>
              <t>The proxy server's registration lease expires, dropping the
migration record (<xref target="sec-lost-migration-records"/>).</t>
            </li>
          </ul>
          <t>Repetition is harmless because both halves are idempotent: every
re-delivery carries the same <tt>proxy_stateid</tt>, and <tt>OPEN(CLAIM_PROXY)</tt>
is idempotent by <tt>(pa_file_fh, proxy_stateid)</tt>.  A lost
PROXY_PROGRESS reply, a PROXY_PROGRESS in flight while the metadata
server re-delivers, and a proxy server that has already picked the
assignment up therefore produce neither duplicate work nor spurious
state; the proxy server ignores any re-delivery of a <tt>proxy_stateid</tt>
it has already opened.</t>
          <t><tt>pa_file_fh</tt> is an <tt>nfs_fh4</tt> minted by the metadata server and presented to
the proxy server for use against the same metadata server.  Per
<xref section="4.2.3" sectionFormat="of" target="RFC8881"/>, NFSv4 filehandles are server-private
opaque tokens; the receiving server treats the byte string as opaque,
validates it only by attempting the lookup, and returns NFS4ERR_STALE
or NFS4ERR_BADHANDLE if the bytes do not resolve.  The proxy server
<bcp14>MUST NOT</bcp14> inspect, mutate, or shape-check <tt>pa_file_fh</tt>; it forwards the
filehandle verbatim in PUTFH on the same metadata server that issued
it, and the existing PUTFH semantics apply unchanged.</t>
          <t>The <tt>ppr_lease_remaining_sec</tt> field is the metadata server's
acknowledgment of this PROXY_PROGRESS as a registration lease
renewal.  It is the number of seconds remaining until the proxy
server's registration would expire absent further
PROXY_PROGRESS.  It is an UPPER bound on the safe next-poll
interval, not a lower bound: the proxy server <bcp14>MUST</bcp14> issue its
next PROXY_PROGRESS strictly before this many seconds have
elapsed, minus a safety margin for network round-trip time and
local clock skew.  A proxy server that lets its next poll
slip past <tt>ppr_lease_remaining_sec</tt> will find its registration
already expired; the metadata server will have discarded its
in-flight migration records, and every subsequent PROXY_PROGRESS
or PROXY_DONE / PROXY_CANCEL will fail with
<tt>NFS4ERR_STALE_CLIENTID</tt> (see the lease-expiry paragraph in
<xref target="sec-PROXY_REGISTRATION"/>).</t>
          <t>Polling cadence: the proxy server <bcp14>SHOULD</bcp14> poll at
<tt>ppr_lease_remaining_sec / 2</tt> in steady state to leave one
whole renewal interval of headroom.  Adaptive backoff on
consecutive empty replies is permitted only within the safe
budget: the proxy server <bcp14>MAY</bcp14> extend its polling interval up to
a bound <tt>B &lt; ppr_lease_remaining_sec - S</tt> where <tt>S</tt> is the
safety margin above, and <bcp14>MUST</bcp14> reset the cadence on any
non-empty reply.  Under no adaptive backoff rule may a next
poll be scheduled at or after <tt>ppr_lease_remaining_sec</tt> from
the current reply.  The metadata server <bcp14>MAY</bcp14> shrink the
effective cadence by returning a smaller
<tt>ppr_lease_remaining_sec</tt> on subsequent replies, driving a
busy proxy server to poll more often.  A metadata server that
returns <tt>ppr_lease_remaining_sec = 0</tt> signals immediate
expiry; the proxy server <bcp14>MUST</bcp14> re-register before issuing any
further work-bearing operation.</t>
          <t>The metadata-server-initiated cancellation case (the metadata server abandons an
in-flight assignment before the proxy server has driven it to terminal
state) is signaled via the <tt>PROXY_OP_CANCEL_PRIOR</tt> assignment
kind described above.  There is no separate cancel callback;
the proxy-server-initiated cancel is handled by the fore-channel
PROXY_CANCEL (<xref target="sec-PROXY_CANCEL"/>).</t>
        </section>
      </section>
    </section>
    <section anchor="sec-new-fore-channel">
      <name>New Fore-Channel Operations: PROXY_DONE and PROXY_CANCEL</name>
      <t>The proxy-server-to-metadata-server protocol uses two new fore-channel operations
in addition to the extended PROXY_PROGRESS:</t>
      <dl>
        <dt><tt>PROXY_DONE</tt> (op 98):</dt>
        <dd>
          <t>proxy server reports terminal success or failure on a specific
in-flight migration.  The metadata server uses the pd_status to
atomically commit (success: swap the file's active layout
from L1 to L2) or roll back (failure: keep L1, drop
L2/G).</t>
        </dd>
        <dt><tt>PROXY_CANCEL</tt> (op 99):</dt>
        <dd>
          <t>proxy server aborts a work item it was assigned but cannot complete
(e.g., source data server becomes unreachable, proxy server resource
exhaustion).  The metadata server treats this as PROXY_DONE with a
fail-equivalent status: rolls back to L1, drops L2/G,
frees the assignment for re-assignment by a later
PROXY_PROGRESS poll.</t>
        </dd>
      </dl>
      <t>Both operations identify the affected migration by its
<tt>proxy_stateid</tt> (see <xref target="sec-proxy-stateid"/>), which the metadata
server minted at assignment time and delivered in the
<tt>ppr_assignments</tt> result of PROXY_PROGRESS.  The metadata server keys
its in-flight migration record on the <tt>proxy_stateid</tt>; the record is
authorized to the proxy server by the <tt>prr_registration_id</tt> returned
at PROXY_REGISTRATION (see PROXY_DONE authorization,
<xref target="sec-PROXY_DONE"/>), not by the per-EXCHANGE_ID <tt>clientid4</tt>.  The
proxy server does present the <tt>proxy_stateid</tt> to OPEN(CLAIM_PROXY)
and to the LAYOUTGET that follows (see <xref target="sec-claim-proxy"/>), but the
migration record itself is keyed on the <tt>proxy_stateid</tt>, not on the
layout stateid subsequently returned by LAYOUTGET.</t>
      <section anchor="sec-PROXY_DONE">
        <name>Operation 98: PROXY_DONE - Commit or Roll Back a Proxy Operation</name>
        <section anchor="arguments-2">
          <name>ARGUMENTS</name>
          <figure anchor="fig-PROXY_DONE-args">
            <name>PROXY_DONE arguments</name>
            <sourcecode type="xdr"><![CDATA[
/// struct PROXY_DONE4args {
///     proxy_stateid4  pd_stateid;
///     nfsstat4        pd_status;
/// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="results-2">
          <name>RESULTS</name>
          <figure anchor="fig-PROXY_DONE-res">
            <name>PROXY_DONE results</name>
            <sourcecode type="xdr"><![CDATA[
/// struct PROXY_DONE4res {
///     nfsstat4    pdr_status;
/// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="description-2">
          <name>DESCRIPTION</name>
          <t>PROXY_DONE signals the terminal outcome of a migration the proxy server
was assigned via PROXY_PROGRESS.  <tt>pd_stateid</tt> is the
proxy_stateid the metadata server minted when it delivered the
corresponding <tt>proxy_assignment4</tt>
(<xref target="sec-proxy-stateid"/>).  A <tt>pd_status</tt> of <tt>NFS4_OK</tt> directs the
metadata server to commit the migration (swap the file's active layout
from the pre-migration shape L1 to the post-migration shape
L2); any other value directs the metadata server to roll back (keep L1,
discard L2 and the proxy-server-only composite L3).</t>
          <t>The proxy server compounds PROXY_DONE after the data-movement phase
completes (or fails):</t>
          <t><tt>
SEQUENCE PUTFH(pa_file_fh) LAYOUTRETURN(L3_stateid) PROXY_DONE(pd_stateid, status)
</tt></t>
          <t>LAYOUTRETURN runs FIRST per <xref section="18.51" sectionFormat="of" target="RFC8881"/>, releasing the
proxy server's reference to the L3 layout cleanly via the standard
mechanism.  PROXY_DONE then operates on the in-flight
migration record keyed by the proxy_stateid; the
record is the single source of truth for migration state, so
PROXY_DONE remains valid even though L3 has just been
returned.  The proxy server <bcp14>MAY</bcp14> issue PROXY_DONE in a subsequent
compound, but the single-compound shape is <bcp14>RECOMMENDED</bcp14> to
keep the recovery window short.</t>
          <section anchor="authorization-1">
            <name>Authorization</name>
            <t>The metadata server <bcp14>MUST</bcp14> validate, in this priority order, returning the
first failure encountered:</t>
            <ol spacing="normal" type="1"><li>
                <t>The calling session belongs to a registered proxy server.
Otherwise: <tt>NFS4ERR_PERM</tt>.</t>
              </li>
              <li>
                <t><tt>pd_stateid.other</tt> was minted in the current
(server_state, boot_seq) tuple.  A proxy_stateid minted in
a prior boot returns <tt>NFS4ERR_STALE_STATEID</tt>.</t>
              </li>
              <li>
                <t><tt>pd_stateid.other</tt> identifies a proxy operation currently
in flight at the metadata server.  Otherwise: <tt>NFS4ERR_BAD_STATEID</tt>.</t>
              </li>
              <li>
                <t>The proxy operation identified by <tt>pd_stateid</tt> is owned by
the calling session's registered-proxy server identity.  The
identity captured at PROXY_REGISTRATION time -- the
<tt>prr_registration_id</tt> (a non-zero 64-bit value), plus the
matched GSS principal / mTLS fingerprint that identity was
bound to at registration -- is the authorization principal,
not the per-EXCHANGE_ID <tt>clientid4</tt>.  This makes PROXY_DONE
/ PROXY_CANCEL tolerant of proxy server reconnect: a proxy
server that drops its session and reconnects with a fresh
EXCHANGE_ID but the same <tt>prr_registration_id</tt> retains
authority over its in-flight migrations, provided the
metadata server still holds that registration (see
<xref target="sec-ps-recovery"/> step 2 for the metadata-server-restart
case).  Mismatch returns <tt>NFS4ERR_PERM</tt>.</t>
              </li>
              <li>
                <t>The current filehandle (set by the preceding PUTFH) is the
<tt>pa_file_fh</tt> of the proxy operation identified by
<tt>pd_stateid</tt>.  Otherwise: <tt>NFS4ERR_BAD_STATEID</tt>.</t>
              </li>
              <li>
                <t><tt>pd_stateid.seqid</tt> matches the seqid the metadata server
minted at assignment time for this proxy_stateid (see
<xref target="sec-proxy-stateid"/> Renewal Semantics: the seqid does not
bump over the assignment's lifetime in this revision).
Otherwise: <tt>NFS4ERR_OLD_STATEID</tt>.</t>
              </li>
            </ol>
            <t>If all validations succeed, the metadata server atomically:</t>
            <ul spacing="normal">
              <li>
                <t>For a <tt>pd_status</tt> of <tt>NFS4_OK</tt>: commits the migration --
promotes L2 to be the file's layout (D dropped, G promoted),
and enters the L3 drain phase.  Client-held L1 layouts were
already recalled and returned before the migration entered
the active phase (a precondition of L3 issuance, see
<xref target="sec-multi-ps-fanout"/>); during migration, clients hold L3.
The metadata server therefore <bcp14>MUST</bcp14> issue CB_LAYOUTRECALL on
L3 to every client that received it, <bcp14>MUST</bcp14> retain enough L3
bookkeeping to accept the resulting client LAYOUTRETURN
fan-out, and <bcp14>MUST</bcp14> defer both the final retirement of the L3
bookkeeping and the final removal of the decommissioned
mirror D until every L3 holder has returned its layout.
New reads and writes issued after PROXY_DONE commit are
served against L2 (the new active layout); L3 is drained,
not left in force.  See <xref target="sec-atomic-commit"/> for the full
mechanics.</t>
              </li>
              <li>
                <t>For any other <tt>pd_status</tt>: reverts the migration --
restores L1 as the file's active layout; L2 and L3 are
discarded.  Client-held L3 layouts (issued during
migration) <bcp14>MUST</bcp14> be recalled and drained before L3
bookkeeping is retired -- clients received L3 during the
active phase and <bcp14>MUST</bcp14> be given the opportunity to complete
or abort the associated I/O through the abort sequence
defined in <xref target="sec-abort-sequence"/>.  Once L3 is drained,
external clients transparently see the pre-migration L1;
no CB_LAYOUTRECALL of L1 is needed because L1 was recalled
before entering the active phase and is being reissued
fresh on next LAYOUTGET.  The proxy server owns cleanup of
any half-written data it placed on the target G.</t>
              </li>
            </ul>
            <t>In both cases the metadata server retires the proxy operation; <tt>pd_stateid</tt>
is thereafter invalid.</t>
            <t>Atomicity is critical: external client traffic must transition
cleanly across this op; either the per-instance deltas commit
fully or they do not commit at all.</t>
          </section>
        </section>
      </section>
      <section anchor="sec-PROXY_CANCEL">
        <name>Operation 99: PROXY_CANCEL - Abort a Proxy Operation</name>
        <section anchor="arguments-3">
          <name>ARGUMENTS</name>
          <figure anchor="fig-PROXY_CANCEL-args">
            <name>PROXY_CANCEL arguments</name>
            <sourcecode type="xdr"><![CDATA[
/// struct PROXY_CANCEL4args {
///     proxy_stateid4  pc_stateid;
/// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="results-3">
          <name>RESULTS</name>
          <figure anchor="fig-PROXY_CANCEL-res">
            <name>PROXY_CANCEL results</name>
            <sourcecode type="xdr"><![CDATA[
/// struct PROXY_CANCEL4res {
///     nfsstat4    pcr_status;
/// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="description-3">
          <name>DESCRIPTION</name>
          <t>PROXY_CANCEL discards an assigned-but-unfinished migration.
The proxy server uses it when it knows it cannot complete the
assignment (the proxy server is being shut down gracefully, the source
data server is unreachable, the destination data server rejected the writes,
etc.) and wants to release the work item back to the metadata server
without computing a specific failure status.</t>
          <t><tt>pc_stateid</tt> is the proxy_stateid the metadata server minted when it
delivered the corresponding <tt>proxy_assignment4</tt>.</t>
          <t>Compound shape:</t>
          <t><tt>
SEQUENCE PUTFH(pa_file_fh) LAYOUTRETURN(L3_stateid) PROXY_CANCEL(pc_stateid)
</tt></t>
          <t>LAYOUTRETURN runs first (standard <xref section="18.51" sectionFormat="of" target="RFC8881"/> release
of the L3 layout); PROXY_CANCEL then operates on the
in-flight migration record only.</t>
          <section anchor="authorization-2">
            <name>Authorization</name>
            <t>The same priority-ordered validation as PROXY_DONE
(<xref target="sec-PROXY_DONE"/>) applies, with <tt>pc_stateid</tt> substituted
for <tt>pd_stateid</tt>.  In particular, the registered-proxy server identity
that owns the proxy operation identified by <tt>pc_stateid</tt> <bcp14>MUST</bcp14>
match the caller's, or the metadata server returns <tt>NFS4ERR_PERM</tt>; a proxy server
cannot cancel another proxy server's migration.</t>
          </section>
          <section anchor="sec-abort-sequence">
            <name>Side effects and the abort sequence</name>
            <t>PROXY_CANCEL, PROXY_DONE with a failing <tt>pd_status</tt>, and
implicit teardown from registration expiry all revert the
migration.  Reverting from any of these paths, if it discards
L3 without fencing delayed I/O, can leave acknowledged writes
in the abandoned G or acknowledged writes from a delayed L3
holder landing after the revert; both produce
acknowledged-but-unreachable or divergent data.  All three
paths <bcp14>MUST</bcp14> therefore apply the same abort sequence before the
metadata server discards L2/L3 and before L1 is reissued to
subsequent LAYOUTGETs:</t>
            <ol spacing="normal" type="1"><li>
                <t>Stop new L3 issuance.  The metadata server <bcp14>MUST</bcp14>
refuse any further LAYOUTGET that would return L3 for
this file; subsequent client LAYOUTGETs receive L1 (or
NFS4ERR_LAYOUTUNAVAILABLE if L1 recall is still in
flight).</t>
              </li>
              <li>
                <t>Recall or revoke client-held L3.  For every client to
which L3 was issued, the metadata server <bcp14>MUST</bcp14> issue
CB_LAYOUTRECALL(L3) and <bcp14>MUST</bcp14> retain L3 bookkeeping until
the resulting LAYOUTRETURNs arrive.  If a client fails
to return within the layout-recall grace period, the
metadata server <bcp14>MUST</bcp14> revoke the client's L3 layout
stateid via the ordinary NFSv4.1 layout revocation
mechanism (<xref section="12.5.5" sectionFormat="of" target="RFC8881"/>).</t>
              </li>
              <li>
                <t>Fence the proxy server's backend stateids.  In every
coupling mode, the metadata server <bcp14>MUST</bcp14> fence any
stateid the proxy server was using against the source or
target data servers, so that a delayed write from the
(now-terminated) proxy operation cannot land after the
revert.  In trusted-stateid tight coupling
(<xref target="I-D.haynes-nfsv4-flexfiles-v2"/>, sec-TRUST_STATEID)
the metadata server <bcp14>MUST</bcp14> issue REVOKE_STATEID (or the
bulk equivalent) against every data server that carried
the proxy server's stateid.  In loose coupling the
metadata server <bcp14>MUST</bcp14> revoke the proxy server's own
NFSv4.1 stateids at the source and target data servers
via the data-server-native mechanism.</t>
              </li>
              <li>
                <t>Drain in-flight I/O.  After steps 1-3, the metadata
server <bcp14>MUST</bcp14> wait for any in-flight compound the proxy
server has already issued against a fenced data server
to fail (either at the data server, which rejects with
NFS4ERR_STALE_STATEID / NFS4ERR_ADMIN_REVOKED, or by
transport timeout).  The metadata server <bcp14>MAY</bcp14> use its
session's own back-channel state to accelerate this
drain, but <bcp14>MUST NOT</bcp14> declare the abort complete before
the data servers have had at least one lease period to
observe the fence.</t>
              </li>
              <li>
                <t>Retire L2/L3 bookkeeping.  Only after steps 1-4 have
each completed <bcp14>MAY</bcp14> the metadata server discard the L2
and L3 layouts, drop G (or leave it for administrative
cleanup), retire the proxy operation, invalidate the
proxy stateid (<tt>pc_stateid</tt> for PROXY_CANCEL,
<tt>pd_stateid</tt> for a failing PROXY_DONE), and update
operator-facing telemetry.  L1 <bcp14>MAY</bcp14> then be reissued to
ordinary LAYOUTGET traffic.</t>
              </li>
            </ol>
            <t>The abort sequence applies verbatim to registration expiry:
when the metadata server abandons an in-flight migration
because the owning proxy server's registration lease has
expired (<xref target="sec-PROXY_REGISTRATION"/>), it <bcp14>MUST</bcp14> run the
five-step sequence before dropping the migration record.</t>
            <t>The distinction between PROXY_DONE(FAIL) and PROXY_CANCEL is
purely intent / accounting: PROXY_DONE(FAIL) records that the
proxy server attempted the migration and ran into a recoverable error;
PROXY_CANCEL records that the proxy server abandoned the assignment
without attempting it (or while attempting, decided not to
report a specific failure cause).  A metadata server implementation <bcp14>MAY</bcp14>
surface the distinction in operator telemetry but <bcp14>MUST NOT</bcp14>
make any behavioral distinction on the wire.  In particular,
the abort sequence above is identical for both.</t>
          </section>
        </section>
      </section>
    </section>
    <section anchor="sec-multi-ps-fanout">
      <name>Multi-Proxy Server Assignment Fan-out</name>
      <t>When multiple proxy servers are registered against the same metadata server, the
metadata server coordinates assignment fan-out under one hard invariant:
at any time, at most one migration <bcp14>MUST</bcp14> be in flight for a
given <tt>(pa_file_fh, pa_target_deviceid)</tt> pair.  The metadata server <bcp14>MUST NOT</bcp14>
assign a migration whose <tt>(pa_file_fh, pa_target_deviceid)</tt> matches
that of an in-flight migration.</t>
      <t>How the metadata server chooses among eligible proxy servers -- by load, locality,
fault domain, capability match, or any combination -- is an
implementation matter.  The protocol constrains only the
outcome: the proxy server that receives the assignment is registered at
delivery time, and the <tt>(pa_file_fh, pa_target_deviceid)</tt> invariant
holds.</t>
      <section anchor="sec-in-flight-cap">
        <name>Per-Proxy-Server In-Flight Cap</name>
        <t>The number of concurrently in-flight assignments a proxy server
will accept -- its in-flight cap -- is an
implementation-side self-imposed limit and is not negotiated on
the wire in this revision.  The metadata server <bcp14>SHOULD NOT</bcp14>
attempt to discover it and <bcp14>SHOULD NOT</bcp14> queue more assignments to
a single proxy server than that proxy server can plausibly
carry; concretely, once a metadata server has queued enough
assignments to a given proxy server to fill any reasonable
in-flight budget, it <bcp14>SHOULD</bcp14> prefer other eligible proxy servers
before continuing to queue against the same one.  A proxy server
that receives more assignments than it wishes to work on <bcp14>SHOULD</bcp14>
silently ignore the excess (per <xref target="sec-PROXY_PROGRESS"/>): the
assignments will be re-delivered on subsequent PROXY_PROGRESS
replies (see the delivery-and-acknowledgment paragraph in
<xref target="sec-PROXY_PROGRESS"/>) and the metadata server <bcp14>MAY</bcp14> reassign
them to another eligible proxy server if the original does not
acknowledge within a policy-defined window.</t>
        <t>Interaction with the ASSIGNED state: a file in ASSIGNED
continues to be served against its pre-migration layout
(L1) until the metadata server observes the assigned proxy
server's <tt>OPEN(CLAIM_PROXY)</tt> for that file's <tt>pa_file_fh</tt>.
LAYOUTGET on a file in ASSIGNED <bcp14>MUST</bcp14> return the pre-migration
L1 layout (or <bcp14>MUST</bcp14> return <tt>NFS4ERR_DELAY</tt> only if the
metadata server has already begun issuing L3 in anticipation
of an imminent proxy-server pickup; the DELAY window <bcp14>MUST
NOT</bcp14> persist across delivery attempts).  This is
"at-least-once delivery, no acceptance implied": the
metadata server <bcp14>MUST NOT</bcp14> block client I/O for the duration
of an unacknowledged assignment.</t>
        <t>To bound how long an assigned-but-unacknowledged migration
lingers, the metadata server <bcp14>MUST</bcp14> enforce a bounded
delivery count and a bounded delivery deadline:</t>
        <ul spacing="normal">
          <li>
            <t>The metadata server <bcp14>MUST</bcp14> include the same
<tt>proxy_assignment4</tt> in at most a policy-defined maximum
<tt>A_MAX</tt> consecutive PROXY_PROGRESS replies without
observing the acknowledging <tt>OPEN(CLAIM_PROXY)</tt>.  A
<bcp14>RECOMMENDED</bcp14> default is <tt>A_MAX = 3</tt>.</t>
          </li>
          <li>
            <t>If the metadata server has issued <tt>A_MAX</tt> copies of an
assignment without acknowledgment, or a policy-defined
delivery-deadline interval <tt>T_DELIVERY</tt> has elapsed
since the first delivery, whichever occurs first, the
metadata server <bcp14>MUST</bcp14> rescind the assignment via
<tt>PROXY_OP_CANCEL_PRIOR</tt> in the next PROXY_PROGRESS
reply.  It <bcp14>MAY</bcp14> then reassign the same
<tt>(pa_file_fh, kind)</tt> to a different eligible proxy
server, restarting the delivery counter, or return the
file to READY.</t>
          </li>
          <li>
            <t>If a proxy server declines to accept new assignments
because its local queue is full, it <bcp14>SHOULD</bcp14> simply not
send PROXY_PROGRESS until it has capacity, relying on
the metadata server's rescission-and-reassignment path
above.</t>
          </li>
        </ul>
        <t>When a registered proxy server loses its session -- its lease
expires, its underlying transport is torn down, or its registration
is otherwise dropped -- the metadata server <bcp14>MUST</bcp14> treat each
migration the proxy server had in flight as if
PROXY_DONE(FAIL) had been issued: L1 stays in force, L2 and
L3 are discarded.  The metadata server <bcp14>MAY</bcp14> then reassign the work to
another eligible proxy server; the <tt>(pa_file_fh, pa_target_deviceid)</tt>
invariant continues to hold across reassignment.</t>
        <t>A proxy server that reconnects with the same <tt>prr_registration_id</tt>
retains ownership of its in-flight migrations regardless of whether
its EXCHANGE_ID returns the prior <tt>clientid</tt> or a fresh one; no
reassignment is needed.  The proxy server reclaims its per-file
layouts via the metadata-server-recovery path in
<xref target="sec-mds-recovery"/>, presenting each migration's <tt>proxy_stateid</tt> to
OPEN(CLAIM_PROXY).  The prior <tt>prr_registration_id</tt> is available for
re-presentation only while the metadata server holds it in the
registration table; a metadata-server restart that discards the
table forces the proxy server onto the fresh-registration retry path
in <xref target="sec-ps-recovery"/> step 2, at which point migration ownership
resets.</t>
        <t>A host that does not implement the proxy server role simply
does not call PROXY_REGISTRATION and is never selected for
a <tt>PROXY_OP_MOVE</tt> or <tt>PROXY_OP_REPAIR</tt> assignment.  A deployment with no
registered proxy server falls back to per-chunk CB_CHUNK_REPAIR for
single-shard repair, to admin-coordinated offline procedures
for policy transitions and data server evacuation, and to blocking data server
maintenance -- the data server cannot drain through a proxy server, so it must
remain reachable to clients throughout its service life.</t>
        <t>Deployments <bcp14>SHOULD</bcp14> ensure at least one registered proxy server exists
per failure domain to avoid a single point of failure on
move operations.</t>
      </section>
    </section>
    <section anchor="sec-layout-shape">
      <name>Layout Shape During a Proxy Operation</name>
      <t>While a proxy operation is active, a client sees only one part of
the mechanism: the layout the metadata server hands it.  Everything
else in this document -- the session, the ops, the
credential-forwarding rules -- is between the metadata server and
the proxy server.  The layout shape is therefore what a client
implementer needs to read to know how its code interacts with
a proxied file.</t>
      <t>On a LAYOUTGET, the metadata server chooses one of three outcomes:</t>
      <ul spacing="normal">
        <li>
          <t>A direct-data server layout, when no proxy operation is in flight
for the file and the client's coding-type support set
includes the file's coding.  This is the unchanged flexible file v2 layout
path.</t>
        </li>
        <li>
          <t>A single-data server layout naming the proxy server, when a <tt>PROXY_OP_MOVE</tt> or
<tt>PROXY_OP_REPAIR</tt> migration is in flight for the file, or when the client's
coding-type support set does not include the file's coding
and a registered proxy server can translate.  The layout's
single <tt>ffv2_data_server4</tt> entry has <tt>FFV2_DS_FLAGS_PROXY</tt> set
on its <tt>ffs_ds_flags</tt> (see
<xref target="I-D.haynes-nfsv4-flexfiles-v2"/>), marking the entry as a
proxy server rather than a direct data server.  The client
uses this layout as it would any flexible file v2 layout, sending CHUNK
ops to the named data server; the proxy server internally
dispatches reads and writes to the source and destination data
servers.</t>
        </li>
        <li>
          <t><tt>NFS4ERR_CODING_NOT_SUPPORTED</tt> (see
<xref target="I-D.haynes-nfsv4-flexfiles-v2"/>), when the client's
coding-type support set does not include the file's coding
and no registered proxy server can translate.</t>
        </li>
      </ul>
      <t>A client that supports the flexible file v2 layout -- which is the precondition for
any of this -- needs no proxy-specific I/O code: the proxy case
arrives as a single-data server layout and drives the same CHUNK
ops as any other flexible file v2 layout.  The <tt>FFV2_DS_FLAGS_PROXY</tt> bit on
the data server entry is available for clients that choose to distinguish
proxy-fronted I/O (for telemetry, alternative retry policy, or
avoidance under application preference); a client that ignores
the bit interoperates unchanged.</t>
      <section anchor="sec-atomic-commit">
        <name>Atomic commit on PROXY_DONE</name>
        <t>When the proxy server issues <tt>PROXY_DONE(pd_stateid, pd_status=NFS4_OK)</tt>,
the metadata server atomically (in one transaction):</t>
        <ol spacing="normal" type="1"><li>
            <t>promotes L2 to be the file's layout (D dropped, G promoted);</t>
          </li>
          <li>
            <t>drops L1 and L3 from the file's layout records;</t>
          </li>
          <li>
            <t>retires the in-flight migration record;</t>
          </li>
          <li>
            <t>issues CB_LAYOUTRECALL for the file's outstanding
client-facing layouts that name the proxy server; and</t>
          </li>
          <li>
            <t>defers <tt>REMOVE_MIRROR(D)</tt> until those layouts are returned.</t>
          </li>
        </ol>
        <t>On its next LAYOUTGET each client receives the post-migration
layout (L2): the real data servers, with no proxy server.</t>
        <t>When PROXY_DONE indicates failure (or PROXY_CANCEL is issued):</t>
        <ol spacing="normal" type="1"><li>
            <t>L1 is promoted unchanged -- the file falls back to its
pre-migration mirror set.</t>
          </li>
          <li>
            <t>L2 is dropped; the half-filled G instance is internally
unlinked.</t>
          </li>
          <li>
            <t>L3 is dropped and the migration record retired.</t>
          </li>
          <li>
            <t>CB_LAYOUTRECALL is issued for the layouts that name the
proxy server; on the next LAYOUTGET clients receive L1.</t>
          </li>
        </ol>
      </section>
      <section anchor="the-swap-window">
        <name>The swap window</name>
        <t>Because every client wrote through the proxy server, no client ever
addressed D directly, and there are no client writes in flight
to D when the swap occurs.  The deferred <tt>REMOVE_MIRROR(D)</tt>
covers only the proxy server's own trailing writes: by the time it
issues PROXY_DONE the proxy server, as the sole writer, has quiesced its
M2 fan-out, so the deferral window is short and contains no
client-visible activity.</t>
        <t>When CB_LAYOUTRECALL arrives, a client holding a layout that names
the proxy server returns it and issues a fresh LAYOUTGET in the
usual way.
In-flight client I/O to the proxy server across that boundary is handled
by the in-flight-I/O rules for a proxy server change (see "In-Flight I/O
When the proxy server Changes").</t>
      </section>
      <section anchor="sec-claim-proxy">
        <name>The CLAIM_PROXY open claim</name>
        <t>The proxy server opens the file with a new OPEN claim, <tt>CLAIM_PROXY</tt>.
A bare <tt>OPEN(CLAIM_NULL)</tt> cannot serve here: it would be
indistinguishable from an ordinary or racing OPEN on the
registered-proxy server session, leaving the metadata server to infer proxy intent
from session state -- which it cannot do reliably.
<tt>CLAIM_PROXY</tt> makes the proxy OPEN explicit and carries, in
one step, what the metadata server needs to bind the proxy server to the file.</t>
        <t><tt>open_claim_type4</tt> gains one enumerant and <tt>open_claim4</tt> one
union arm:</t>
        <figure anchor="fig-claim-proxy">
          <name>The CLAIM_PROXY open claim</name>
          <sourcecode type="xdr"><![CDATA[
/// /* New OPEN claim for a proxy server; extends the
///    open_claim_type4 enumeration of [RFC8881]. */
///
/// const CLAIM_PROXY = 7;
///
/// struct open_claim_proxy4 {
///         proxy_stateid4  ocp_proxy_stateid;
///         nfs_fh4         ocp_proxy_fh;
/// };
///
/// /* open_claim4 gains the arm:
///         case CLAIM_PROXY:
///                 open_claim_proxy4       ocp_proxy;
///  */
]]></sourcecode>
        </figure>
        <t><tt>CLAIM_PROXY</tt> is filehandle-based and opens an existing file:
the proxy server issues <tt>PUTFH</tt> of the assignment's <tt>pa_file_fh</tt>
followed by <tt>OPEN(CLAIM_PROXY)</tt>, with no directory filehandle
and no component name, in the manner of <tt>CLAIM_FH</tt>.
<tt>CLAIM_PROXY</tt> <bcp14>MUST NOT</bcp14> be combined with <tt>OPEN4_CREATE</tt>.</t>
        <t>The operand carries two values:</t>
        <dl>
          <dt><tt>ocp_proxy_stateid</tt>:</dt>
          <dd>
            <t>the <tt>proxy_stateid4</tt> the metadata server minted for this assignment
and returned in the PROXY_PROGRESS work assignment
(<xref target="sec-PROXY_PROGRESS"/>).  It is the correlator that
identifies this OPEN as the proxy OPEN for a specific
assignment; the metadata server does not infer proxy intent from the
session.</t>
          </dd>
          <dt><tt>ocp_proxy_fh</tt>:</dt>
          <dd>
            <t>the filehandle under which the proxy server will serve the file to
clients: the data-server filehandle that appears in the
layout the metadata server hands an encoding-incapable client, and the
filehandle a non-pNFS client obtains by LOOKUP against
the proxy server.  Only the proxy server can mint this filehandle; it is
opaque to the metadata server, which records it and copies it
verbatim into the layouts it issues.  Carrying it in the
OPEN binds it atomically with the proxy OPEN.</t>
          </dd>
        </dl>
        <t>The metadata server <bcp14>MUST</bcp14> verify that <tt>ocp_proxy_stateid</tt> is valid, that
it names an outstanding assignment, that the assignment was
made to the calling clientid, and that the current
filehandle is that assignment's file.  An invalid or stale
stateid draws <tt>NFS4ERR_BAD_STATEID</tt>.</t>
        <t>A proxy server <bcp14>MUST NOT</bcp14> issue <tt>OPEN(CLAIM_PROXY)</tt> unless it holds a
successful PROXY_REGISTRATION (<xref target="sec-PROXY_REGISTRATION"/>);
successful registration is what establishes that the metadata server
implements this extension.</t>
        <t><tt>OPEN(CLAIM_PROXY)</tt> returns the ordinary OPEN result: an open
stateid, and an <tt>open_delegation4</tt> which the metadata server <bcp14>MUST</bcp14> set to
<tt>OPEN_DELEGATE_NONE</tt> -- a delegation to the proxy server would conflict
with the migration the proxy server is itself driving.  The proxy server opens
with <tt>OPEN4_SHARE_ACCESS_BOTH</tt> and <tt>OPEN4_SHARE_DENY_NONE</tt>.
A retransmitted or re-issued <tt>OPEN(CLAIM_PROXY)</tt> is handled
exactly as for any other claim: the session replay cache
absorbs retransmits, and a genuine repeated OPEN by the same
open-owner is an ordinary share-state operation.</t>
        <t>The proxy server then obtains the L3 composite layout with an ordinary
LAYOUTGET; the metadata server serves L3 because the calling clientid
holds an in-flight migration record for the file.  The L3
layout stateid is a normal NFSv4 layout stateid.  It governs the
<tt>CHUNK_READ</tt>, <tt>CHUNK_WRITE</tt>, <tt>CHUNK_FINALIZE</tt>, and <tt>CHUNK_COMMIT</tt>
operations the proxy server issues against the source and target data
servers, in the standard way.  It is distinct from <tt>proxy_stateid4</tt>
(<xref target="sec-proxy-stateid"/>), which is a control-plane handle for
the migration as a whole and is never presented to LAYOUTGET;
the metadata server keys its in-flight migration record on the
proxy_stateid.  Separating the two -- one for I/O on a
layout, one for the migration -- keeps the migration record's
lifetime independent of any LAYOUTGET / LAYOUTRETURN cycle
the proxy server performs during the data-movement phase.</t>
      </section>
      <section anchor="drain-interaction">
        <name>Drain interaction</name>
        <t>The DRAINING state on D is observable to external
clients only through the absence of new layouts naming D:
while D is DRAINING, the metadata server does not place D in any new
mirror set.  Before the migration becomes active for an
existing file whose layout names D, the metadata server issues
CB_LAYOUTRECALL on every outstanding layout for the file
whose mirror set includes D.  Once those layouts have been
returned -- or administratively revoked when a client's CB
back-channel fails to ack within the recall window -- the
migration is in flight.</t>
        <t>From that point until the assigned proxy server completes its
<tt>OPEN(CLAIM_PROXY)</tt> (<xref target="sec-claim-proxy"/>) and registers the
filehandle under which it will serve the file, the metadata server cannot
yet build a client-facing layout, and answers every LAYOUTGET
for the file with <tt>NFS4ERR_DELAY</tt>; clients retry.  This window
<bcp14>MUST</bcp14> be bounded: if the assigned proxy server does not complete its
<tt>OPEN(CLAIM_PROXY)</tt> within a deadline tied to its registration
lease, the metadata server reassigns or abandons the assignment and stops
returning <tt>NFS4ERR_DELAY</tt>.  Once the proxy server has opened, subsequent
LAYOUTGETs for the file return a layout naming the proxy server.</t>
        <t>This omit-and-replace ordering guarantees that no client write
hits D after the migration has started.  The alternative --
keep-and-shadow, in which the layout view continues to include
D and the proxy server shadows client writes from D to G as they happen
-- requires the proxy server to expose itself as a flexible file v2 data
server
(an <tt>INTERPOSED</tt> instance taking the place of D in the visible
layout, with the proxy server funneling writes to both D and G).  This
shape is defined in the per-instance delta model below
(informative) but is not exercised by the wire ops in this
revision.</t>
      </section>
      <section anchor="per-instance-migration-deltas-informative">
        <name>Per-instance migration deltas (informative)</name>
        <t>The L1/L2/L3 framing above describes one valid implementation
approach -- whole-layout swap -- that captures the simplest
case (single mirror replacement under a Client Side Mirroring
encoding).  A metadata server implementation that supports more general
migrations (e.g., a single shard add to an erasure-coded
file, or a partial mirror-set rotation under a Reed-Solomon
encoding) <bcp14>MAY</bcp14>
record migration state as per-instance deltas on the file's
existing layout records, rather than as a complete L2/L3 pair.</t>
        <t>In this informative model, each migration record carries an
array of per-instance deltas, each delta describing a
transformation on one position within one segment of
<tt>layout_segments</tt>.  Four instance states are useful:</t>
        <dl>
          <dt><tt>STABLE</tt>:</dt>
          <dd>
            <t>unchanged; client writes go here directly.</t>
          </dd>
          <dt><tt>DRAINING</tt>:</dt>
          <dd>
            <t>a slot being decommissioned; under omit-and-replace, the
LAYOUTGET view-build path omits this slot and replaces
it with the matching INCOMING.</t>
          </dd>
          <dt><tt>INCOMING</tt>:</dt>
          <dd>
            <t>a new slot the proxy server is filling; under omit-and-replace, the
LAYOUTGET view-build path emits this slot in place of the
matching DRAINING.</t>
          </dd>
          <dt><tt>INTERPOSED</tt>:</dt>
          <dd>
            <t>a slot whose visible endpoint is the proxy server, with the proxy server
internally fanning writes out to one or more target data servers.
Used by keep-and-shadow (forward-compat; not produced by
the wire ops in this revision).</t>
          </dd>
        </dl>
        <t>The current published layout (<tt>layout_segments</tt>) is built
through the deltas: when LAYOUTGET runs while a migration
is active, the layout-build path consults the migration
record and emits the during-migration view by applying the
deltas to the base segments.  <tt>layout_segments</tt> itself is
never mutated until <tt>PROXY_DONE(NFS4_OK)</tt> collapses the
deltas into the base records permanently.</t>
        <t>This per-instance model and the L1/L2/L3 swap model agree on
the wire-visible behavior in the simplest case (single mirror
replacement, omit-and-replace).  The wire ops in this draft
do not require either implementation; a metadata server chooses whichever
matches its layout-record machinery.</t>
        <t>The wire ops in this draft do not constrain the choice; the
per-instance delta model is one known implementation strategy
that has been used to track the four record-builder invariants
and a lease-aware reaper for the migration record /
proxy_stateid tables across the lifecycle described above.</t>
      </section>
    </section>
    <section anchor="client-behavior">
      <name>Client Behavior</name>
      <t>During a proxy operation the layout the metadata server hands a client is
a single data server flexible file v2 layout naming the proxy server.  The client treats it
as any other flexible file v2 layout, sending CHUNK ops to the named data server
under its existing layout stateid.  Nothing in the client's
path distinguishes "the data server is a proxy server" from "the data server is a real
data server"; that distinction lives entirely on the metadata server
side.</t>
      <t>The proxy server accepts those CHUNK ops under the client's existing
layout stateid because the metadata server has registered the stateid via
TRUST_STATEID on the proxy server, per the tight-coupling semantics in
<xref target="I-D.haynes-nfsv4-flexfiles-v2"/>.</t>
      <t>The client handles proxy-server-side errors (NFS4ERR_DELAY, connection
loss, NFS4ERR_BAD_STATEID) exactly as it would any other data server
error: report LAYOUTERROR to the metadata server and expect either a new
layout or a proxy server reassignment in return.</t>
      <section anchor="when-the-layout-is-recalled">
        <name>When the Layout Is Recalled</name>
        <t>If the metadata server recalls the layout mid-operation (the proxy server failed
and is being replaced, or the operation completed and normal
data server layouts are being reissued), the client issues
LAYOUTRETURN as usual and reacquires via LAYOUTGET.  The new layout may name
a different proxy server, a different mirror set, or -- if the proxy
operation has completed -- the real data servers directly.</t>
      </section>
      <section anchor="in-flight-io-when-the-proxy-server-changes">
        <name>In-Flight I/O When the Proxy Server Changes</name>
        <t>In-flight I/O to the old proxy server when the metadata server recalls the layout
<bcp14>MAY</bcp14> complete at the old proxy server; results remain valid under the
old proxy server's authority.  New I/O issued after LAYOUTRETURN <bcp14>MUST</bcp14>
go through the data server(s) the new layout names: a replacement
proxy server, or the real data servers if the proxy operation has completed.</t>
      </section>
    </section>
    <section anchor="sec-state-machine">
      <name>State Machine</name>
      <t>A file's participation in a proxy operation passes through five
states.</t>
      <dl>
        <dt>READY:</dt>
        <dd>
          <t>No operation is in flight.</t>
        </dd>
        <dt>ASSIGNED:</dt>
        <dd>
          <t>The metadata server has queued an assignment for a proxy server,
but that proxy server has not acknowledged it via OPEN +
LAYOUTGET.</t>
        </dd>
        <dt>PROXY_ACTIVE:</dt>
        <dd>
          <t>The proxy server is driving a move or repair, and external clients
hold the transitional L3 composite layout.</t>
        </dd>
        <dt>COMMITTING:</dt>
        <dd>
          <t>The proxy server has issued PROXY_DONE(OK), and the metadata server
is recalling L3 from the clients holding it.</t>
        </dd>
        <dt>DONE:</dt>
        <dd>
          <t>Clients are on the post-move L2 layout and the source data servers
are retired.</t>
        </dd>
      </dl>
      <t>The state is metadata-server-local: clients never observe these state
names directly, but a client's behavior is shaped by which layout the
metadata server is currently handing out.  A given file spends most of
its lifetime in READY; a proxy operation is a relatively short
excursion through the other four states, after which the file returns
to READY with a new layout in place -- or, on cancellation or failure,
with the old layout preserved.</t>
      <t>The diagram below shows the states and the principal
transitions, including the failure exits from ASSIGNED and
PROXY_ACTIVE back to READY.  The Transitions table that
follows enumerates each transition with its trigger and
effect.</t>
      <figure anchor="fig-state-machine">
        <name>File state during a proxy operation</name>
        <artwork><![CDATA[
            (admin, policy, repair, or maintenance trigger)
                               |
                               v
                         +------------+
                         |   READY    |
                         | source     |
                         | layout     |
                         | only       |
                         +-----+------+
                               |
                               | MDS selects registered PS;
                               | queues a proxy_assignment4
                               | for delivery in next
                               | PROXY_PROGRESS reply
                               v
                         +--------------+
                         |   ASSIGNED   |---> back to READY on
                         | MDS has the  |     cancellation
                         | in-flight    |     (MDS-initiated, or
                         | record; PS   |     lease expires before
                         | has not yet  |     the PS picks up)
                         | OPEN'd file  |
                         +-----+--------+
                               |
                               | PS picks up the assignment:
                               | OPEN(pa_file_fh) + LAYOUTGET
                               | (L3 composite layout)
                               v
                         +--------------+
                         | PROXY_ACTIVE |---> back to READY on
                         | clients see  |     PROXY_DONE(FAIL),
                         | single-DS    |     PROXY_CANCEL, or
                         | layout       |     PS lease expiry;
                         | naming PS;   |     layout reverts to L1
                         | PS drives    |
                         | source->dest |
                         +-----+--------+
                               |
                               | PS issues SEQUENCE
                               | PUTFH LAYOUTRETURN
                               | PROXY_DONE(stid, OK)
                               v
                         +------------+
                         | COMMITTING |
                         | MDS issues |
                         | CB_LAYOUT- |
                         | RECALL for |
                         | old layout |
                         +-----+------+
                               |
                               | all clients have
                               | LAYOUTRETURNed
                               v
                         +------------+
                         |   DONE     |
                         | new layout |
                         | live;      |
                         | source     |
                         | DSes       |
                         | retired    |
                         +-----+------+
                               |
                               | (transient: MDS finalizes
                               | retirement bookkeeping and
                               | returns the file to steady
                               | state under the new layout)
                               v
                         +------------+
                         |   READY    |
                         | new layout |
                         | in place   |
                         +------------+
]]></artwork>
      </figure>
      <section anchor="transitions">
        <name>Transitions</name>
        <table>
          <thead>
            <tr>
              <th align="left">From</th>
              <th align="left">To</th>
              <th align="left">Trigger</th>
              <th align="left">Actions</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">READY</td>
              <td align="left">ASSIGNED</td>
              <td align="left">metadata server decides to move or repair</td>
              <td align="left">metadata server queues a <tt>proxy_assignment4</tt> (<tt>PROXY_OP_MOVE</tt> or <tt>PROXY_OP_REPAIR</tt>) for delivery in the next PROXY_PROGRESS reply to the selected proxy server; creates the in-flight migration record</td>
            </tr>
            <tr>
              <td align="left">ASSIGNED</td>
              <td align="left">PROXY_ACTIVE</td>
              <td align="left">proxy server picks up the assignment</td>
              <td align="left">proxy server issues <tt>OPEN(CLAIM_PROXY)</tt> + LAYOUTGET against <tt>pa_file_fh</tt>; metadata server begins serving clients a layout naming the proxy server</td>
            </tr>
            <tr>
              <td align="left">PROXY_ACTIVE</td>
              <td align="left">COMMITTING</td>
              <td align="left">proxy server issues PROXY_DONE with <tt>pd_status=NFS4_OK</tt></td>
              <td align="left">metadata server begins CB_LAYOUTRECALL fan-out to clients holding L3 (issued during PROXY_ACTIVE); L1 was already recalled and drained before PROXY_ACTIVE was entered</td>
            </tr>
            <tr>
              <td align="left">COMMITTING</td>
              <td align="left">DONE</td>
              <td align="left">All clients have LAYOUTRETURNed</td>
              <td align="left">metadata server issues post-move layouts (L2); source DSes retired</td>
            </tr>
            <tr>
              <td align="left">DONE</td>
              <td align="left">READY</td>
              <td align="left">metadata server finalizes retirement bookkeeping</td>
              <td align="left">file returns to steady state under the new layout; no wire event is required</td>
            </tr>
            <tr>
              <td align="left">ASSIGNED</td>
              <td align="left">READY</td>
              <td align="left">metadata-server-initiated cancellation: metadata server includes a <tt>PROXY_OP_CANCEL_PRIOR</tt> assignment in the next PROXY_PROGRESS reply</td>
              <td align="left">metadata server drops the in-flight record; proxy server drops the assignment from its in-flight queue</td>
            </tr>
            <tr>
              <td align="left">PROXY_ACTIVE</td>
              <td align="left">COMMITTING</td>
              <td align="left">proxy server issues PROXY_DONE with a failing <tt>pd_status</tt>, or PROXY_CANCEL, or the proxy server's lease expires with no replacement available</td>
              <td align="left">metadata server begins CB_LAYOUTRECALL fan-out to clients still on the L3 (proxy) layout so they revert to L1; L2 and G are discarded</td>
            </tr>
            <tr>
              <td align="left">COMMITTING</td>
              <td align="left">READY</td>
              <td align="left">All clients that held L3 have LAYOUTRETURNed</td>
              <td align="left">file returns to steady state under L1 (the pre-operation layout); no L2 promotion occurs</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
    <section anchor="proxy-server-failure-and-recovery">
      <name>Proxy Server Failure and Recovery</name>
      <section anchor="proxy-server-crash-during-proxyactive">
        <name>Proxy Server Crash During PROXY_ACTIVE</name>
        <t>When a proxy server crashes mid-operation, client I/O routed through
it receives NFS4ERR_DELAY (if the proxy server is reachable but
unhealthy) or connection errors (if unreachable), and the
affected clients report LAYOUTERROR to the metadata server.  The metadata server <bcp14>MAY</bcp14>
select a replacement proxy server from the registered pool and queue a
fresh <tt>proxy_assignment4</tt> (<tt>PROXY_OP_MOVE</tt> or <tt>PROXY_OP_REPAIR</tt>) for
that proxy server
in its next PROXY_PROGRESS reply, with the source layout
updated to reflect current reality -- destination data servers that
the failed proxy server populated are now part of the source set -- and
the destination layout unchanged; the replacement proxy server resumes
from wherever the failed proxy server left off.</t>
        <t>Before the replacement proxy server's layout becomes live, the metadata server
<bcp14>MUST</bcp14> fence the failed proxy server: it revokes the failed proxy server's L3
layout stateid (REVOKE_STATEID) and, where the data server protocol
supports it, fences the failed proxy server at the source and target
data servers.  Fencing closes the window in which a delayed write
from a failed-but-not-dead proxy server could land after the
replacement proxy server has taken over -- a two-proxy-server instance of the
write race the single-writer model otherwise prevents.  The
metadata server then issues CB_LAYOUTRECALL on the old layout and the
replacement proxy server's layout becomes live for new LAYOUTGETs.</t>
        <t>If the metadata server cannot find a replacement within a policy timeout,
it <bcp14>MUST</bcp14> cancel the operation: revert to the pre-move source
layout, do not issue a destination layout, and mark the
destination data servers for cleanup or retry.</t>
      </section>
      <section anchor="cascading-proxy-server-failure">
        <name>Cascading Proxy Server Failure</name>
        <t>A second proxy server failure on the same operation <bcp14>SHOULD</bcp14> escalate to
deployment management rather than trigger another automatic
replacement.  Recurring failures across multiple proxy servers
indicate an environmental issue no proxy server can work around -- an
unreachable source data server, a misconfiguration, or a starved
replacement pool -- that operator attention will resolve
sooner than another retry.</t>
      </section>
      <section anchor="source-data-server-crash-during-proxyactive">
        <name>Source Data Server Crash During PROXY_ACTIVE</name>
        <t>A source data server crash reduces the proxy server's read parallelism but does
not block forward progress as long as the erasure code can
still reconstruct the file from the surviving source data servers.
If the source set degrades past reconstructibility, the
operation transitions to whole-file repair semantics
automatically: ranges that can still be reconstructed
succeed; ranges that cannot terminate the operation with
NFS4ERR_PAYLOAD_LOST.</t>
      </section>
      <section anchor="destination-data-server-crash-during-proxyactive">
        <name>Destination Data Server Crash During PROXY_ACTIVE</name>
        <t>A destination data server crash is handled as a normal data server failure on
the destination side.  The proxy server, acting as a client to the
destination data servers, reports LAYOUTERROR to the metadata server, which <bcp14>MAY</bcp14>
substitute a spare or mark the destination
FFV2_DS_FLAGS_REPAIR.  The proxy server continues pushing to the
remaining destinations, and clients are unaffected.</t>
      </section>
    </section>
    <section anchor="sec-mds-recovery">
      <name>Metadata Server Crash Recovery</name>
      <t>Clients and the proxy server detect metadata server session loss and enter RECLAIM
per <xref section="8.4" sectionFormat="of" target="RFC8881"/> / S10.2.1.  The proxy server's recovery extends
the standard NFSv4.1 client-recovery sequence with one
proxy-specific step -- re-registration -- and one explicit
safety rule: if the proxy server cannot reclaim a layout for a
migration it had in flight, the proxy server drops that migration
rather than continuing with stale state.</t>
      <section anchor="sec-ps-recovery">
        <name>Proxy Server Recovery Sequence</name>
        <t>The proxy server, after detecting metadata server session loss, performs the
following steps in order:</t>
        <ol spacing="normal" type="1"><li>
            <t>EXCHANGE_ID + CREATE_SESSION with the proxy server's prior
<tt>client_owner4</tt>.  Standard NFSv4.1 client recovery; the
proxy server's <tt>clientid4</tt> is restored when the metadata server recognizes the
prior <tt>client_owner4</tt>.</t>
          </li>
          <li>
            <t>PROXY_REGISTRATION to re-establish the proxy-server
role on the new session.  The proxy server attempts
renewal first, presenting its prior
<tt>prr_registration_id</tt>, and inspects the result.  </t>
            <dl>
              <dt>Renewal accepted (<tt>NFS4ERR_STALE_CLIENTID</tt> NOT returned):</dt>
              <dd>
                <t>the metadata server retained the registration across its
own restart; the proxy server keeps the same
<tt>prr_registration_id</tt> and the migration records tied to
it remain in force.  Proceed to step 3.</t>
              </dd>
              <dt><tt>NFS4ERR_STALE_CLIENTID</tt>:</dt>
              <dd>
                <t>the metadata server lost its registration table across
the restart (see the unknown-or-stale case in
<xref target="sec-PROXY_REGISTRATION"/>).  The proxy server <bcp14>MUST</bcp14>
retry PROXY_REGISTRATION with
<tt>pra_registration_id = PROXY_REGISTRATION_ID_NEW</tt> (0)
to obtain a fresh registration.  The fresh
<tt>prr_registration_id</tt> returned by the metadata server
is unrelated to the prior one and carries no prior
migration ownership; the metadata server's assignment
queue for this proxy server in step 3 will necessarily
be empty, and every retained sidecar entry falls
through to step 5 to be dropped per
<xref target="sec-lost-migration-records"/>.</t>
              </dd>
              <dt><tt>NFS4ERR_PERM</tt>:</dt>
              <dd>
                <t>another party is currently registered under this
<tt>prr_registration_id</tt> with a different authenticated
identity; the proxy server <bcp14>MUST NOT</bcp14> retry with the
prior ID.  This is a deployment or credentialing fault,
not a routine recovery outcome, and is out of scope for
the autopilot recovery path.</t>
              </dd>
            </dl>
            <t>
Until PROXY_REGISTRATION completes, the metadata server
treats the client as an ordinary NFSv4 client and <bcp14>MUST
NOT</bcp14> deliver proxy assignments to it.</t>
          </li>
          <li>
            <t>PROXY_PROGRESS to pull the assignment queue.  If the
metadata server has retained any in-flight migrations owned by this
proxy server, it delivers them in the reply -- each as a fresh
<tt>proxy_assignment4</tt> carrying a fresh <tt>proxy_stateid</tt> (the
prior <tt>proxy_stateid</tt> is from a prior boot and is
permanently stale; see <xref target="sec-proxy-stateid"/>).  For each
re-delivered assignment, the proxy server attempts to match it to
a retained sidecar entry by <tt>(pa_file_fh,
pa_target_deviceid)</tt>.  Matched assignments proceed to step 4;
unmatched assignments are handled as fresh assignments.</t>
          </li>
          <li>
            <t>Per-file layout reclaim, for each matched assignment:
<tt>OPEN_RECLAIM(CLAIM_PREVIOUS, pa_file_fh)</tt> per
<xref section="9.11.1" sectionFormat="of" target="RFC8881"/>, followed by
<tt>LAYOUTGET(reclaim=true)</tt> per <xref section="18.43.3" sectionFormat="of" target="RFC8881"/> with
the proxy server's retained layout stateid as the reclaim key.  On
success the metadata server returns a fresh layout stateid for the
resumed migration and the proxy server continues from where it
left off.  On <tt>NFS4ERR_NO_GRACE</tt>, <tt>NFS4ERR_RECLAIM_BAD</tt>,
or any other reclaim failure, the proxy server <bcp14>MUST</bcp14> drop the
migration: it issues <tt>PROXY_CANCEL</tt> with the fresh
<tt>proxy_stateid</tt> delivered in step 3 to signal the metadata server
that the migration cannot be resumed, discards the
retained sidecar entry, and halts any pending I/O for
the file.</t>
          </li>
          <li>
            <t>Sidecar entries the metadata server did not re-deliver.  For any
migration the proxy server retained in its sidecar but the metadata server did
not include in step 3, the proxy server <bcp14>MUST</bcp14> drop that migration:
discard the sidecar entry and halt any pending I/O for
the file.  No signal to the metadata server is needed -- the metadata server
already has no record of this migration.</t>
          </li>
          <li>
            <t>RECLAIM_COMPLETE when all per-file reclaims and drops
are done.</t>
          </li>
        </ol>
        <t>Dropped migrations rejoin the metadata server's normal assignment path:
a data server still DRAINING when recovery settles will, in due
course, attract a fresh <tt>proxy_assignment4</tt> -- to this proxy server or
another -- under the <tt>(pa_file_fh, pa_target_deviceid)</tt>
invariant of <xref target="sec-multi-ps-fanout"/>.</t>
        <t>The sidecar match in step 3 is best-effort across a metadata server
reboot.  <tt>deviceid4</tt> is server-scoped and <bcp14>MAY</bcp14> change across a
restart per <xref section="3.3.7" sectionFormat="of" target="RFC8881"/>; a target deviceid the
metadata server reassigns on restart will not match the proxy server's
retained sidecar entry, the proxy server will not recognize the
re-delivery as the same migration, and the affected sidecar entries
are dropped per step 5.  The autopilot re-drives the work as a fresh
assignment.  Implementations that preserve target deviceids across
restart will resume mid-flight; those that do not will re-drive from
scratch -- both are conformant.</t>
        <section anchor="retention-requirement">
          <name>Retention Requirement</name>
          <t>A proxy server <bcp14>MUST</bcp14> be able to supply each in-flight migration's
layout stateid as the reclaim key after a proxy-server-process
restart.  The natural implementation retains it in proxy-server-local
storage (e.g., a small sidecar file or DB table keyed by
<tt>pa_file_fh</tt>) when the metadata server grants the L3 layout; how it is
retained is an implementation matter.  A proxy server that cannot
supply the prior stateid cannot reclaim its layouts after a
restart, and the affected migrations are dropped per step 5
above.</t>
        </section>
      </section>
      <section anchor="proxy-server-identity-continuity">
        <name>Proxy Server Identity Continuity</name>
        <t>A proxy server implementation <bcp14>SHOULD</bcp14> retain its <tt>client_owner4</tt> across
proxy-server-process restart so that post-restart EXCHANGE_ID recovers
the same <tt>clientid</tt> and the in-flight migration records
remain valid.</t>
        <t>If the proxy server's <tt>client_owner4</tt> rotates (e.g., because proxy
server process state was lost), the new EXCHANGE_ID gets a fresh
<tt>clientid4</tt>.  The in-flight migration records are keyed on
<tt>proxy_stateid</tt> and authorized to the proxy server by its
<tt>prr_registration_id</tt> (see PROXY_DONE authorization step 4,
<xref target="sec-PROXY_DONE"/>), so the records survive the clientid rollover
provided the metadata server still holds the prior
<tt>prr_registration_id</tt> in its registration table: the reconnecting
proxy server, on presenting the same <tt>prr_registration_id</tt>, retains
authority over its in-flight migrations and reclaims each one's
per-file layout via OPEN(CLAIM_PROXY) with the record's
<tt>proxy_stateid</tt>.  When the metadata server did not retain the
registration -- either because a metadata-server restart discarded
the registration table (see <xref target="sec-ps-recovery"/> step 2) or because
the migration records themselves were not retained across the
metadata server's recovery -- the drop rules in
<xref target="sec-lost-migration-records"/> apply and the autopilot re-issues
fresh assignments at its discretion.</t>
      </section>
      <section anchor="sec-lost-migration-records">
        <name>Lost Migration Records</name>
        <t>The drop rules in <xref target="sec-ps-recovery"/> cover the lost-state
case end-to-end: a migration the metadata server did not retain is
dropped by the proxy server -- either because the metadata server does not
re-deliver it in PROXY_PROGRESS, or because the per-file
reclaim returns <tt>NFS4ERR_NO_GRACE</tt> / <tt>NFS4ERR_RECLAIM_BAD</tt>
-- and the autopilot is free to re-drive the work as a
fresh assignment.  No proxy-specific signalling beyond
standard NFSv4 reclaim errors and <tt>PROXY_CANCEL</tt> is needed.</t>
      </section>
    </section>
    <section anchor="sec-security">
      <name>Security Considerations</name>
      <t>This document adds security-relevant behavior in two
places: the session the proxy server establishes with the metadata server, and the
data path clients take through the proxy server during a proxy
operation.  The session is narrower than the data path --
only the metadata server talks to the proxy server over it, and the metadata server has long
been a trusted coordinator in the pNFS model -- but it
carries operations that affect every client whose layouts
reach a proxy server.  The data path is broader, because it exposes
the proxy server to every client whose layout names it; a compromised
proxy server on that path has the same observational
and modification reach as a compromised data server, and in the
translating-proxy server case a larger reach because of the elevated
identity the proxy server typically runs with.</t>
      <t>Each threat the design addresses or explicitly leaves out of
scope is named below.  Credential forwarding, the most
consequential and the most easily implemented incorrectly,
is expanded in <xref target="sec-credential-forwarding"/>.</t>
      <dl>
        <dt>Proxy Server Authority:</dt>
        <dd>
          <t>A proxy server in PROXY_ACTIVE sees all client I/O for the proxied
file.  A compromised proxy server can observe or modify file data.
Deployments <bcp14>MUST</bcp14> treat proxy-server-capable hosts as at least as
trusted as the data servers they proxy for.  PROXY_REGISTRATION
<bcp14>SHOULD</bcp14> be gated by deployment-level authorization;
arbitrary hosts that present the op without prior
provisioning <bcp14>SHOULD</bcp14> be rejected.</t>
        </dd>
        <dt>Transport security across the operation:</dt>
        <dd>
          <t>The proxy server's connections to source and destination data servers are
independent of the client's connection to the proxy server.  A proxy server
<bcp14>MAY</bcp14> read from an AUTH_SYS source and write to a TLS
destination (or any other combination).  The proxy server is
responsible for enforcing the effective security policy
(e.g., do not downgrade encrypted data to a plaintext
data server).</t>
        </dd>
        <dt>Principal binding during a proxy operation:</dt>
        <dd>
          <t>For proxy-server-to-data-server traffic (the proxy server reading source data servers and
writing destination data servers to carry out a <tt>PROXY_OP_MOVE</tt> or
<tt>PROXY_OP_REPAIR</tt> assignment), the proxy server presents a principal to those data servers
that they will accept; this is the proxy server's own service
identity unless constrained delegation or equivalent is
arranged.  Forwarding the client's identity to the peer
data servers for proxy-server-driven data movement is NOT required and is
typically NOT practical (the client is not in the
conversation at that point).  See
<xref target="sec-credential-forwarding"/> for the case of
client-initiated file I/O through a translating proxy server,
where the credential-forwarding rule is different and
stricter.</t>
        </dd>
        <dt>Proxy Server Impersonation:</dt>
        <dd>
          <t>A malicious metadata server could steer clients to a
hostile proxy server by issuing a layout whose single
<tt>ffv2_data_server4</tt> entry names an attacker-controlled host
(with <tt>FFV2_DS_FLAGS_PROXY</tt> set).  Registration is
proxy-initiated, so the attack is not against
<tt>PROXY_REGISTRATION</tt> -- it is against the client's
willingness to follow any data-server address the metadata
server hands it.  The existing metadata server trust model
already grants the metadata server this capability for any
data server, via CB_LAYOUTRECALL and the ability to issue
any layout it chooses; <tt>PROXY_REGISTRATION</tt> does not
weaken it, and the proxy case is not more exposed than the
ordinary data-server case.  Clients that require stronger
proxy server identity verification <bcp14>SHOULD</bcp14> apply
deployment-level authorization to the proxy server's
transport-security credentials.</t>
        </dd>
        <dt>Registration lease expiry:</dt>
        <dd>
          <t>If a proxy server's lease expires mid-operation, the metadata server <bcp14>MUST</bcp14>
abandon the operation: discard the in-flight migration
record, revert the affected layouts to the pre-operation
state, and arrange cleanup of any half-populated
destination data servers.  The metadata server <bcp14>MUST NOT</bcp14> continue to route
client I/O to a proxy server whose registration has lapsed.</t>
        </dd>
      </dl>
      <section anchor="sec-credential-forwarding">
        <name>Credential Forwarding and the Privilege Boundary</name>
        <t>A translating proxy server (see <xref target="sec-encoding-translation"/>) has
structurally elevated privilege by design.  To perform its
management tasks -- moves, repairs, evacuations,
cross-tenant re-exports -- the deployment grants the proxy server's
service identity broad access: typically not-root-squashed,
often read/write to every file in the namespace, and session
authority to every data server.  That privilege is intentional.</t>
        <t>An encoding-ignorant client that reaches the proxy server, however, arrives
with its own RPC credentials that the proxy server does not itself need
in order to function.  An NFSv3 client's uid/gid, an
AUTH_SYS-squashed identity, an RPCSEC_GSS principal -- none of
these are the proxy server's own.  If the proxy server ignores the client's
credentials and issues metadata server or data server operations under its own
service identity when translating client I/O, every client
that reaches the proxy server silently inherits the proxy server's privilege.
This is a protocol-level privilege-escalation vector, and
this document calls it out rather than hiding it.</t>
        <t>The normative requirements below apply whenever a proxy server is
translating client-initiated file I/O (as distinct from
proxy-server-driven move / repair work, which runs under the proxy server's own
authority on directives from the metadata server).  They form a cohesive
set: credential pass-through is the core requirement;
no-squash-inversion closes the most common way pass-through
can be implemented incorrectly;
authorization-remains-with-metadata server names the responsibility on
the metadata server side of the same contract;
service-identity-is-for-the-control-plane draws the line
between the op paths where the proxy server uses its own credentials
and the op paths where it does not; and the failure-mode
rule specifies the correct refusal behavior rather than
letting a silent fall-through become the escape hatch.</t>
        <dl>
          <dt>Credential pass-through:</dt>
          <dd>
            <t>The proxy server <bcp14>MUST</bcp14> present the client's credentials (RPC auth
flavor and principal) on every metadata server or data server operation it
issues as a consequence of a client-initiated request.
Specifically, a client <tt>READ</tt> that the proxy server expands into
<tt>LAYOUTGET</tt> + <tt>CHUNK_READ</tt> <bcp14>MUST</bcp14> carry the client's
credentials on both the <tt>LAYOUTGET</tt> against the metadata server and
the <tt>CHUNK_READ</tt> against the data servers.  The proxy server <bcp14>MUST NOT</bcp14>
substitute its own service identity for client-initiated
operations.</t>
          </dd>
          <dt>No squash inversion:</dt>
          <dd>
            <t>If the client arrives with a root-squashed identity (for
example, uid 0 mapped to nobody by the NFSv3 export
configuration on the client-facing side of the proxy server), the
proxy server <bcp14>MUST</bcp14> preserve the squashed identity when forwarding.
The proxy server <bcp14>MUST NOT</bcp14> translate a client's squashed
credentials back into unsquashed root, even though the
proxy server's own identity is typically unsquashed.</t>
          </dd>
          <dt>Authorization remains with the metadata server:</dt>
          <dd>
            <t>When a client-initiated operation reaches the metadata server over a
proxy server &lt;-&gt; metadata server session, the metadata server <bcp14>MUST</bcp14> use the RPC credentials
carried on that compound for authorization and <bcp14>MUST NOT</bcp14>
substitute the proxy server's session-level identity.
Equivalently: the metadata server performs access-control checks
against the forwarded client credentials, not against
the proxy server's service identity, for any client-initiated file
operation.  The proxy server is a translator, not an authority.
This is what prevents proxy server deployment from becoming a
blanket ACL override.</t>
          </dd>
          <dt>Proxy Server Service Identity Is for the Control Plane Only:</dt>
          <dd>
            <t>The proxy server <bcp14>MUST</bcp14> use its own service identity for the
following, and <bcp14>MUST NOT</bcp14> use it for any other operation on
behalf of a forwarded client (per the pass-through rule
above):
</t>
            <ul spacing="normal">
              <li>
                <t>The metadata server &lt;-&gt; proxy server session (the session the proxy server opens to
the metadata server, on which PROXY_REGISTRATION, PROXY_PROGRESS,
PROXY_DONE, and PROXY_CANCEL all flow on the
fore-channel; the session's back-channel is not used
by this draft).</t>
              </li>
              <li>
                <t>Peer-data server session setup for proxy-server-driven data movement
(reading source data servers, writing destination data servers under
a <tt>PROXY_OP_MOVE</tt> assignment the metadata server has delivered
via
PROXY_PROGRESS).</t>
              </li>
              <li>
                <t>proxy server housekeeping.</t>
              </li>
            </ul>
            <t>The proxy server's service identity <bcp14>MUST NOT</bcp14> be used for
client-initiated file data operations.</t>
          </dd>
          <dt>Failure mode on missing credentials:</dt>
          <dd>
            <t>If the proxy server cannot forward a client's credentials for some
reason (e.g., the client presented AUTH_NONE, or the
client-facing side used a security flavor the proxy server cannot
propagate), the proxy server <bcp14>MUST</bcp14> reject the client operation with
the equivalent of NFS4ERR_ACCESS (or NFS3ERR_ACCES for
NFSv3 clients).  The proxy server <bcp14>MUST NOT</bcp14> fall back to serving
the operation under its own identity.</t>
          </dd>
        </dl>
        <t>Deployment-level requirements:</t>
        <ul spacing="normal">
          <li>
            <t>PROXY_REGISTRATION <bcp14>MUST</bcp14> be deployment-authorized.  An
unknown host presenting PROXY_REGISTRATION <bcp14>MUST</bcp14> be
rejected.  This is the only wire-level defense against a
hostile entity registering as a proxy server and then receiving
client-forwarded credentials.</t>
          </li>
          <li>
            <t>The metadata server &lt;-&gt; proxy server session <bcp14>MUST</bcp14> use RPCSEC_GSS <xref target="RFC7861"/> or
RPC-over-TLS <xref target="RFC9289"/> with mutual authentication.
AUTH_SYS as the session-authentication flavor on the
metadata server &lt;-&gt; proxy server session is forbidden.  This
is distinct from forwarded client credentials: an NFSv3
/AUTH_SYS client's credentials <bcp14>MAY</bcp14> ride inside a
mutually-authenticated (RPCSEC_GSS or RPC-over-TLS) session as the
per-operation credential of a proxy-forwarded compound (see
the credential-forwarding rules above); what is forbidden is
AUTH_SYS on the session itself.  Equivalently, AUTH_SYS is
never sufficient for PROXY_REGISTRATION (which authenticates
the session), but AUTH_SYS is the ordinary per-operation
flavor for an NFSv3 client whose I/O the proxy server
forwards under the client's identity.</t>
          </li>
          <li>
            <t>Deployments <bcp14>SHOULD</bcp14> audit both the proxy server's
credential-forwarding behavior (the proxy server logs what it
forwards) and
the metadata server's authorization checks (the metadata server logs what
principal authorized each operation).  Divergence between
the two indicates a credential-forwarding bug or
compromise.</t>
          </li>
        </ul>
        <t>What the protocol cannot defend against:</t>
        <ul spacing="normal">
          <li>
            <t>A compromised proxy server has direct access to whatever credentials
pass through it.  Credential confidentiality collapses the
moment the proxy server is under adversary control.  Mitigation is
operational: restrict which hosts can register as a proxy server,
audit PROXY_REGISTRATION events, rotate deployment-level
keys.</t>
          </li>
          <li>
            <t>A deployment that configures a proxy server to run as root while
the client is root-squashed has already violated rule 2
above; no wire mechanism detects a proxy server deliberately
mis-implementing credential forwarding.  Deployments
<bcp14>SHOULD</bcp14> verify their proxy server implementation's
credential-forwarding behavior through conformance
testing before
production use.</t>
          </li>
        </ul>
        <t>Future work (noted as an Open Question below): RPCSEC_GSSv3
structured privilege assertion per <xref section="2.5.2" sectionFormat="of" target="RFC7861"/>
is the natural strong-authentication mechanism for
proxy-server-forwarded credentials.  This revision does not require
GSSv3 because the broader NFSv4 deployment base does not yet
support it; deployments that can use GSSv3 <bcp14>SHOULD</bcp14> prefer it
over AUTH_SYS passthrough for the credential-forwarding
channel.</t>
      </section>
      <section anchor="sec-namespace-traversal-privilege">
        <name>Namespace Traversal Privilege</name>
        <t>A proxy server that translates client I/O has to know how the metadata server's
namespace is shaped: which paths are exported, what filehandle
each path resolves to, how the exports mount within one another.
The proxy server acquires this information by traversing the metadata server's
namespace -- LOOKUP, LOOKUPP, PUTFH, PUTROOTFH, GETFH on the
proxy server &lt;-&gt; metadata server session.</t>
        <t>This traversal cannot always run under forwarded client
credentials: at the point the proxy server needs to discover a new export
(a client has not yet asked for it, or the proxy server has just restarted
and has no filehandle cache) there is no client whose credentials the
proxy server could forward.  Deployments have two choices for how the
proxy server
acquires namespace shape:</t>
        <dl>
          <dt>Grant a narrow traversal privilege:</dt>
          <dd>
            <t>The metadata server <bcp14>MAY</bcp14> treat a registered proxy server's service identity as
authorized for LOOKUP, LOOKUPP, PUTFH, PUTROOTFH, GETFH,
and SEQUENCE on the proxy server &lt;-&gt; metadata server session without applying
the metadata server's export-rule filtering that would normally gate
those names.  This is strictly a structural privilege:
it permits the proxy server to see that paths exist and to obtain
their filehandles, but grants no data access.  All
operations that carry or require data authorization
(OPEN, READ, WRITE, LAYOUTGET, GETATTR of privileged
attributes, etc.) <bcp14>MUST</bcp14> still run under the rules of
<xref target="sec-credential-forwarding"/>: forwarded client
credentials for client-initiated operations, and proxy server
service identity only for control-plane operations.
</t>
            <t>A deployment that grants this privilege discloses the
metadata server's namespace shape to the proxy server's service identity --
specifically, names that the proxy server's source address would
not be able to see through the metadata server's normal export
filtering.  Deployments <bcp14>SHOULD</bcp14> audit traversal compounds
on registered-proxy server sessions so the disclosure is
reviewable; the metadata server <bcp14>SHOULD</bcp14> log each LOOKUP / GETFH that
benefits from the bypass.</t>
          </dd>
          <dt>Do not grant the privilege:</dt>
          <dd>
            <t>The proxy server is required to translate every client-originated
LOOKUP into a separate LOOKUP against the metadata server under the
forwarding client's credentials, caching only what the
client's credentials authorized the metadata server to return.  This
eliminates the namespace-shape disclosure but costs an
extra metadata server round-trip per client LOOKUP-miss and leaves
the proxy server unable to pre-discover exports.</t>
          </dd>
        </dl>
        <t>This document does not normatively prefer one approach over
the other.  Implementations <bcp14>SHOULD</bcp14> document which they use;
deployment guidance for the common combined data server+proxy server case is
that granting the privilege is the expected choice,
acceptable given the proxy server is already a trusted control-plane
peer of the metadata server.</t>
        <t>The traversal privilege is distinct from and narrower than
root_squash bypass.  A forwarded-uid-0 client operation
(OPEN, READ, etc.), even when the privilege is granted, is
still subject to normal root_squash handling on the proxy server's
source-address rule at the metadata server; the privilege applies only
to the six ops enumerated above.</t>
      </section>
      <section anchor="sec-ps-side-policy-enforcement">
        <name>Proxy-server-side Policy Enforcement (informative)</name>
        <t>A proxy server implementation <bcp14>MAY</bcp14> perform per-client export-rule
enforcement locally, rejecting operations the metadata server would also
reject before forwarding them.  This is a performance
optimization: it keeps bad requests off the proxy server &lt;-&gt; metadata server wire and
lets the proxy server return NFS4ERR_WRONGSEC / NFS4ERR_ACCESS without
paying a round-trip.</t>
        <t>Local enforcement is not a security boundary.  Rule 3 of
<xref target="sec-credential-forwarding"/> names the metadata server as the authority
for every client-initiated file operation.  A proxy server that performs
local enforcement is checking its own cached copy of the metadata server's
per-client rules; if the copy is stale, wrong, or absent, the
proxy server <bcp14>MUST</bcp14> forward the operation and let the metadata server decide.  A proxy server
implementation that declines to perform local enforcement is
conformant with this specification.</t>
        <t>Deployments that want local enforcement need a mechanism for
the proxy server to acquire the metadata server's per-export client-rule list.  This
document does not standardize such a mechanism;
implementation-specific options include a control-plane
probe-protocol
extension, out-of-band admin distribution, or a future revision
of this specification.  Any such mechanism <bcp14>MUST</bcp14> limit
distribution to proxy servers that the deployment has authorized
(the rules are sensitive deployment policy) and <bcp14>MUST</bcp14>
support a refresh path so proxy servers see rule changes within a
bounded time.</t>
      </section>
    </section>
    <section removeInRFC="true" anchor="sec-implementations">
      <name>Implementations</name>
      <t>This section records the status of known implementations of
the protocol defined by this specification at the time of
posting of this Internet-Draft, and is based on a proposal
described in <xref target="RFC7942"/>.  The description of
implementations in this section is intended to assist the
IETF in its decision processes in progressing drafts to
RFCs.  Please note that the listing of any individual
implementation here does not imply endorsement by the IETF.
Furthermore, no effort has been spent to verify the
information presented here that was supplied by IETF
contributors.  This is not intended as, and must not be
construed to be, a catalog of available implementations or
their features.  Readers are advised to note that other
implementations may exist.</t>
      <section anchor="reffs">
        <name>reffs</name>
        <t>reffs is an open-source NFSv4.2 server, metadata server, and erasure-coding
client.  The reffs source ships a metadata server, a Proxy Server, and a
multi-encoding client harness used as the working implementation
for this draft.  reffs is licensed AGPL-3.0-or-later.</t>
        <t>reffs implements, at the time of writing:</t>
        <ul spacing="normal">
          <li>
            <t>The proxy listener model (one process serving its native NFS
port and a per-<tt>[[proxy_mds]]</tt> proxy server port from independent
superblock namespaces, see <xref target="sec-design-session"/>).</t>
          </li>
          <li>
            <t><tt>PROXY_REGISTRATION</tt> over RPCSEC_GSS-class auth, presently
exercised via mutually-authenticated RPC-over-TLS (<xref target="RFC9289"/>)
with a client-cert SHA-256 fingerprint allowlist.  AUTH_SYS
over plain TCP is rejected with <tt>NFS4ERR_PERM</tt> per
<xref target="sec-security"/>.</t>
          </li>
          <li>
            <t><tt>PROXY_PROGRESS</tt> lease renewal and the empty-assignment idle
path used by every steady-state proxy server poll.</t>
          </li>
          <li>
            <t>Forwarding of LOOKUP, OPEN, READ, WRITE, GETATTR, CLOSE,
LAYOUTGET, GETDEVICEINFO, LAYOUTRETURN, LAYOUTERROR through
the proxy server to the upstream metadata server using the end-client's credentials.</t>
          </li>
        </ul>
        <t>Forward-channel ops not yet exercised end-to-end in the public
implementation include <tt>PROXY_DONE</tt> / <tt>PROXY_CANCEL</tt>, which are
issued only after a <tt>PROXY_PROGRESS</tt> reply that delivers a
<tt>proxy_assignment4</tt>.  The metadata-server-driven assignment model (move,
repair) is wire-implemented but the only assignment kind
exercised by the published demo is the implicit no-assignment
heartbeat that every PROXY_PROGRESS produces.</t>
      </section>
      <section anchor="demonstration">
        <name>Demonstration</name>
        <t>A reproducible demonstration of cross-proxy proxying, exercising
the layout-passthrough data path through proxy server A and proxy server B against a
shared metadata server + 6 data servers, lives in the reffs source under
<tt>deploy/sanity/</tt>.  The demo does not exercise migration,
repair, or any <tt>proxy_assignment4</tt>; its purpose is to show that
a client's encoding-encoded write through one proxy server is recoverable
byte-for-byte through a peer proxy server that shares the same metadata server.</t>
        <t>The matrix:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Path</th>
              <th align="left">Layout</th>
              <th align="left">Encoding</th>
              <th align="left">Result</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">/ffv1-csm</td>
              <td align="left">FF v1</td>
              <td align="left">plain mirror</td>
              <td align="left">PASS</td>
            </tr>
            <tr>
              <td align="left">/ffv1-stripes</td>
              <td align="left">FF v1</td>
              <td align="left">stripe k=6, m=0</td>
              <td align="left">PASS</td>
            </tr>
            <tr>
              <td align="left">/ffv2-csm</td>
              <td align="left">FF v2</td>
              <td align="left">plain mirror, CHUNK</td>
              <td align="left">PASS</td>
            </tr>
            <tr>
              <td align="left">/ffv2-rs</td>
              <td align="left">FF v2</td>
              <td align="left">RS(4,2), CHUNK</td>
              <td align="left">PASS</td>
            </tr>
            <tr>
              <td align="left">/ffv2-mj</td>
              <td align="left">FF v2</td>
              <td align="left">Mojette systematic (4,2)</td>
              <td align="left">PASS</td>
            </tr>
          </tbody>
        </table>
        <t>For each row the client opens
<tt>&lt;path&gt;/codec_&lt;label&gt;.bin</tt> through the proxy server A proxy listener,
performs an encoding-encoded write of a 96 KiB random payload, then
opens the same filehandle through the proxy server B proxy listener and
reads it back.  The client's <tt>cmp(1)</tt> of the original payload
and the proxy server B-served payload returns no differences in all rows of
rows.</t>
        <t>The demo is published with the reffs source; the matrix above
is the empirical record from the most recent published run on
the editors' infrastructure.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document requires no new IANA registries.  It does consume the
following NFSv4.2 code points, assigned via the extension process of
<xref target="RFC8178"/>.  They are contiguous with, and shift with, the range
assigned by <xref target="I-D.haynes-nfsv4-flexfiles-v2"/>:</t>
      <ul spacing="normal">
        <li>
          <t>Operations 96-99: PROXY_REGISTRATION, PROXY_PROGRESS, PROXY_DONE,
PROXY_CANCEL (Section 6).</t>
        </li>
        <li>
          <t>proxy_stateid4, a new server-issued stateid type (Section 6.1).</t>
        </li>
      </ul>
      <t>This document requests IANA to register one new bit in the
"EXCHGID4<em>FLAG</em>*" flag space for the ExchangeID operation from
<xref section="18.35.3" sectionFormat="of" target="RFC8881"/>.  The requested value is <tt>0x00200000</tt>,
outside the existing MASK_PNFS block (0x00070000) and clear of the bit
<xref target="I-D.haynes-nfsv4-flexfiles-v2"/> requests; IANA <bcp14>MAY</bcp14> assign a
different value at its discretion, in which case the numeric value in
<xref target="fig-exchgid-flag-use-proxy-server"/> and its uses throughout this
document are updated to match the assignment.</t>
      <table anchor="tbl_exchgid_flags_proxy">
        <name>EXCHGID4 Flag Assignment</name>
        <thead>
          <tr>
            <th align="left">Flag Name</th>
            <th align="left">Value</th>
            <th align="left">RFC</th>
            <th align="left">Reference</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">EXCHGID4_FLAG_USE_PROXY_SERVER</td>
            <td align="left">0x00200000</td>
            <td align="left">RFCTBD11</td>
            <td align="left">
              <xref target="fig-exchgid-flag-use-proxy-server"/>, this doc</td>
          </tr>
        </tbody>
      </table>
    </section>
    <section anchor="interaction">
      <name>Interaction with the Base Specification</name>
      <t>The mechanism this document specifies is built on top of
four constructs that <xref target="I-D.haynes-nfsv4-flexfiles-v2"/>
defines: the chunk_guard4 compare-and-swap (CAS) primitive, the
CHUNK_LOCK mechanism, the CB_CHUNK_REPAIR per-chunk repair
callback, and the TRUST_STATEID / REVOKE_STATEID control
plane.  None of these are modified or extended here; this
section states how each is used (or explicitly excluded)
when a proxy server is active on a file.  Two of the four
(chunk_guard4, CHUNK_LOCK) describe what the proxy server does on the
data server side of the mechanism; the other two (CB_CHUNK_REPAIR,
TRUST_STATEID) describe how metadata-server-side bookkeeping composes
with a live proxy operation.</t>
      <section anchor="chunkguard4">
        <name>chunk_guard4</name>
        <t>The proxy server enforces chunk_guard4 CAS on the destination mirror
set on behalf of clients.  The proxy server <bcp14>MAY</bcp14> use the same guard
values client writes carry through it, or generate fresh
guard values on the destination side, provided uniqueness on
the destination is preserved.</t>
      </section>
      <section anchor="chunklock">
        <name>CHUNK_LOCK</name>
        <t>If a client holds a chunk lock on a file when a proxy
operation activates, the lock follows the file: the proxy server takes
ownership of the lock on the destination mirror set, and the
metadata-server-escrow semantics (the Reserved cg_client_id Value
subsection of <xref target="I-D.haynes-nfsv4-flexfiles-v2"/>) apply if the
original holder becomes unreachable during the operation.</t>
      </section>
      <section anchor="cbchunkrepair">
        <name>CB_CHUNK_REPAIR</name>
        <t>Per-chunk CB_CHUNK_REPAIR and an in-flight proxy <tt>PROXY_OP_MOVE</tt>
or <tt>PROXY_OP_REPAIR</tt> migration on the same file are mutually exclusive at
any given time.  The metadata server <bcp14>MUST NOT</bcp14> issue CB_CHUNK_REPAIR for a
file currently in PROXY_ACTIVE; the proxy server handles any mid-move
repair internally.  If the metadata server decides a proxied file also
needs per-chunk repair after the proxy operation completes,
it issues CB_CHUNK_REPAIR against the post-move layout.</t>
      </section>
      <section anchor="truststateid-revokestateid">
        <name>TRUST_STATEID / REVOKE_STATEID</name>
        <t>When the metadata server selects a proxy server for a proxy operation, it issues
TRUST_STATEID on the proxy server for every client layout stateid that
will route through the proxy server during PROXY_ACTIVE.  On proxy server
retirement the metadata server issues REVOKE_STATEID on the retired proxy server.
This is the same mechanism <xref target="I-D.haynes-nfsv4-flexfiles-v2"/>
defines for any data server in a tightly coupled deployment.</t>
      </section>
    </section>
    <section removeInRFC="true" anchor="sec-open-questions">
      <name>Open Questions</name>
      <t>The design is substantially complete but still has open
points that need Working Group input or internal agreement
before the first submission.  They fall into three rough
categories: wire-level details that need to be nailed down
(richer capability advertising),
architectural choices that affect
the mechanism's shape (multiple concurrent proxies per file,
transitive proxy, capability-scoped EXCHGID flag), and
policy questions whose answers bind deployment choices more
than wire behavior (metadata server operation-state persistence,
RPCSEC_GSSv3 requirement level, DEVICEID_REGISTRATION
generalization).  Each item below briefly states the
question and the candidate resolutions; none of them block
this document's core mechanism but each may reshape a detail
of it.</t>
      <dl>
        <dt>Multiple concurrent proxies per file:</dt>
        <dd>
          <t>The design assumes one proxy per file per operation.
Should two proxies be allowed to pipeline a large file
(proxy A drives the first 1 TB, proxy B drives the
next)?  The motivating case is a multi-terabyte move
where a single proxy's bandwidth is the bottleneck;
parallelizing across proxies would shorten the operation
proportionally.  The cost is state-machine complexity
(two operation ids to track, partial-completion
bookkeeping, range ownership between proxies) and layout
complexity (the client sees two proxy server entries in
ffv2s_data_servers and needs routing rules between them).
One-proxy-per-file keeps the mechanism simple; if the
bandwidth case turns out to dominate in practice, a
follow-on extension can add parallelism later without
invalidating the single-proxy path.</t>
        </dd>
        <dt>Transitive proxy:</dt>
        <dd>
          <t>If a file in PROXY_ACTIVE needs a second move (e.g., a
data server maintenance window opens while a repair is already
running), what happens?  Queueing the second move
postpones the maintenance, which may not be acceptable
if the maintenance window is hard.  Aborting the first
move wastes the repair work already done and puts the
file back into a degraded state.  Allowing a proxy to
act as the source for another proxy (a "chained" proxy
setup) preserves the repair progress but doubles the
state-machine work and introduces failure-mode compounds
that the current design does not cover.  The right
answer probably depends on operator priorities and may
need to be a configurable metadata server policy rather than a
protocol rule.</t>
        </dd>
        <dt>Migration-state retention across restart:</dt>
        <dd>
          <t>The recovery model leaves retention of both the
registration table and in-flight migration state across a
metadata server restart to the implementation; a metadata
server that retains neither is conformant, and a
reconnecting proxy server whose prior
<tt>prr_registration_id</tt> is unknown takes the fresh-ID retry
path in <xref target="sec-ps-recovery"/> step 2.  Should the document
nonetheless add a <bcp14>SHOULD</bcp14> recommending retention of both,
so that a reboot does not discard the progress of a large
move?  Production deployments would likely want it; it is
a quality-of-implementation recommendation only, with no
effect on interoperability.</t>
        </dd>
        <dt>Registration as a capability-scoped authority:</dt>
        <dd>
          <t>Resolved in this revision: PROXY_REGISTRATION requires the
session to present <tt>EXCHGID4_FLAG_USE_PROXY_SERVER</tt>
(<xref target="sec-new-ops"/>), distinguishing a proxy-server session from
both regular pNFS-client and regular non-pNFS-client sessions.
The registration itself remains the per-op capability
declaration (encoding set, lease); the EXCHGID4 flag scopes
the session that carries it.</t>
        </dd>
        <dt>Richer capability advertising:</dt>
        <dd>
          <t>pra_encodings covers the transformation classes that matter
for move / repair.  Features that are
implementation-internal (encryption, compression,
alignment normalization) do not need to be advertised
because they do not affect the wire contract.  Features
that DO affect the wire (e.g., support for some future
sparse-read or TRIM op) would warrant a richer
capability descriptor.  Worth revisiting when those ops
are defined.</t>
        </dd>
        <dt>RPCSEC_GSSv3 for translating-proxy credential forwarding:</dt>
        <dd>
          <t>Credential forwarding under AUTH_SYS is weak (uid
spoofable, no integrity protection).  RPCSEC_GSSv3
structured privilege assertion (<xref section="2.5.2" sectionFormat="of" target="RFC7861"/>) is
the natural strong-authentication mechanism, but its deployment
base in the NFSv4 community is narrow.  Should the draft REQUIRE
GSSv3 for translating proxies, RECOMMEND it, or leave it as
implementation-optional?  The answer likely depends on how
aggressively the working group wants to push GSSv3 adoption as a
side effect of standardizing this mechanism.</t>
        </dd>
        <dt>DEVICEID_REGISTRATION generalization:</dt>
        <dd>
          <t>PROXY_REGISTRATION in this document is a proxy-specific
capability-advertisement op: a data server opens a session to the
metadata server and declares that it is proxy-capable, along with
encoding-set membership and a lease.
</t>
          <t>The same mechanism has broader applicability as a
generic data server -&gt; metadata server capability advertisement -- a
DEVICEID_REGISTRATION op whose payload can carry:</t>
          <ul spacing="normal">
            <li>
              <t>Fault-zone coordinates (building, floor, room, rack,
power domain, network domain, cooling domain).  An
admin who needs to power down a rack can drive the
metadata server to recall all layouts referencing data servers in that
zone and evacuate files via <tt>PROXY_OP_MOVE</tt> assignments
before the outage.</t>
            </li>
            <li>
              <t>Storage media type (SSD / HDD / tape / cloud tier),
for layout-policy decisions.</t>
            </li>
            <li>
              <t>Geographic location, for data-locality policy.</t>
            </li>
            <li>
              <t>Transport security profile (TLS-capable, required
mutual-TLS cert fingerprint).</t>
            </li>
            <li>
              <t>Performance tier labels, for admin-assigned QoS.</t>
            </li>
            <li>
              <t>Encryption-at-rest and compression-at-rest flags.</t>
            </li>
            <li>
              <t>Scheduled maintenance windows, so the metadata server can
preemptively drain a data server before a planned outage.</t>
            </li>
          </ul>
          <t>Under this framing, PROXY_REGISTRATION is one arm of a
generic DEVICEID_REGISTRATION op: the proxy-capability
arm.  If the working group prefers the generalization, the op in
this document re-homes as a specialization of
DEVICEID_REGISTRATION, keeping its wire shape for the
proxy arm and adding typed entries for the other
capability classes.  The broader op may land in
<xref target="I-D.haynes-nfsv4-flexfiles-v2"/>, in a dedicated draft, or as
an extension of this document; settlement of that scoping
question is the open item.</t>
          <t>The op direction (data server -&gt; metadata server) is the same for both
specialized PROXY_REGISTRATION and generalized
DEVICEID_REGISTRATION; that direction does not today
exist as a session in the tight-coupling control plane of
<xref target="I-D.haynes-nfsv4-flexfiles-v2"/> (which runs metadata server -&gt;
data server).  A resolution of this item also settles whether
the proxy-server draft
introduces a new data-server-initiated session or whether the
generalized version does.</t>
        </dd>
      </dl>
    </section>
    <section removeInRFC="true" anchor="deferred">
      <name>Deferred</name>
      <t>The items below are explicit protocol extensions identified
during design that this revision does not specify.  They
overlap with Out of Scope in <xref target="sec-scope-out"/>; where Out of
Scope frames a deferral in the context of what the mechanism
does do, this list reads as a standalone punch list of
candidate follow-on work items, useful to a future revision's
planner.  A future editorial pass <bcp14>MAY</bcp14> merge this list into
Out of Scope before submission.</t>
      <ul spacing="normal">
        <li>
          <t>Partial-range <tt>PROXY_OP_MOVE</tt> assignments.</t>
        </li>
        <li>
          <t>Multi-proxy pipelines for very large files.</t>
        </li>
        <li>
          <t>Automated proxy selection with load balancing.</t>
        </li>
        <li>
          <t>Proxy-failure predicate (when should the metadata server pre-emptively
replace a slow proxy?).</t>
        </li>
        <li>
          <t>Integration with server-side copy (<xref section="4" sectionFormat="of" target="RFC7862"/>)
as an alternative for single-file moves within one
namespace.</t>
        </li>
        <li>
          <t>Delta-journaling during a move for online moves without
dual-writes.</t>
        </li>
      </ul>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC7861">
          <front>
            <title>Remote Procedure Call (RPC) Security Version 3</title>
            <author fullname="A. Adamson" initials="A." surname="Adamson"/>
            <author fullname="N. Williams" initials="N." surname="Williams"/>
            <date month="November" year="2016"/>
            <abstract>
              <t>This document specifies version 3 of the Remote Procedure Call (RPC) security protocol (RPCSEC_GSS). This protocol provides support for multi-principal authentication of client hosts and user principals to a server (constructed by generic composition), security label assertions for multi-level security and type enforcement, structured privilege assertions, and channel bindings. This document updates RFC 5403.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7861"/>
          <seriesInfo name="DOI" value="10.17487/RFC7861"/>
        </reference>
        <reference anchor="RFC7863">
          <front>
            <title>Network File System (NFS) Version 4 Minor Version 2 External Data Representation Standard (XDR) Description</title>
            <author fullname="T. Haynes" initials="T." surname="Haynes"/>
            <date month="November" year="2016"/>
            <abstract>
              <t>This document provides the External Data Representation (XDR) description for NFS version 4 minor version 2.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7863"/>
          <seriesInfo name="DOI" value="10.17487/RFC7863"/>
        </reference>
        <reference anchor="RFC8178">
          <front>
            <title>Rules for NFSv4 Extensions and Minor Versions</title>
            <author fullname="D. Noveck" initials="D." surname="Noveck"/>
            <date month="July" year="2017"/>
            <abstract>
              <t>This document describes the rules relating to the extension of the NFSv4 family of protocols. It covers the creation of minor versions, the addition of optional features to existing minor versions, and the correction of flaws in features already published as Proposed Standards. The rules relating to the construction of minor versions and the interaction of minor version implementations that appear in this document supersede the minor versioning rules in RFC 5661 and other RFCs defining minor versions.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8178"/>
          <seriesInfo name="DOI" value="10.17487/RFC8178"/>
        </reference>
        <reference anchor="RFC8881">
          <front>
            <title>Network File System (NFS) Version 4 Minor Version 1 Protocol</title>
            <author fullname="D. Noveck" initials="D." role="editor" surname="Noveck"/>
            <author fullname="C. Lever" initials="C." surname="Lever"/>
            <date month="August" year="2020"/>
            <abstract>
              <t>This document describes the Network File System (NFS) version 4 minor version 1, including features retained from the base protocol (NFS version 4 minor version 0, which is specified in RFC 7530) and protocol extensions made subsequently. The later minor version has no dependencies on NFS version 4 minor version 0, and is considered a separate protocol.</t>
              <t>This document obsoletes RFC 5661. It substantially revises the treatment of features relating to multi-server namespace, superseding the description of those features appearing in RFC 5661.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8881"/>
          <seriesInfo name="DOI" value="10.17487/RFC8881"/>
        </reference>
        <reference anchor="RFC9289">
          <front>
            <title>Towards Remote Procedure Call Encryption by Default</title>
            <author fullname="T. Myklebust" initials="T." surname="Myklebust"/>
            <author fullname="C. Lever" initials="C." role="editor" surname="Lever"/>
            <date month="September" year="2022"/>
            <abstract>
              <t>This document describes a mechanism that, through the use of opportunistic Transport Layer Security (TLS), enables encryption of Remote Procedure Call (RPC) transactions while they are in transit. The proposed mechanism interoperates with Open Network Computing (ONC) RPC implementations that do not support it. This document updates RFC 5531.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9289"/>
          <seriesInfo name="DOI" value="10.17487/RFC9289"/>
        </reference>
        <reference anchor="I-D.haynes-nfsv4-flexfiles-v2">
          <front>
            <title>Parallel NFS (pNFS) Flexible File Layout Version 2</title>
            <author fullname="Thomas Haynes" initials="T." surname="Haynes">
              <organization>Hammerspace</organization>
            </author>
            <date day="24" month="July" year="2026"/>
            <abstract>
              <t>   Parallel NFS (pNFS) allows a separation between the metadata (onto a
   metadata server) and data (onto a storage device) for a file.  The
   Flexible File Version 2 Layout Type is defined in this document as an
   extension to pNFS that allows the use of storage devices that require
   only a limited degree of interaction with the metadata server and use
   already-existing protocols.  Data protection is also added to provide
   integrity.  Both Client-side mirroring and the erasure coding
   algorithms are used for data protection.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-haynes-nfsv4-flexfiles-v2-07"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC1813" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.1813.xml">
          <front>
            <title>NFS Version 3 Protocol Specification</title>
            <author fullname="B. Callaghan" initials="B." surname="Callaghan"/>
            <author fullname="B. Pawlowski" initials="B." surname="Pawlowski"/>
            <author fullname="P. Staubach" initials="P." surname="Staubach"/>
            <date month="June" year="1995"/>
            <abstract>
              <t>This paper describes the NFS version 3 protocol. This paper is provided so that people can write compatible implementations. This memo provides information for the Internet community. This memo does not specify an Internet standard of any kind.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="1813"/>
          <seriesInfo name="DOI" value="10.17487/RFC1813"/>
        </reference>
        <reference anchor="RFC7862">
          <front>
            <title>Network File System (NFS) Version 4 Minor Version 2 Protocol</title>
            <author fullname="T. Haynes" initials="T." surname="Haynes"/>
            <date month="November" year="2016"/>
            <abstract>
              <t>This document describes NFS version 4 minor version 2; it describes the protocol extensions made from NFS version 4 minor version 1. Major extensions introduced in NFS version 4 minor version 2 include the following: Server-Side Copy, Application Input/Output (I/O) Advise, Space Reservations, Sparse Files, Application Data Blocks, and Labeled NFS.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7862"/>
          <seriesInfo name="DOI" value="10.17487/RFC7862"/>
        </reference>
        <reference anchor="RFC8435">
          <front>
            <title>Parallel NFS (pNFS) Flexible File Layout</title>
            <author fullname="B. Halevy" initials="B." surname="Halevy"/>
            <author fullname="T. Haynes" initials="T." surname="Haynes"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>Parallel NFS (pNFS) allows a separation between the metadata (onto a metadata server) and data (onto a storage device) for a file. The flexible file layout type is defined in this document as an extension to pNFS that allows the use of storage devices that require only a limited degree of interaction with the metadata server and use already-existing protocols. Client-side mirroring is also added to provide replication of files.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8435"/>
          <seriesInfo name="DOI" value="10.17487/RFC8435"/>
        </reference>
        <reference anchor="RFC7942">
          <front>
            <title>Improving Awareness of Running Code: The Implementation Status Section</title>
            <author fullname="Y. Sheffer" initials="Y." surname="Sheffer"/>
            <author fullname="A. Farrel" initials="A." surname="Farrel"/>
            <date month="July" year="2016"/>
            <abstract>
              <t>This document describes a simple process that allows authors of Internet-Drafts to record the status of known implementations by including an Implementation Status section. This will allow reviewers and working groups to assign due consideration to documents that have the benefit of running code, which may serve as evidence of valuable experimentation and feedback that have made the implemented protocols more mature.</t>
              <t>This process is not mandatory. Authors of Internet-Drafts are encouraged to consider using the process for their documents, and working groups are invited to think about applying the process to all of their protocol specifications. This document obsoletes RFC 6982, advancing it to a Best Current Practice.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="205"/>
          <seriesInfo name="RFC" value="7942"/>
          <seriesInfo name="DOI" value="10.17487/RFC7942"/>
        </reference>
      </references>
    </references>
    <?line 3350?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>David Flynn and Trond Myklebust shaped the proxy-server
architecture, in particular the split between proxy
registration and metadata-server-issued directives.</t>
      <t>Sorin Faibish reviewed the document.</t>
      <t>Chris Inacio, Brian Pawlowski, Chuck Lever, and Gorry
Fairhurst guided this process.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAHsQdmoAA8S963Yjx5Eu+j+fok77h4gZgK2+WGqRtvemmuwWj9mXIdmy
vWd5EQWgQJYbQMGoAilaW/Ms51nOk52ILyLyUlUgWx6vfbTWjJtkXbIyIyPj
8sUXo9HINWWzKA6yj5vqp/vR8aa8LVbZRbG5LTbZvNpkbxbFT+VkUWRvykVR
Zz8Wm7qsVtlzl08mm+L2IHvz5va53K23uVk1XeVLeuZsk8+b0U1+vyrq0Wpe
374czelxc37S6Pb5aI131rhr9PVLN82b4rra3B9kdTNzM/rpIPv5+Ojy5Bc3
rVZ1saq39UHWbLaFK9cb/Ktunn/99Xdf03A2RX6QvS1WxSZfuLtq8/l6U23X
B9n7ouGfMP7s4r5uiqX/ipfuc3FPf50dZKerptisioamgAbtXN3kq9lVvqhW
NIj7onbr8iD7z6aaDrO62jSbYl7Tv+6X8g/65GW+Xper62E2rZbLYtXUf3WO
5nJbHLgs+6KxZFlzv6a3/YkuoSdlb/km+u0yLxcHGebvf5ZFM9+vNtf063wz
vTnIbppmXR88fcoX8W9o/fbtoqf8i6eTTXVXF09x/1MeS9ncbCcHGV81uruW
hXm6c2HojgWtRN2EdyV37svz9stq9zOe/hpJ2L9plgvn8m1zU21o8kY0giwr
V7T0l/vZD3gGfiVCdnlTLfM6/j19eb4q/5E3NK0H9Adajk29zqcF/lrIdC6q
65v7zf+85p/2acmcW1WbJd1ziwU7f/P621ffPAv/fKH/fPXs21f2z1ev7ILv
nr/6jv95Ojre3/mVB86Vq3nrLc9ePXsR3vLcHv3yxW/p8tFolOWTutnkUxLJ
jzmJ9qJYZO/fXGR7a/r/g+yOJj9rboqd+5QW777aNo5FK6u36zUJb51NFyWJ
6KguZ0VGG6bebgqS2xlLHYl9tqb9OL3Zrj5nm2Kdlxs3IcEtSDHIfTUuov2Z
Z7Jk9X5G61DWvA+2LPxZ8VNTrGY1DS1vHOSyKaYNvwYjzjOsuN6ebSpWQTm9
7bqkTbEpeAgketUc37Ysmjx6Gx6aravFou79M00xFECW13V5vVr6EU/zzaYs
cNMyo0nJaHqX1S2+OuNVyuabiv6yKpzMWtZUdGNF12+GNDhWQqRzpo3ccXdT
8S3+PprF25Kf5uqbfDMjtUD6k9ZuVdMG4ltsFouVzHUNDWtziq+a5it6n1vn
m6aclmvaeCT5+Ep+z1c1CT0Lj39Etleupost/kkCcfvC6eMGtCRHi0WW6Nim
Gtlk6a9o1Un9lStslqzEiApaexpGQbuEXuza07spaB1XddaZ4nK1KFd+vJui
XrPSdjyH6TDKVdmU9Gmz7OP5hz//5Yr+/9vzk4sLrOkQS8VPSEWkgOTSQbBc
LwqM9rbMed2iAevzjj+8P6HPf1/RdC4Wk3z62VUk0vhGkoQND+7v25LFjBeg
8y76gRR9tdiXHUgLUly95//XVFfnRT4jgXcO8l6yYNEXz2jdZ9t8QTIwWZY1
th72SEXiRvfTC0kTTJuWbvenGvZPkT05mrDU4dHHupWe0Kim+N58UtHK3+Qi
9dPtZkN/drOynm7ljThuhqqu6ZUrGimOJB5KXW0304L03hTzoN+2LGezReHc
b/gA3FSzLV7FX/eoSsFp5fZ+/vlBpffLLwOaH3l0kSge11I8vBSs1DDavKOD
/Kq4vdffX73+4dP7P16dn3w8Oj0fyNYhqejXBzNaaZr6fOVIjfLmkUHw5o72
dLyKs3yZX5N04P2yOKTGlgWLWVkvednr7XxOO5SfwwOXMdasE2rSs1OSNwgH
LddqNt8usmru5Gm8P1TbYNi8nhh9TmtGqidbhCHu80JsCv6RNhpNHylE2XY0
bbQE0N8Q3/ZkLatZQfJ7CcWxoSeXteirEd4sVx2IIOU1Nu3dTTm9IcVSba9v
XKzcaYg0ojkdlMVMdW/0uqAUSTbuqu1i5nR30QatSyi+gh5zL7MJpejftqri
z6VBuvyWDRmWOlqeGZujqk3wWfRu2tG6W2p+94y/zM441rUldvmBzfGSTERW
8kG3m/heFxVJCo2rqZwqeZHBalFO7+mNec3qYm9ZXm9Ef0OTrYq7oH15C/AX
0SePluVmU/F+GwzxHLIsyKZc5atpER5W3ObTba4HCE+yUyHNb0ix8PrOCjYg
RYcMMFv8sGJ1W24qKFqST32c29PTyw4WTADrSdK0pB/K5p53DbYiP0gvc/wL
lkuaHlaOfFAPdE6bm3KDKQ2faAcYG1O5s70TDqvsyw8rcjfCcSVCgUNL118U
Vb66p91wndMa8CzSYbHMYfPcvkze7nVrySfCUn7vX50sEb+4bko6DldFwVYJ
7/x8htfd0TQV/s59VezekKnXxbScs9XQY7NAdGYzOupY8/DOb2S75rxZ1dKp
aRQsiKY9DjoHDp9OfDDRj6LIaXx9ioyHayYS6RE+DfN1PikXJPP0Pj4P5QA8
P3l7enF5fnR5+uH9Yfd8o1+sgv3UOeC3POL20cxC2DnxWf6KoW7OwdDJpu4b
uhkNqY3AY/CGQnegzgw23q5FTo8OL5czjX7I6StSo8AFKyDbo2HTublpotl5
ffT+9cmZGUhqYz5iJ7mH7KSeKY4OftGFueOt5g0VM0z4LlIvSx6MacENf6oX
uLKYYcNmRQkVNSFFWpEWECu0+2Icdot72kuwTWTUm3vHJ6tcI3bpzYYVPb+E
/6I6UY6veOFIJbffQWP90w2PKM9UN8qU0KLia3g3qMbHBzl6E1kkLLDZ6dMP
/tXt5x6qpusqHhrxanHv8qxH++D6sIEx8/tiwMzNgMEfbp/ZV5LNoj4WWyc0
BDr2sVwZvH6y3ct/0FHnd6yDOvfHQG46xk+aHOb6ng17mBB12kkFTxYtHF9X
b6c3br0plyVrRXIPktlbFHOYJF6b4S8j1T9TtyShoK1DsyquDD5+gqOffUoa
b53PiwX9ebqp6tqlzwkeWsGbBjbXXHwhmkr/pUOa4Yq3P23lHEZDU83ye3yc
6rFJeX3N5iUfbptqnV3na3/+mPnm5DRdm8OKEwjhDn1hvmD9e09u4poFzk9E
ND37bJSey+4RbXOWr663ZJfJ4n4u7lkhkTZ/8u7TxeWTofxv9v4D/n1+8h+f
Ts9PjvnfFz8cnZ35fzi94uKHD5/OjsO/wp2vP7x7d/L+WG6m32bJr9yTd0d/
eSJn1ZMPH1nHHp09EZUWnxxso9F6TgqZqjWpQFqkvHa0BNNNOaEf6J7vX3/8
f/+fZy+zn3/+v0gmnz979t0vv+gPr559+5J+uCNtLW/jTaA/0vzSflivixzW
FE0zicS6JOOgxs6vb6q7VUaLwCfav/0nz8xfD7LfTabrZy//oL/gD05+aXOW
/BJz1v1N52aZxJ5f9bzGz2by+9ZMp+M9+kvys8179Mvf/Q8cLaNnr/7HHxwL
z3Exh6fJlpLoAzpuqjvolmKzFE+QtuhMTuplQVuAnfIZ34fVcY86NxykifXl
sH3y0Z9FTfB2ZwPR/pf+Tr9DpID+p9mU5EyNxEbO9ni/bWnsfDqpyzST0Kyo
OzVbnvIuGniP2WV6P6kxsmlUY2R7H2k+T9+/zZ5mb05pzk7/18kx/Zsn+vTy
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
iS19hKfLphvS71vqzeMPOAKWcAurSPNHq26FT6jc6xwFsEMof+U4DX3/KIS5
UGeq5FxVltdCJyHgM3AjCREF0Jj6NdzuUqL+KuA83DVrjqh9XtB9tR2WfZSE
o8pBySShHnwx62CGHgy/D5GTNROhCoD8ntxpVJ5Hjzjfcc7XBVZ+XIx699Ob
N9vnlhER1Cu2yIvgOV8AzRA5FuKDSDdRgGGikiHHB1+gjRN9w/4wH6YDw+qh
ikN+tWZ25duzBHIoFG+W/hfocPAQfUfnhA2SjXtXt0aSYVB2nDBBfN8gtjPz
4nKUooEPgJTgSCL63Hv6gP6imWUaFCLxN7RVYubOOD9ncLld4HWt6Kaa2uBC
y0ORkfDT5+fkNRd55Wpx+yJt3X3yW3IvhKnPLNldJfWVDKq29PZfxt7AKDn+
W9s+/men/O2Tnmp4vHx/LH8/kK6O7s33iEW/Pco4anVuL+dnKeFa8vO+vHf4
ucl7RzrUbkCiwdMRZgERYxfflozX0aekf+sfNviW3kvou7pBirugo01sDdDr
Nz7aoNOVqh1aYqHGF1WnZ7lsfopoqrYFfvZiaFa9X4y2WU8VtFYRqhD2U+3G
HJasg0Mlh2pL0SZ7wUJDQTY6ED8BYz+ySuwtwP4EuelHujfqb80AaKgVMmiS
bHyb52f7x4d7p4fnCmJmWDGLxCDvWuHtQn7rfLCegnpeWhZ5fp7d1n1VyAg7
rHFv4EGRT+zVTHvqxLhqaw1CKdH9YJv0VNC/YJUvy5jdje/CnV4NrJjs+phT
Ozz+AVHXoaVNGqHU4O4k4+qWjB/SiMVK4sVAm5y2awEOFnVXSL07BCHK6xTX
gaJbS8OWc2qrRWfOgLv0wRwy9spMEx3NjDDVqWVBvGNo9Xd9lnDCzV3IaK5F
eyHuEQh537//808fvMxdOWyHsp6QwQggJXIrLHHJBqcWjnS9eG2g3CeFph7B
vduhJaiPhi/zKUjn6E3MeW9UJAe+7D6wkQp8D4PJleSlS6OQ2Ndlw4pbo88t
bI8UsJYpy2xGrHZ2noiGNWSfRLYXXkUIT3tyc0MNNLDr3VYTP1pGKmilW5te
vdJIG6OJbtQrTOwij+uy3JtZgwxljJaVs3PWGDNZVHdRw3nKntYvcgd5JPbk
5cB0LoJDhbpZar20KpS7/mqVLQxu6hfZja9NKqBNJ54MiqsXU4V/rnFtQt1C
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
o9CxeE7B3zXnjqRIRYwnxbWCnSlWDLZucGQ++vFQPDSQQ221DBLfLY6lMrIP
BtxLHhlfk3EOs/B+gcT6bkpbuYPDQ1rK0+FkuOGPH7d0gB+kzSi9zTBnPUoz
6LlvDQqJXxMeuKXwxPpzBTMywqldfuvCclYLl8ihXbSTe6sbyhEvTpimLkJv
trV1pYqisamIx2bba4StWeoLLecNX5pHbHBquc7WDr0/i+uYPt1u2l8oJF2l
CJQ7OezBGDue3fg+K4llGu6oSWQvCZPvPctwM3h1SeimdnltmY5T+3MsbRvt
tLBPYz9isLm5nAdD/R/jP65relwfyJVW1u25kBxIls4mvuJEMl10+zPWT77a
2joymyNzUOtbqUNjQ8x5P/SpQPSP597ad26Kw2+HUOmG6/KjZA+jHa3LynPy
xN846idqsq+abumRl6HPejnJ5s6nw6M8HTw2vsIsUu6Q1S/O350WLz5Z60Pc
2OxDJfo2PJpEQxG9Wu5E/lgvy739N1wuC1EsSvJ3J/ppHi12FLRq93VQP/Bk
fz+b3m84yaTmucEE6vbybbajZL3o9X5gpa4QtoLE/TitXczCE2owqVsmbJR4
afABJFHhhkD7O8f5kB97J3XXtei9tbEuD+Hfzjdj5qvyrfHSDDNYoz7WQu8T
oFkyUjE6gVXAK/jkrc9ecWwhPSrK2LsxmOBrMYJeNVszYVBR00u100m03LZ3
dJQ+1HDIM/3TzjFezR+XWdcHbG2oiIweroXQ39dbDUshESB9HXzAt1zoTSCW
FQ+0Db//9mSO3QnR1UoQKM1ymfreYNn7xX1Ri2KdHsz52IhvnDgFRqUGZxYz
TUlRxFbBfMVOQq6338hGqrx7iRns2lvtFKk6LHYptUVehzqp7j0Z8r/jkgw7
OuMa8GOrUMhTx3XNS+ohNq9Q4s3VrDiOUoeN36vHA6J7L6ojOTthyKO9/X10
DaJs6f7oO/9HNiVxnqNb23vMyUQw4IncOeeza3t4eKUkoxAdb8VBP+sbR9rO
Po1zpXAP645yxgEjylSNdMCJiCJqGzEycv0NZeK1wh3OHH4LgDyUtZT3nNRX
ztDV/mRNqja64q3V1pOZpJ2CEqTNlJpPx83WT7DnSTL7HzXW/jSKElB///vx
q/3f/+F79MTJfLu/HONMHJ++0b/+4dkfftCWOUiNUtsstP0SKOiu85Vyw9yo
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
9l4cgnWy+nO9uOSSQ1/pGqhCAvDYihAeoPhX/LSewZfoPzz509742e++h3LZ
db1AKRl582l7p4ezFVnc1XxPsgyUp/sfJA0hCBqV700I6pX2WQbDEwX9Go2C
Qc/OtQ3TdDGsp4GE++NY1XXCUiVPLa5EZxrEqxRdT6GY6s/fdIpnRu2GbjFZ
njiTfNSM46jcf/P+5BCJ4jQdeXD416P9w6N3r96PEr3RUSpIpH0tmYSBxl6r
eYes9+0w4eLrKaDJyuVNUGyUz/HIRkRxVnQI6yTwbHmaoNWF24Z9g2/O0nkA
X5K/KmGGsj4kcHOomjKzPMaSOZhVFc0W71VJ4ytjg4u5bXutqD1UZbQAdJPD
kxgV0iK1Tagw0Fpx75DxJ8sLhhs4gzUpwvgYg9hK+KVAzXDbWj4D9wPVjhvX
aBEWN3W1WF7Uxm0g669H0i+14bozOa5bYX+gfXQBsHtz/oCMIJP4b7E2pU1U
lgz/l6BhfWnYep7l7BQex5XPwMtkf5Isu71Bbrp8GWHaOmfiwbvZW4zflN/3
IKtTdmJ43v/opBGs6rm4oE865/Uu75+ce8/Ijaz3KWwKIupbnc+RUZVn1smu
COSsFuhh5zS17nhjpapaFhHU0zea8l9qT+qi46KHRC+jyrwdPIHi4n5Zs88L
/1IGignmoobBKYcupvPNpqmcu7NoPrvj60v5AZMU/vlSvpGef/77oR29mX++
OAcEYj/QRx73/vmy5t/X/QwSy0+urj49HV+64ERv/+pV+emp/rtY+tsGTHG9
t/iw5xZ5WYZbIJyZuzHo3UL+uPz44/fOi/nx2w23eNZ/i2eZt3A2Gb1La2/h
7EvuFscnW89Hz7aTq9fd4vaX7C3etr/US7cWunt30lDjr+Q941sUJiNRLrTc
HnKHs644/w/szT8+wYK8PPsP53PW0z/uXDSz83ItOd1ez8sZFaEBZLZulRNk
+MP35Z+bl9AUnDjXZV7dT9tqwszFrFDgvi3XqMa89kVe9t0t5KyQuGV3LUDB
us39Fjy/vJ1vPd0+t/yLliOm9i6+uzF9jtj+if3K8yui6qjcLJdifoBGdgPN
WBD/r9vMLHiw6REhaTBWWsvhnpScp2FonNfRLEh0ozz0oXu2FcVIBtf+9qg1
amdpPWkQnHwNmIRzzw3TI5Hy3ru9IYliU80qNPFEfzrgUtRaD8cAgAPeSVkW
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

-->

</rfc>
