<?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-03" 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-03"/>
    <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 coding 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>Flex Files v1 (<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 (DS), metadata server (MDS)</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, coding 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_coding_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: either a migration (MOVE), a
repair (REPAIR), or an encoding translation.  Referred to
collectively 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"/>).</t>
        </dd>
        <dt>Migration:</dt>
        <dd>
          <t>A proxy operation of kind PROXY_OP_MOVE 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 FFv2 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
behaviours 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 surface 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 behaviour that does not surface on the
wire and therefore needs no standardisation.  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 CSM-style write 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"/>).
Delta-journaling mechanisms -- capturing writes against
an otherwise-offline source, replaying them on
completion, or maintaining reference integrity across
detached clones -- are a future extension, as is a
partial-range move that would move a byte range while
the rest of the file stays on the source.  The
whole-file two-layout commit covers every motivating
scenario the design currently has.</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 does not surface as new wire
protocol.</t>
          </dd>
          <dt>Server-side copy as an alternative path:</dt>
          <dd>
            <t>Integration with server-side copy (<xref target="RFC7862"/> Section 4)
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 surface 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 normalisation.  These are useful
motivating scenarios for the move/repair vocabulary but
do not require new protocol surface beyond what the
PROXY_PROGRESS / PROXY_DONE / PROXY_CANCEL fore-channel
set already provides, and so they are left to
implementation rather than standardised 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 MOVE
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 Flex Files 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 MOVE assignment carries the new layout's geometry
and coding 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 MOVE
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 REPAIR 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 Repair Client Selection
section of <xref target="I-D.haynes-nfsv4-flexfiles-v2"/>.</t>
      </section>
      <section anchor="tls-coverage-transition">
        <name>TLS Coverage Transition</name>
        <t>A file whose layout currently points at non-TLS-capable data servers
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 FHs
intact), the proxy reconciles old-to-new FHs 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 FHs change
as a side effect of migrating from <xref target="RFC1813"/> to
<xref target="RFC8881"/> semantics; a data-server-side format change that
invalidates existing FHs (for example, a transition from a
local POSIX store to an object store); and backend-opaque FH
migration where the data server's FH 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 / 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 surface).  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>
        <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 surface 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 target="RFC1813"/> S3.3.7
(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 target="RFC1813"/> S3.3.7 a
server may return a <em>stronger</em> 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 FFv2 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> /
<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 Flex Files
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 CSM 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>A source mirror <bcp14>MAY</bcp14> be an NFSv3 data server.  When it is, the proxy server
reads from it using NFSv3 semantics and writes the NFSv4.2
destination using CHUNK semantics; 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 \ {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 CSM 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 byte-shoveling 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)
  |                                 |
  | ---- OPEN(pa_file_fh) --------> | (PS picks up the work)
  | ---- 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(L3_stid, OK) -> | (terminal: commit L1 -> L2)
  | <--- NFS4_OK ------------------ |
  |                                 |
  |                                 | --- CB_LAYOUTRECALL --->
  |                                 |     (to clients holding L1)
  |                                 |
  |                                 | <-- LAYOUTRETURN ------
  |                                 |     (from each 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 MOVE
/ REPAIR assignment.  The proxy server, which has not yet OPEN'd
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 (92) is issued
once at session setup and on renewal.  PROXY_PROGRESS (93) 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 (94) commits or rolls back an individual migration when
the proxy server finishes it; PROXY_CANCEL (95) 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   = 92;
/// const OP_PROXY_PROGRESS       = 93;
/// const OP_PROXY_DONE           = 94;
/// const OP_PROXY_CANCEL         = 95;
]]></sourcecode>
      </figure>
      <t>Opcodes 92 through 95 continue the control-plane opcode range that
<xref target="I-D.haynes-nfsv4-flexfiles-v2"/> opens at 89 (TRUST_STATEID through
BULK_REVOKE_STATEID at 89-91).  The flow direction is opposite: 89-
91 are metadata-server-to-data-server, while 92-95 are proxy-server-
to-metadata-server.</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 is assigned outside the existing MASK_PNFS block
(0x00070000 in <xref target="RFC8881"/> S18.35.3) and adjacent to
<tt>EXCHGID4_FLAG_USE_ERASURE_DS</tt> (<tt>0x00100000</tt>,
<xref target="I-D.haynes-nfsv4-flexfiles-v2"/>) in the family's flag surface,
so that the erasure-DS bit and the proxy-server bit do not
collide.  Values are subject to IANA assignment on publication;
should IANA assign a different value, the numeric constant here
and its uses throughout this document are updated to match.</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 target="RFC8881"/> S3.3.12; 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; this is informative implementation guidance,
not a wire requirement.  One known implementation uses the
layout
<tt>{ uint16_t boot_seq | uint16_t reserved | uint64_t opaque }</tt>
where the opaque tail is <tt>getrandom(2)</tt> output.  The
<tt>reserved</tt> field is zero in this revision; implementations
<bcp14>MUST</bcp14> emit zero and <bcp14>MUST NOT</bcp14> reject non-zero on receipt (left
as a forward-compat slot for widening <tt>boot_seq</tt>).</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 echoes the minted value on
PROXY_DONE and PROXY_CANCEL.  The seqid slot is retained for
consistency with the general NFSv4 stateid shape in <xref target="RFC8881"/>
S8.2.4 and to permit future extensions; it does not participate in
NFS4ERR_OLD_STATEID checks in this revision.</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 92: 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[
/// struct PROXY_REGISTRATION4args {
///     ffv2_coding_type4  pra_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 MOVE / REPAIR work assignments delivered inline in
the response to PROXY_PROGRESS.</t>
          <t>The pra_encodings field lists the ffv2_coding_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"/>.  Section 8 of <xref target="RFC8178"/> specifies
that when a flag bit is used that is not known in the
specified minor version, NFS4ERR_INVAL is returned; Section
4.4.3 of <xref 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 Section 4.2 of
<xref 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 target="RFC8178"/> Section 4.4.3
signal that the metadata server does not recognize the bit.</t>
          <t>On success, the metadata server returns a prr_registration_id that
identifies this registration.  The proxy server uses it to renew the
registration before the granted lease expires (by re-issuing
PROXY_REGISTRATION with the same prr_registration_id) and
to identify itself across reconnects (see the squat-guard
text below).</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 target="RFC8881"/> S13.1 (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 re-presenting the same <tt>prr_registration_id</tt> it received on
the prior registration -- is not squatting and the metadata server
<bcp14>MUST</bcp14> accept it (refreshing the granted lease).</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.
A future revision <bcp14>MAY</bcp14> define a dedicated PROXY_REVOKE
operation if operational experience shows lease revocation
through silence is insufficient.</t>
        </section>
      </section>
      <section anchor="sec-PROXY_PROGRESS">
        <name>Operation 93: 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
/// };
///
/// 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<>;
/// };
///
/// struct PROXY_PROGRESS4resok {
///     uint32_t              ppr_lease_remaining_sec;
///     proxy_assignment4     ppr_assignments<>;
/// };
///
/// 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><strong>Heartbeat</strong>: 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><strong>Receive work assignments</strong>: 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 target="RFC8178"/> S4.4.3, <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;&gt;</tt>.  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
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 a
kind-specific opaque descriptor (<tt>pa_descriptor&lt;&gt;</tt>) for future
extensions (for example, a precomputed source-layout
descriptor so the proxy server can dial 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 MOVE / REPAIR assignment, the proxy server picks the work up
by issuing a normal NFSv4 OPEN+LAYOUTGET against <tt>pa_file_fh</tt>
(the L3 composite layout), shovels bytes per the kind-specific
protocol, 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 MOVE / REPAIR assignment is at-least-once and
idempotent, with the proxy server's <tt>OPEN(CLAIM_PROXY)</tt> on the
assignment's <tt>pa_file_fh</tt> serving as the implicit acknowledgment.
Concretely: after minting a <tt>proxy_stateid</tt> for an assignment, the
metadata server <bcp14>MUST</bcp14> include that same <tt>proxy_assignment4</tt> (with
the same <tt>pa_stateid</tt>, <tt>pa_file_fh</tt>, <tt>pa_source_deviceid</tt>,
<tt>pa_target_deviceid</tt>, and <tt>pa_descriptor</tt>) in every subsequent
PROXY_PROGRESS reply to the assigned proxy server until either the
proxy server presents that <tt>proxy_stateid</tt> in an <tt>OPEN(CLAIM_PROXY)</tt>
against <tt>pa_file_fh</tt> -- at which point the metadata server <bcp14>MUST</bcp14>
cease re-delivery and treat the assignment as acknowledged
(ASSIGNED -&gt; PROXY_ACTIVE, <xref target="sec-state-machine"/>) -- or the
assignment is rescinded via <tt>PROXY_OP_CANCEL_PRIOR</tt>, or the proxy
server's registration lease expires (at which point the migration
record is dropped per <xref target="sec-lost-migration-records"/>).  Because
re-delivery is idempotent (same <tt>proxy_stateid</tt> on each PROXY_PROGRESS
reply) and the eventual <tt>OPEN(CLAIM_PROXY)</tt> is idempotent by
<tt>(pa_file_fh, proxy_stateid)</tt>, a lost PROXY_PROGRESS reply, a
concurrent PROXY_PROGRESS in flight during re-delivery, or a
proxy server that has already picked the assignment up cause no
duplicate work or 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 target="RFC8881"/> Section
4.2.3, 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.  A
well-behaved proxy server treats it as a lower bound on its next poll
deadline; the metadata server <bcp14>MAY</bcp14> return a smaller value than the standard
NFSv4 lease period to drive a busy proxy server to poll more often or
to encourage a quiet one to back off.</t>
          <t>Polling cadence: lease/2 in steady state.  Adaptive backoff to
lease and then 2*lease after K consecutive empty replies;
reset on any non-empty reply.  The metadata server may override the
cadence via <tt>ppr_lease_remaining_sec</tt>.</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 94):</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 95):</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 94: 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 byte-shoveling 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 target="RFC8881"/> S18.51, 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> if non-empty, or the matched GSS
principal / mTLS fingerprint otherwise -- 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.  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),
drops L1 and L3, issues CB_LAYOUTRECALL on the prior layout
to external clients still holding cached L1 references, and
defers final removal of the decommissioned mirror D until
all L1 holders return their layouts.  See
<xref target="sec-atomic-commit"/> for the full mechanics.</t>
              </li>
              <li>
                <t>For any other <tt>pd_status</tt>: leaves the file's layout
unchanged -- L1 stays in force; L2 and L3 are discarded.
No CB_LAYOUTRECALL is needed (external clients never saw
the post-image).  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 95: 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 target="RFC8881"/> S18.51 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="side-effects">
            <name>Side effects</name>
            <t>If validation succeeds, layout-side effects mirror PROXY_DONE
with a failing <tt>pd_status</tt> -- L1 stays in force; L2 and L3 are
discarded; the half-filled target G is the proxy server's to clean up.
The metadata server retires the proxy operation, invalidates <tt>pc_stateid</tt>,
and (informatively) updates its operator-facing telemetry to
record the cancellation.  No CB_LAYOUTRECALL is needed.</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.</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 DELAY window: once an
assignment exists for a file, LAYOUTGET on that file returns
<tt>NFS4ERR_DELAY</tt> until the proxy server issues its
<tt>OPEN(CLAIM_PROXY)</tt> (see <xref target="sec-claim-proxy"/>).  A silently
ignored assignment therefore stalls client I/O on the affected
file until either the proxy server picks it up, the metadata
server reassigns it, or the assignment is rescinded via
<tt>PROXY_OP_CANCEL_PRIOR</tt> on lease expiry.  The metadata server's
reassignment <bcp14>SHOULD</bcp14> run well inside the registration lease so
that a busy proxy server's silence does not extend a client's
DELAY window to lease-length latency.  The reserved-for-future-
use bits of <tt>ppa_flags</tt> are the natural forward-compat slot for
an explicit proxy-server-initiated decline signal
(<xref target="sec-PROXY_PROGRESS"/>) that would remove the ambiguity in a
later revision.</t>
        <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).</t>
        <t>A host that does not implement the proxy server role simply
does not call PROXY_REGISTRATION and is never selected for
a MOVE or REPAIR 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>The layout the metadata server hands out to clients while a proxy
operation is active is the mechanism's sole client-facing
surface.  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 FFv2
path.</t>
        </li>
        <li>
          <t>A single-data server layout naming the proxy server, when a MOVE or REPAIR
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 FFv2 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 FFv2 -- 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 FFv2 layout.  The <tt>FFV2_DS_FLAGS_PROXY</tt> bit on
the DS 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</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>A client holding a layout that names the proxy server when CB_LAYOUTRECALL
arrives returns it and re-LAYOUTGETs 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_ps_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_ps_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, used for
CHUNK / WRITE / READ I/O 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 byte-shoveling 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 flex-files 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 FFv2 RS) <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 FFv2 layout naming the proxy server.  The client treats it
as any other FFv2 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 LAYOUTRETURNs 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: READY (no operation in flight), ASSIGNED (the
metadata server has queued an assignment for a proxy server but the proxy server has not
acknowledged it via OPEN+LAYOUTGET), PROXY_ACTIVE (the proxy server
is driving a move or repair), COMMITTING (the proxy server has issued
PROXY_DONE(OK) and the metadata server is recalling the old layout from
external clients), and DONE (clients are on the post-move
layout, source data servers retired).  The state is metadata-server-local:
clients never observe these state names directly, but a
client's behaviour 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> (kind=MOVE or REPAIR) 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 still on the old layout</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> (kind MOVE or REPAIR) 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 target="RFC8881"/> S8.4 / 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><strong>EXCHANGE_ID + CREATE_SESSION</strong> 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><strong>PROXY_REGISTRATION</strong> with the proxy server's prior
<tt>prr_registration_id</tt>.  Re-registration is idempotent:
the proxy server sends the same fields it would for a first-time
registration and the metadata server accepts them as re-establishing
the proxy server role on this session.  The metadata server does not assume
that it retained any record of this proxy server being registered
previously; PROXY_REGISTRATION is the proxy server's explicit
assertion that it has the proxy server role for this session.  Until this step
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><strong>PROXY_PROGRESS</strong> 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><strong>Per-file layout reclaim</strong>, for each matched assignment:
<tt>OPEN_RECLAIM(CLAIM_PREVIOUS, pa_file_fh)</tt> per
<xref target="RFC8881"/> S9.11.1, followed by
<tt>LAYOUTGET(reclaim=true)</tt> per <xref target="RFC8881"/> S18.43.3 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><strong>Sidecar entries the metadata server did not re-deliver.</strong>  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><strong>RECLAIM_COMPLETE</strong> 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 target="RFC8881"/> S3.3.7; 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:
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>.  Migration
records the metadata server did not retain across its own recovery
are handled by the drop rules in <xref target="sec-lost-migration-records"/>;
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>The security surface added by this document sits 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 MOVE or REPAIR
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 behaviour 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 MOVE 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 <em>session-authentication</em> 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 <em>inside</em> 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 target="RFC7861"/> Section 2.5.2
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 FH 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 standardise 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>The proxy server surface implemented in reffs covers, 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 SB
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"/> and provisional until confirmed by the working group.
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 92-95: 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>
    </section>
    <section anchor="interaction">
      <name>Interaction with the Main Draft</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 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 MOVE or
REPAIR 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 behaviour (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 in-flight
migration state across a metadata server restart to the
implementation; a metadata server that retains nothing is
conformant.  Should the document nonetheless add a
<bcp14>SHOULD</bcp14> recommending retention, 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 target="RFC7861"/>
Section 2.5.2) 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 WG 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 PROXY_OP_MOVE 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 WG 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 the main
draft, 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 main draft's tight-coupling
control plane (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 PROXY_OP_MOVE 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 target="RFC7862"/> Section 4)
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="25" month="May" 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-06"/>
        </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">
          <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 2994?>

<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:
H4sIAIinY2oAA8S963rb2JU2+H9fBcb5UWQ1KceHdKqkJN+nkmSXJrLlT5KT
zvTkESESlBCTBEOAVinV7muZa5krm/Wuwz4AoORK98zU83THIglgYx/W8V3v
Go/HrimbRbGffdhUPz2Mjzfl52KVXRabz8Umm1eb7M2i+Km8WRTZm3JR1Nmf
ik1dVqvspctvbjbF5/3szZvPL+VqvczNqukqX9I9Z5t83ozv8odVUY9X8/rz
6/GcbjfHncafX47X/Myarxr/+pWb5k1xW20e9rO6mbkZ/bWf/Xx8eHXyxU2r
VV2s6m29nzWbbeHK9Yb/VTcvf/3r739Nw9kU+X72tlgVm3zh7qvNp9tNtV3v
Z++LBn/x+LPLh7oplv4tXrtPxQN9O9vPTldNsVkVDU0BDdq5uslXs+t8Ua1o
EA9F7dblfvbvTTUdZXW1aTbFvKZ/PSzlH/TKy3y9Lle3o2xaLZfFqqn/6hzN
5bbYd1n2VWPJsuZhTU/7M/2E7pS9xUX06TIvF/sZz9//LItmvldtbunjfDO9
28/ummZd7z9/jh/hE1q/PfvRc3zw/GZT3dfFc77+OcZSNnfbm/0Mvxrf38rC
PN+5MHTFglaibsKzkiv35H57ZbX7Hs9/yU7Yu2uWC+fybXNXbWjyxjSCLCtX
tPRXe9mPfA/+SDbZ1V21zOv4c3rzfFX+I29oWvfpC1qOTb3OpwV/W8h0Lqrb
u4fN/7zFX3u0ZM6tqs2SrvnMC3bx5ui33/3ri/DPV/rP71789jv753ff2Q++
f/nd9/jn6fh4b+db7jtXruatp7z47sWr8JSXduvXr35DPx+Px1l+UzebfEpb
8kNOW3tRLLL3by6zwZr+/zC7p8nPmrti5zmlxXuoto3D1srq7XpNm7fOpouS
tui4LmdFRgem3m4K2rcz7Dra9tmazuP0brv6lG2KdV5u3A1t3IIEg1xX84/o
fOaZLFm9l9E6lDXOwRabPyt+aorVrKah5Y3jfdkU0waP4RHnGa+4Xp5tKoig
nJ52W9Kh2BQYAm29as7vtiyaPHoa3zRbV4tF3fs1TTELgCyv6/J2tfQjnuab
TVnwRcuMJiWj6V1Wn/mtM6xSNt9U9M2qcDJrWVPRhRX9fjOiwUEIkcyZNnLF
/V2FS/x1NIufS9zN1Xf5ZkZigeQnrd2qpgOES2wWi5XMdc0S1uaU32qar+h5
bp1vmnJarung0c7nt8Rzvqlp02Pz+Ftkg3I1XWz5n7QhPpMQldsNaUkOF4ss
kbFNNbbJ0o9o1Un8lSs+LFnJIypo7WkYBZ0SerBrT++moHVc1VlnisvVolz5
8W6Keg2h7TCH6TDKVdmU9Gqz7MPF+b/95Zr+/9uLk8tLXtMRLxXukG6Rgncu
KYLlelHwaD+XOdYtGrDe7/j8/Qm9/vuKpnOxuMmnn1xFW5rfkXbCBoP7+7bE
NsMCdJ5Ff5CgrxZ7cgJpQYrr9/h/TXV9UeQz2vDO8X4vsbHojWe07rNtvqA9
cLMsaz56fEYq2m50PT2QJMG0acl2r9X4/BTZs8Mb7Dq+9bEepWc0qim/b35T
0crf5bLrp9vNhr52s7KebuWJrG5GKq7pkSsaKaskDKWutptpQXJvyvOg77Ys
Z7NF4dyvoAA31WzLj8LbPSlSWFu5wc8/Pyr0vnwZ0vzIrYtE8LiW4MFSQKjx
aPOODPKr4gZHP1wf/fjx/R+vL04+HJ5eDOXo0K7olwczWmma+nzlSIzi8Mgg
cLijMx2v4ixf5re0O/j5sjgkxpYFtllZL7Hs9XY+pxOK+2DgMsYaMqEmOTul
/cabg5ZrNZtvF1k1d3I3nA+VNjxsrCePPqc1I9GTLcIQ97AQmwJ/0kGj6SOB
KMeOpo2WgOU3b9/2ZC2rWUH794oFx4buXNYir8b8ZPnVvmykvOZDe39XTu9I
sFTb2zsXC3caIo1oToqymKnsjR4XhCLtjftqu5g5PV10QOuSBV9Bt3mQ2WSh
6J+2quLXpUG6/DMMGew6Wp4ZzFGVJvxa9Gw60Xpaajx7hjczHQdZW/Ip37c5
XpKJCCEfZLtt39uiop1C42oqp0Je9mC1KKcP9MS8hrgYLMvbjchvlmSr4t52
LA4A3odeeLwsN5sKp2044ruQXUEW5SpfTYtwq+JzPt3mqj4wxU63aH5HYgWr
OytgPooEGfJc4WbF6nO5qVjM0u7U27mB6i5TK/z6kJIkZ0k6lM0DzgwfRNxI
f+bwAXYlTQ5EI9T0UGe0uSs3PKFevXj1BVMqd3ZygqrKvl5VkbMRlJVsCVZZ
uvoipvLVA52F25xWALNIqmKZs8Xz+XXydC9ZS+iDpXzuHx3GD7OHHlw3JSnD
VVHAJsG5z2f8uHuapsJfuadi3Zsx9bqYlnPYDD0WC2+c2YwUHeQOzn0jhzXH
UVU7p6ZRYBua7NjvqBvoJqgl+lPEOI2vT4xhuGYgkRSBLszX+U25oB1Pz4M2
FPV3cfL29PLq4vDq9Pz9QVe70QerYD111PsWI24rZmzCjr7H/itGejSHIydH
um/oZjKkFgLG4M2E7kCdmWs4rEVOtw4PF41Gf+T0FqlJ4IINkA1o2KQ1N000
O0eH749Ozsw8UgvzCSvJPWYl9UxxpPZFEuYOR82bKWaW4CoSLksMxmTgBq/q
N1xZzPjAZkXJAuqGxGhFUkBs0O6DWdUtHugssWUio948OOhV+Y1YpXcbiHk8
BN+oRBTlFS8cCeT2M2isf77DiPJMJaNMCS0qvw1Og8p7fiFHTyJ7BBs2O31+
7h/dvu+BSrqu4KERrxYPLs96pA//Phxgnnk6xTBd1Gz5/CIjG0V9Klgj9FBS
87xAGXv5ZKuX/yDV5s+oYwHuxX5uUsVPkyhvfeQGHiVvbjo7BaaHlgq/q7fT
O7felMsScpDcgWS+FsWcTRAvv/ibsUqcqVvSNqDDQvMorgu/7g2reviQNN46
nxcL+nq6qerapfcJHlmBY8Iaay6+D02ef9MRzWmFA0+HN2cjoalm+QO/nEqu
m/L2FuYk1NmmWme3+dprHDPXnGjPtTmorHM4vKEPzBeQuA/kFq6xxfxERNOz
ByP0Qs6LyJezfHW7JTtMrNFPxQNEEMnvZ+8+Xl49G8n/Zu/P+d8XJ//r4+nF
yTH+ffnj4dmZ/4fTX1z+eP7x7Dj8K1x5dP7u3cn7Y7mYPs2Sj9yzd4d/eSba
6dn5B0jVw7NnIsRiXQGbjNbzppCpWpPQo0XKa0dLMN2UN/QHXfPD0Yf/+/96
8Tr7+ef/jfbkyxcvvv/yRf/47sVvX9Mf9ySf5WnY9vonzS+dgPW6yNl6ommm
LbEuyRyo+azXd9X9KqNFgA779t8xM3/dz353M12/eP0H/QAvnHxoc5Z8yHPW
/aRzsUxiz0c9j/GzmXzemul0vId/Sf62eY8+/N3/YGUyfvHd//iDw+Y5Lubs
WcI2EsuXFEx1z9Kk2CzF86MjOhPdvCzoCMAJn+E6Xh33pDODoEwiIQfHl2Sn
tRXe4B19TL8UiYGTD+vQ/pd+RZ9xkID+p9mU5EeNxTzOBjh6W3oNqCb1lmYS
lRVZpzbLcxyooXeWXabXk0Qjg0aFRzb4QFN7+v5t9jx7c0rTd/p/nBzTvzHn
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
Es+d37VQEC5fVN7dWQTHz+p9S6wwsyPuszmfDbArzjLLrCMc4D4oHncEnCXM
RhrpStRjb3AcgluWnirraarMWPRDfBTNh/b3SOKp4p/S3UQ3Xq7vs/3ff6oX
r9uk5+eyHzoSsbhD6qESQjLF4HpUeFJmEAZbsj+sbdT04i0+G06KlRdX5TbM
0zSls/vUZYQCUUXSc2Z+ZVrB6i+Mg8QQXWlxvoAf/xZbOMsAwShT3+UYHKEH
Xc8Ttt7UuKAuAOP8ZgfDOYZ7HMe+zw+3UtspDor4J56w4lWK7zk8TF6qR6dJ
igXq2VTYRXNH6x47+s1jC6LXUb7OU7S4qXJjFLwSBkaJaeEGWPxPmmF6qUFL
fM6JAlZK1WWSh1pV3ZXB+8X7wqPBpsXmuBxw2HEycRQjOKzajRBKSEKkibBf
kixtuZfkbOLQv6Ennm/WxWZxVVez9ZVbN2Ak+cSuT/26p0SkRPuhM9Tz0Yda
8Xumb7ejuRaiFdMcVS+NauA/MSZW20pCU/HHC0Ey3arBy5wGH+C0o5XIw+7k
hEoUKVcZrRlCYTiZCqDgBb/IKsGQWgNA8Hi8jdpJ9nlhcfF+Pf2yXW5mfLrg
s9wwi2ZN7DoOFJ6i38/Zx1JEFt6kpzMqipTJ3DLdSGPOAQyKab9BuaQ2pmUH
N6svMJSLAyDU+JaWbQ8P0E3W6jLzpWv9eg02HVzUVpGfeTmBOaSVpNt2zYMu
06C2d3L8j3d/Ow6FCxVIhvmt/awqHkbWh8LXEAO3m+Pa+lLLEQ8a1+J0Porl
XrrHiLnUGs+eAdBYOT47OCuQO0vRv6CN6FvJdbZo12M0UPSbWDa0XBbT0CBQ
bF10hnWrT2g+xF/ZObq+aa0zzhS0Fn1pFSgHBKiTWovjGC8T2B0tCQvQ08sV
DQjFChrypV8ZTPRWUsrIEjOJ9J/tMx56mDahc+Nga72HgqdcNAoJGV7UQ9In
PhFSoJDM3LRKJ5VUdzyLtKLpIlp+ygpnaVStvpP+6CpzjkUcA+ZRSyO3iBQB
wFMWyJW29VBbPa+cDhZy2Yx2Q7K+I07gsJhlExLAwvLglakh7LonQ1ShJTkC
O55Xi+pSJi+uVQ8JOEl6Vpt1i1LxSbyubr84XetkKTvgZBC+ei/P31MYaJkg
Hlw3q5bKoJrpvPZgzwhGICAVK1LMUZAWkRLMZLdHLMPt0DndXG5MbQvuhDvs
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
iygCAA==

-->

</rfc>
