<?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-00" 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-00"/>
    <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 36?>

<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 (PS) 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 codecs for clients that cannot
participate in the file's native encoding (including NFSv3
clients).  All PS-MDS coordination is fore-channel: the
metadata server returns work assignments inline in the response
to a PS-initiated PROXY_PROGRESS poll, and the PS reports
completion via a fore-channel PROXY_DONE.  No callback
operations are required for the PS protocol.</t>
    </abstract>
    <note>
      <name>Note to Readers</name>
      <?line 53?>

<t>Discussion of this draft takes place on the NFSv4 working group
mailing list (nfsv4@ietf.org), which is archived at
<eref target="https://mailarchive.ietf.org/arch/search/?email_list=nfsv4"/>.
Source code and issues list for this draft can be found at
<eref target="https://github.com/ietf-wg-nfsv4/flexfiles-v2-data-mover"/>.</t>
      <t>Working Group information can be found at
<eref target="https://github.com/ietf-wg-nfsv4"/>.</t>
    </note>
  </front>
  <middle>
    <?line 64?>

<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 <strong>whole-file repair</strong>: 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 <strong>layout
transitions</strong>: 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 <strong>codec translation</strong>: a
client that cannot participate in the file's native codec --
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 <strong>proxy server (PS)</strong> role to
address those three cases with a single mechanism: the PS
opens a session to the metadata server and registers its
capabilities via PROXY_REGISTRATION; the PS then polls the
MDS using PROXY_PROGRESS for work assignments (move, repair),
which the MDS returns inline in the poll response; the PS
carries out each assignment and signals completion via
PROXY_DONE (or abort via PROXY_CANCEL).  All of the PS-MDS
coordination is fore-channel; the PS does not require a
back-channel callback program.  Clients discover that a file
is being proxied through the normal pNFS layout path -- a
layout that names the PS with a new data-server flag
(FFV2_DS_FLAGS_PROXY) -- and route their I/O through it while
it is active.</t>
      <t>This design codifies a mechanism that is common, but
implementation-specific, in existing Flex Files v1 deployments.
Today the lack of a standardized version is the single biggest
interop gap between pNFS and parallel-filesystem competitors
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 anchor="relation-to-the-main-draft">
        <name>Relation to the Main Draft</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
rules that match a client to a co-resident proxy, the
credential-forwarding rules a translating proxy must
follow, and the recovery semantics for the three actor
failures that matter during an operation (PS, MDS, DS).</t>
        <t>The new role is the <strong>proxy server (PS)</strong>, distinct from
the MDS and DS roles defined in
<xref target="I-D.haynes-nfsv4-flexfiles-v2"/>.  A PS registers with an
MDS and, on receipt of a directive from that MDS, performs
a move, a repair, or an ongoing codec translation on behalf
of a client.  The PS is opaque to most clients and is
visible to the MDS through a dedicated NFSv4.1+ session that
the PS itself opens.  All PS-MDS coordination is fore-channel:
the PS issues ops to the MDS, and the MDS returns work
assignments inline in its responses.  No callback channel is
required for the PS protocol.</t>
        <t>The fore-channel surface is deliberately small.
PROXY_REGISTRATION (<xref target="sec-PROXY_REGISTRATION"/>) lets the PS
declare the codec set it supports, its co-residency
affinity token, and its lease.  PROXY_PROGRESS
(<xref target="sec-PROXY_PROGRESS"/>) is the PS's poll-and-report op:
the PS sends it as a heartbeat (with optional progress
reports on in-flight migrations) and the MDS replies with
zero or more new work assignments inline.  PROXY_DONE
(<xref target="sec-PROXY_DONE"/>) commits or rolls back a migration when
the PS finishes it; PROXY_CANCEL (<xref target="sec-PROXY_CANCEL"/>) lets
the PS abort early.  All four ops are fore-channel
PS-to-MDS.</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 PS in the first place.  Co-residency
attestation -- the "affinity matching" machinery that makes
host-local proxy shortcuts safe -- travels as an affinity
token carried in PROXY_REGISTRATION and is described in
<xref target="sec-affinity"/>.</t>
        <t>Codec translation for codec-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 codec still
read and write the file.  Unlike move and repair, which are
transient transitions on the file, codec translation is an
ongoing routing arrangement that persists as long as the
codec-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
MDS, using the client's forwarded credentials.  Getting
this boundary wrong turns the PS into a privilege-elevation
vehicle, so the rules are stated normatively and enforced
at the MDS 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
-- PS failure, MDS failure, and DS 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>
        <t><strong>Journaling and partial moves.</strong>  Move assignments in this
revision are always whole-file.  The PS 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 MDS 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>
        <t><strong>Orchestration beyond a single proxy.</strong>  Multi-proxy
pipelines (staged moves for very large files) and
automated load balancing or predictive selection across
registered proxies are out of scope.  An MDS in this
revision selects a single PS per operation; load
distribution across many proxies, when it matters, is
expected to be handled by the MDS's selection policy and
does not surface as new wire protocol.</t>
        <t><strong>Server-side copy as an alternative path.</strong>  Integration
with server-side copy (<xref target="RFC7862"/> Section 4) as an
alternative to PS-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 PS-driven move is an MDS-directed
inter-server operation), and their intersection -- for
example, using server-side copy under the hood of a PS move
assignment -- is better specified in its own extension rather
than bolted into this document.</t>
        <t><strong>Proxy-internal features that do not surface on the
wire.</strong>  A proxy <bcp14>MAY</bcp14> implement content-integrity and
error-correction layers, encryption and compression
pass-through, log-structured write staging, sector-
alignment normalisation, and POSIX-loopback shortcuts when
proxy and client are co-resident.  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>
      </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 PS 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 codec -- are routed through a PS persistently,
for as long as they are active.</t>
      <t>The distinction matters for how the MDS schedules work.
Transient transitions have a terminal state; the MDS expects
each one to complete (via terminal PROXY_PROGRESS) and then
to retire the associated layout.  The persistent routing case
has no terminal state for the file as a whole; the PS stays in
the layouts of codec-ignorant clients as long as those
clients are open.</t>
      <t>In every case, a registered PS becomes the source of truth
for a file's data during the operation, and clients are
redirected to route I/O through that PS 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 MDS queues a MOVE
assignment for the file; the next PROXY_PROGRESS poll from a
registered proxy whose codec 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 dstore identifier 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)
dstore pair plus the file's recorded layout type, the
assignment does not need a separate transformation-class
field.</t>
      </section>
      <section anchor="ds-maintenance-evacuation">
        <name>DS Maintenance / Evacuation</name>
        <t>A data server is scheduled for maintenance (hardware
replacement, software upgrade, decommission).  All files whose
layouts reference that DS must be evacuated to replacement
DSes before it is taken offline.  The MDS queues a MOVE
assignment per file (source = the outgoing DS, 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-PS in-flight cap (<xref target="sec-multi-ps-fanout"/>).</t>
      </section>
      <section anchor="whole-file-repair">
        <name>Whole-File Repair</name>
        <t>Multiple DSes have failed such that per-chunk repair cannot
reconstruct the file in place.  The MDS constructs a new layout
backed by replacement DSes and queues a REPAIR assignment.  The
next registered-PS 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 status via PROXY_DONE with
status=NFS4ERR_PAYLOAD_LOST, 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 DSes
needs to be migrated to TLS-capable DSes, or vice versa (an
inventory change, a policy change mandating transport security,
onboarding a new storage class whose DSes are TLS-only).
A <tt>PROXY_OP_MOVE</tt> assignment applies: the destination DSes
have the required transport security profile, the source DSes
are retired.  A
client that arrives mid-transition is routed through the proxy
and does not directly see the heterogeneous DS set.</t>
        <t>The proxy establishes its own RPC connections to source and
destination DSes, 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-DS
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 DS changes the filehandles it issues for a file; this
happens when the DS'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 MDS 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 DS protocol upgrade where the DS FHs change
as a side effect of migrating from <xref target="RFC1813"/> to
<xref target="RFC8881"/> semantics; a DS-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 DS's FH structure is internally
versioned and old clients hold stale versions.</t>
      </section>
      <section anchor="sec-codec-translation">
        <name>Codec Translation for Codec-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 codec;
a minimal client, a legacy client, or an NFSv3 client typically
cannot participate in erasure-coded files at all.  Per the
codec-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 MDS-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, codec translation is <strong>persistent per client</strong>.  The
file itself is not changing state.  What changes is the layout
the MDS hands to a codec-ignorant client: that client gets a
layout with FFV2_DS_FLAGS_PROXY set and a coding_type the
client does support (typically FFV2_CODING_MIRRORED, or for
NFSv3 clients just a flat NFSv3 data surface).  The proxy
encodes and decodes on the fly against the real DSes; the
client sees a flat file.</t>
        <t>The same file may be accessed directly by codec-aware clients
(with a normal layout naming the real DSes) and through the
proxy by codec-ignorant clients (with a proxy layout)
simultaneously.  The MDS issues a different layout per
request; FFV2_DS_FLAGS_PROXY is set only in the layouts that
need translation.</t>
        <section anchor="mechanism">
          <name>Mechanism</name>
          <t>A translating proxy runs two sides that meet internally.  On
its <strong>client-facing</strong> side it speaks the protocol the
codec-ignorant client can speak: for an NFSv3 <xref target="RFC1813"/>
client that is an NFSv3 server that re-exports the MDS's
namespace; for a legacy NFSv4.2 client that understands only
some codecs, it is an NFSv4.2 data-server surface presenting
FFV2_CODING_MIRRORED (or an equivalent codec the client
supports).  On its <strong>MDS-facing</strong> side it is an NFSv4.2
client to the MDS plus whatever DS protocol the MDS's real
DSes speak.  The proxy translates each client-facing op into
the corresponding MDS or DS op, applies the codec
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 MDS 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 DS is
NFSv3) against the real DSes, 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 codec, issues
<tt>CHUNK_WRITE</tt> / <tt>CHUNK_FINALIZE</tt> / <tt>CHUNK_COMMIT</tt> against
the real DSes.</t>
            </li>
            <li>
              <t>Proxy: returns NFSv3 WRITE ok with the stable_how it was
able to honor (which may be downgraded based on the
back-end DS's own stable_how behavior).</t>
            </li>
          </ul>
        </section>
        <section anchor="why-the-same-proxyregistration-machinery">
          <name>Why the same PROXY_REGISTRATION machinery</name>
          <t>The registered-PS mechanism gives the MDS the information it
needs for translation-proxy selection: <tt>prr_codecs</tt> enumerates
the codecs the PS can translate between, the MDS &lt;-&gt; PS
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 PS simply serves the codec-ignorant
client's I/O requests against the unchanged source layout.</t>
        </section>
      </section>
    </section>
    <section anchor="design-model">
      <name>Design Model</name>
      <section anchor="roles">
        <name>Roles</name>
        <t>This document introduces a third role alongside the pNFS
metadata server (MDS) and data server (DS):</t>
        <dl>
          <dt>Proxy server (PS):</dt>
          <dd>
            <t>A persistent, registered peer of the MDS that carries out
whole-file operations on the MDS's behalf -- moving file
content between layouts, reconstructing files whose source
layout has been damaged, and translating codecs on behalf of
clients that cannot participate in the file's native
encoding.  A PS is a distinct role from a DS; a given server
<bcp14>MAY</bcp14> implement both, and typically does, but the protocol
does not require that.  The MDS sees the PS 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 (MDS):</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 (DS):</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 MDS &lt;-&gt; PS pair gains the new PS-to-MDS regular ops for
registration, progress, and terminal reporting
(<xref target="sec-new-ops"/>).  No new callback ops are introduced; the
MDS pulls work assignments to the PS in the PROXY_PROGRESS
reply on the fore-channel, and the PS 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; PS pair gains no new ops: clients reach a PS
through the normal pNFS data path, seeing it as a DS with
FFV2_DS_FLAGS_PROXY set in the layout
(<xref target="sec-layout-shape"/>).  The MDS &lt;-&gt; DS 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="sec-design-session">
        <name>Session Between MDS and PS</name>
        <t>The PS opens an NFSv4.1+ session to the MDS as a normal
client.  All PS-MDS 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 PS protocol -- the session's
back-channel is unused by this draft (the PS may still
establish one for unrelated NFSv4.1 callbacks if it wishes,
but no PS-protocol op rides on it).</t>
        <t>The session direction is intentionally opposite to the
MDS -&gt; DS tight-coupling control session in
<xref target="I-D.haynes-nfsv4-flexfiles-v2"/>: that session is opened by
the MDS to carry MDS-originated stateid management to a DS.
The MDS &lt;-&gt; PS session is opened by the PS because registration
is a PS-initiated act -- the PS is saying "here I am, with
these capabilities."  Without a PS-to-MDS direction the
capability-advertisement would have to be inferred from
session-setup flags alone, which is inadequate for the range
of capabilities a PS can usefully advertise (codec set,
affinity token, 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 DS and PS roles toward the same MDS runs
two sessions between the same pair of hosts: the MDS opens
the DS tight-coupling session toward the box, and the box's
PS opens the PS session toward the MDS.  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 PS
session -- which the credential-forwarding rules in
<xref target="sec-security"/> recommend for any PS 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 MDS it is registered with.</t>
      </section>
      <section anchor="flow-summary">
        <name>Flow Summary</name>
        <t>The PS opens a session to the MDS and issues
PROXY_REGISTRATION, declaring its supported codecs and its
affinity token; the MDS records the registration and returns
a registration id with a granted lease.  The PS then polls
the MDS via PROXY_PROGRESS at lease/2 cadence (or as the
MDS's <tt>ppr_lease_remaining_sec</tt> hint directs).  When the MDS
decides to move or repair a file, it selects a registered PS
whose capabilities match the operation and queues an
assignment for that PS; the next PROXY_PROGRESS reply
delivers the assignment in its <tt>ppr_assignments&lt;&gt;</tt> array.
The PS 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 MDS may at any time retract an
assignment that the PS 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_dstore_id)</tt>
pair in a subsequent PROXY_PROGRESS reply; the PS may cancel
work it has already started via the fore-channel
PROXY_CANCEL (<xref target="sec-PROXY_CANCEL"/>).</t>
        <t>Clients interact with the PS through the normal layout path.
During a proxy operation the MDS hands out layouts that name
the PS as a DS entry with FFV2_DS_FLAGS_PROXY set; clients
route CHUNK I/O to that entry.  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 PS work starts.</t>
        <figure anchor="fig-seq-policy-move">
          <name>Message sequence for a policy-driven move</name>
          <artwork><![CDATA[
  PS                                MDS
  |                                 |
  | ---- CREATE_SESSION ----------> | (PS opens session to MDS)
  | <--- session est. ------------- |
  |                                 |
  | ---- PROXY_REGISTRATION ------> | (advertise codecs, affinity)
  | <--- 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(file_FH) -----------> | (PS picks up the work)
  | ---- LAYOUTGET (L3 composite) > |
  |                                 |
  |  [PS drives move: reads source  |
  |   DSes, encodes per destination |
  |   codec, writes destination     |
  |   DSes via L3 fan-out]          |
  |                                 |
  | ---- PROXY_PROGRESS ----------> | (heartbeat; lease renewal,
  | <--- NFS4_OK, ppr_lease_rem.... |  no new assignment needed)
  |                                 |
  |  ...                            |
  |                                 |
  | ---- SEQUENCE                   |
  |      PUTFH(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><strong>NFS4_OK</strong> in <tt>pd_status</tt>: the PS reconstructed the file;
the MDS proceeds as in <xref target="fig-seq-policy-move"/>.</t>
          </li>
          <li>
            <t><strong>NFS4ERR_PAYLOAD_LOST</strong> in <tt>pd_status</tt>: fewer than k
shards survived across the mirror set; the MDS 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-mds-initiated-cancellation">
        <name>Message Sequence: MDS-Initiated Cancellation</name>
        <t>The MDS may decide to retract an assignment.  Two cases:</t>
        <ol spacing="normal" type="1"><li>
            <t><strong>Assignment not yet acknowledged by the PS.</strong>  The MDS
includes a <tt>PROXY_OP_CANCEL_PRIOR</tt> assignment in the next
PROXY_PROGRESS reply, naming the same <tt>(file_FH,
target_dstore_id)</tt> pair as the prior MOVE / REPAIR
assignment.  The PS, which has not yet OPEN'd the file,
simply drops the prior assignment from its in-flight queue.</t>
          </li>
          <li>
            <t><strong>Assignment acknowledged and in flight.</strong>  The MDS
internally aborts the migration and discards the in-flight
record; the PS's eventual PROXY_DONE returns
NFS4ERR_BAD_STATEID (the L3 layout stateid no longer
resolves to a record), and the PS abandons the work and
releases its OPEN.  The MDS may also let the PS's
registration lease expire as a coarser cancellation.</t>
          </li>
        </ol>
        <t>The PS-initiated cancellation case uses the fore-channel
PROXY_CANCEL (<xref target="sec-PROXY_CANCEL"/>).</t>
        <figure anchor="fig-seq-cancel">
          <name>Message sequence for MDS-initiated cancellation (assignment not yet acknowledged)</name>
          <artwork><![CDATA[
  PS                                MDS
  |                                 |
  |  [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 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 two new NFSv4.2 operations that a proxy
server (PS) issues to the metadata server (MDS) on the
fore-channel of the PS -&gt; MDS session defined in
<xref target="sec-design-session"/>.  PROXY_REGISTRATION (93) is issued
once at session setup and on renewal.  PROXY_PROGRESS (94) is
issued by the PS as a heartbeat-with-poll: the PS reports
periodic and terminal progress for in-flight migrations and
optionally requests new work; the MDS replies inline with
zero or more new work assignments.  PROXY_DONE (99) commits
or rolls back an individual migration when the PS finishes
it; PROXY_CANCEL (100) lets the PS abort early.  None of
these operations is sent by pNFS clients.</t>
      <t>NFSv4.2 callback operation numbers 17-20 (the prior version
of this draft used them for CB_PROXY_MOVE, CB_PROXY_REPAIR,
CB_PROXY_STATUS, and CB_PROXY_CANCEL respectively) are
<strong>reserved</strong> by this document and <bcp14>MUST NOT</bcp14> be reused.  See
the "Major revision (2026-04-26)" front-matter section and
the IANA Considerations section (<xref target="iana-considerations"/>)
for the rationale and the wire-level reservation record.</t>
      <figure anchor="fig-data-mover-opnums">
        <name>Data Mover operation numbers</name>
        <sourcecode type="xdr"><![CDATA[
/// /* New operations for the Data Mover (PS -> MDS) */
///
/// OP_PROXY_REGISTRATION   = 93;
/// OP_PROXY_PROGRESS       = 94;
/// OP_PROXY_DONE           = 99;
/// OP_PROXY_CANCEL         = 100;
]]></sourcecode>
      </figure>
      <t>Opcodes 93 and 94 continue the MDS-to-DS control-plane range
that <xref target="I-D.haynes-nfsv4-flexfiles-v2"/> opens at 88
(TRUST_STATEID through BULK_REVOKE_STATEID at 88-90).
Opcodes 99 and 100 were chosen to leave 95-98 reserved by
this document (the prior revision had assigned them to the
now-retired CB_PROXY_* set; see <xref target="iana-considerations"/>).
If other in-flight NFSv4.2 extensions collide on these values
during IANA coordination, the final assignment will be
reconciled by the consuming RFC editor.</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 <strong>disjoint</strong> from the open,
lock, layout, and delegation stateid value spaces defined in
<xref target="RFC8881"/>.  Disjointness is enforced by <em>context</em>, not by an
in-band tag: only PROXY_PROGRESS, PROXY_DONE, and PROXY_CANCEL
arguments carry a <tt>proxy_stateid4</tt>.  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 to a non-PROXY operation (e.g., READ,
WRITE, SETATTR, CLOSE) <bcp14>MUST</bcp14> be rejected with
NFS4ERR_BAD_STATEID by the per-op stateid validator: the
per-op tables are disjoint by construction, and a value
allocated as a proxy_stateid will not match any entry in any
other table.</t>
        </section>
        <section anchor="mds-minting">
          <name>MDS Minting</name>
          <t>The MDS mints a fresh proxy_stateid each time it accepts a
work assignment for delivery to a PS, and includes it in the
<tt>proxy_assignment4</tt> carried in the next PROXY_PROGRESS reply.
(The current XDR for <tt>proxy_assignment4</tt> does not yet carry a
proxy_stateid field; the field is added in the same revision
that defines this section.  See <xref target="sec-PROXY_PROGRESS"/>.)</t>
          <t>The MDS guarantees that no two proxy_stateids in the same
(server_state, boot_seq) are equal.  An implementation <bcp14>MAY</bcp14>
embed the MDS <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 MDS mints it
until either:</t>
          <ul spacing="normal">
            <li>
              <t>The PS issues <tt>PROXY_DONE(proxy_stateid, ...)</tt> or
<tt>PROXY_CANCEL(proxy_stateid)</tt> and the MDS acknowledges it.
On acknowledgment the proxy_stateid is retired; subsequent
references return <tt>NFS4ERR_BAD_STATEID</tt>.</t>
            </li>
            <li>
              <t>The PS's registration lease expires
(<xref target="sec-PROXY_REGISTRATION"/>), at which point all
proxy_stateids minted for that PS 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 MDS 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>PROXY_PROGRESS may carry a proxy_stateid in its arguments to
renew an in-flight assignment (a future revision of the
PROXY_PROGRESS args extends <tt>ppa_flags</tt> for this purpose).
The <tt>seqid</tt> field of <tt>proxy_stateid4</tt> follows the standard
NFSv4 stateid seqid semantics in <xref target="RFC8881"/> S8.2.4:</t>
          <ul spacing="normal">
            <li>
              <t>The MDS bumps <tt>seqid</tt> on each issuance, including renewal
acknowledgments.</t>
            </li>
            <li>
              <t>The PS sends the most recent <tt>seqid</tt> it has received.</t>
            </li>
            <li>
              <t>Out-of-order seqids are rejected with <tt>NFS4ERR_OLD_STATEID</tt>.</t>
            </li>
          </ul>
        </section>
        <section anchor="authorization">
          <name>Authorization</name>
          <t>Possession of a proxy_stateid is <strong>not</strong> sufficient to drive
PROXY_DONE or PROXY_CANCEL on the corresponding migration.
The MDS additionally validates that the calling session's
registered-PS identity matches the migration record's
recorded owner (see the "Authorization" subsection of
<xref target="sec-PROXY_DONE"/> for the full normative rule).  Without
this check, a PS that learned another PS'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 93: PROXY_REGISTRATION - Register as Data Mover</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  prr_codecs<>;
///     opaque             prr_affinity<>;
///     uint32_t           prr_lease;
///     uint32_t           prr_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 (PS) calls PROXY_REGISTRATION on the
fore-channel of its session to the MDS
(<xref target="sec-design-session"/>) to declare its capabilities.  The
MDS records the registration and <bcp14>MAY</bcp14> select that PS for
subsequent MOVE / REPAIR work assignments delivered inline in
the response to PROXY_PROGRESS.</t>
          <t>The prr_codecs field lists the ffv2_coding_type4 values the
PS supports.  The PS <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
codec-set membership is all the capability information the
MDS needs to match.  An empty list results in NFS4ERR_INVAL
in this revision.</t>
          <t>The prr_affinity field is an opaque token the PS supplies for
co-residency attestation with a client.  The MDS does not
interpret it.  At layout-grant time the MDS compares
prr_affinity against the requesting client's co_ownerid
(Section 18.35 of <xref target="RFC8881"/>); a match indicates that the
client and the PS share a host, and the MDS <bcp14>MAY</bcp14> use it as
input to PS selection.  See <xref target="sec-affinity"/> for the matching
algorithm.  An empty prr_affinity means the PS does not claim
co-residency with any client.</t>
          <t>The prr_lease field is the lease duration the PS requests in
seconds.  The MDS <bcp14>MAY</bcp14> grant a shorter one, returned in
prr_granted_lease.  The PS <bcp14>MUST</bcp14> renew before the granted
lease expires; on expiry the MDS drops the registration and
any in-flight migration record owned by this PS is abandoned
(committed to L1 per <xref target="sec-multi-ps-fanout"/>).</t>
          <t>The prr_flags field is reserved for future use.  In this
revision the PS <bcp14>MUST</bcp14> set prr_flags to 0, and an MDS that
receives a PROXY_REGISTRATION with any bit of prr_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 PS that sets a future capability bit
against an MDS that pre-dates the bit could not tell whether
the MDS 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
prr_flags, following the extension rules of Section 4.2 of
<xref target="RFC8178"/>.  A PS that understands a newly defined bit <bcp14>MAY</bcp14>
set it when registering with an MDS that supports it; on
NFS4ERR_INVAL the PS <bcp14>MAY</bcp14> retry with the bit cleared,
treating the response as the <xref target="RFC8178"/> Section 4.4.3
signal that the MDS does not recognize the bit.</t>
          <t>On success, the MDS returns a prr_registration_id that
identifies this registration.  The PS 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 PS's network
endpoint is conveyed through the same deviceinfo channel as
any other DS's address.  When the MDS selects a PS for an
operation, the layout issued to clients includes a
ffv2_data_server4 entry pointing at the PS's existing
deviceinfo.</t>
          <t>PROXY_REGISTRATION is issued on the fore-channel of the
MDS &lt;-&gt; PS session.  That session is opened by the PS, not by
the MDS; it is distinct from the MDS -&gt; DS tight-coupling
control session defined by <xref target="I-D.haynes-nfsv4-flexfiles-v2"/>
even when the same host acts as both DS and PS.  The PS <bcp14>MUST</bcp14>
present EXCHGID4_FLAG_USE_NON_PNFS on the session so that
the MDS can distinguish it from a regular pNFS client.  An MDS
that receives PROXY_REGISTRATION on a session whose owning
client did not present EXCHGID4_FLAG_USE_NON_PNFS <bcp14>MUST</bcp14> reject
it with NFS4ERR_PERM.</t>
          <t>Before recording the registration, the MDS <bcp14>MUST</bcp14> validate the
PS's transport-security identity against a deployment
allowlist.  Acceptable identities are the PS's RPCSEC_GSS
machine principal or the PS's RPC-over-TLS client-certificate
identity, matching the MDS &lt;-&gt; PS transport-security rule in
<xref target="sec-credential-forwarding"/>.  The MDS <bcp14>MUST</bcp14> reject a
PROXY_REGISTRATION from any identity not on the allowlist with
NFS4ERR_PERM.  AUTH_SYS, even over a transport that is
otherwise authenticated, is never a valid authenticator for
this operation; the MDS <bcp14>MUST</bcp14> reject it.</t>
          <t>Because one PS proxies one MDS, a successful rogue registration
displaces the legit PS and returns NFS4ERR_STALE to every
client holding cached filehandles against the previous PS.  To
guard against registration squatting, the MDS <bcp14>MUST</bcp14> refuse a
new PROXY_REGISTRATION from an allowlisted identity while an
existing registration from that same identity still holds a
valid lease; the MDS returns NFS4ERR_DELAY and <bcp14>SHOULD</bcp14> log the
conflict.  A renewal -- distinguished by the PS re-presenting
the same prr_registration_id it received on the prior
registration -- is not squatting and the MDS <bcp14>MUST</bcp14> accept it
(refreshing the granted lease).</t>
          <t>Registration revocation before lease expiry is not a dedicated
operation in this revision.  An MDS that needs to revoke a PS
before its lease expires <bcp14>MUST</bcp14> cease delivering work
assignments to that PS in PROXY_PROGRESS replies; <bcp14>MUST</bcp14> return
NFS4ERR_STALE_CLIENTID on subsequent PROXY_PROGRESS or
PROXY_REGISTRATION-renewal from the revoked PS; and <bcp14>MUST</bcp14>
handle the PS'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 PS, 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 94: 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;
///     uint64_t          pa_source_dstore_id;
///     uint64_t          pa_target_dstore_id;
///     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_resok;
/// 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 MDS for two purposes:</t>
          <ol spacing="normal" type="1"><li>
              <t><strong>Heartbeat</strong>: extend the PS's registration lease.  The MDS
responds with <tt>ppr_lease_remaining_sec</tt> so the PS can size
its next poll interval.</t>
            </li>
            <li>
              <t><strong>Receive work assignments</strong>: pick up zero or more units of
work the MDS has queued for this PS.  Each assignment is a
<tt>proxy_assignment4</tt> describing one migration or repair the
MDS wants this PS 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 MDS <bcp14>MUST</bcp14> reject any non-zero bit with
<tt>NFS4ERR_INVAL</tt>.  The slot allows future revisions to add
PS-side appetite signaling (e.g., "do not give me more
assignments right now") without an XDR break.</t>
          <t>The MDS returns work assignments inline in
<tt>ppr_assignments&lt;&gt;</tt>.  A PS that does not want new work simply
ignores the assignments past its in-flight cap; the MDS does
not retract assignments once delivered.  Each assignment names
a single file (<tt>pa_file_fh</tt>), the source and target dstores
the migration moves data between
(<tt>pa_source_dstore_id</tt> / <tt>pa_target_dstore_id</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 PS can dial source DSes without a second
LAYOUTGET).  The <tt>pa_stateid</tt> field carries the
<tt>proxy_stateid4</tt> (<xref target="sec-proxy-stateid"/>) the MDS has minted
for this migration; the PS uses it as the handle in the
eventual PROXY_DONE / PROXY_CANCEL.</t>
          <t>The <tt>pa_kind</tt> discriminates the work type:</t>
          <ul spacing="normal">
            <li>
              <t><tt>PROXY_OP_MOVE</tt>: drain or migrate the file's data between
the named dstores.  <tt>pa_stateid</tt> is the proxy_stateid the
PS will reference in PROXY_DONE / PROXY_CANCEL.</t>
            </li>
            <li>
              <t><tt>PROXY_OP_REPAIR</tt>: reconstruct a missing or corrupt mirror
on <tt>pa_target_dstore_id</tt> from the surviving mirrors.
<tt>pa_stateid</tt> is the proxy_stateid the PS will reference in
PROXY_DONE / PROXY_CANCEL.</t>
            </li>
            <li>
              <t><tt>PROXY_OP_CANCEL_PRIOR</tt>: the MDS rescinds an assignment it
delivered in a prior PROXY_PROGRESS reply, before the PS
acknowledged it via OPEN+LAYOUTGET.  <tt>pa_stateid</tt> is the
proxy_stateid of the assignment being rescinded; the PS
<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 MDS has already cleaned up the in-flight
migration record on its side and retired the proxy_stateid).</t>
            </li>
          </ul>
          <t>For each MOVE / REPAIR assignment, the PS 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><tt>pa_file_fh</tt> is an <tt>nfs_fh4</tt> minted by the MDS and presented to
the PS for use against the same MDS.  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 PS <bcp14>MUST NOT</bcp14>
inspect, mutate, or shape-check <tt>pa_file_fh</tt>; it forwards the
filehandle verbatim in PUTFH on the same MDS that issued it,
and the existing PUTFH semantics apply unchanged.</t>
          <t>The <tt>ppr_lease_remaining_sec</tt> field is the MDS's
acknowledgment of this PROXY_PROGRESS as a registration lease
renewal.  It is the number of seconds remaining until the PS's
registration would expire absent further PROXY_PROGRESS.  A
well-behaved PS treats it as a lower bound on its next poll
deadline; the MDS <bcp14>MAY</bcp14> return a smaller value than the standard
NFSv4 lease period to drive a busy PS 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 MDS may override the
cadence via <tt>ppr_lease_remaining_sec</tt>.</t>
          <t>The MDS-initiated cancellation case (the MDS abandons an
in-flight assignment before the PS 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 PS-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 PS-to-MDS protocol uses two new fore-channel operations
in addition to the extended PROXY_PROGRESS:</t>
      <ul spacing="normal">
        <li>
          <t><strong>PROXY_DONE (op 99)</strong>: PS reports terminal success or failure
on a specific in-flight migration.  The MDS uses the
ppd_status to atomically commit (success: swap the inode's
active layout from L1 to L2) or roll back (failure: keep L1,
drop L2/G).</t>
        </li>
        <li>
          <t><strong>PROXY_CANCEL (op 100)</strong>: PS aborts a work item it was
assigned but cannot complete (e.g., source DS becomes
unreachable, PS resource exhaustion).  The MDS 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>
        </li>
      </ul>
      <t>Both operations identify the affected migration by <strong>layout
stateid</strong>.  The PS acquired this stateid earlier when it issued
LAYOUTGET against the migration layout (L3) for this file; the
MDS keys its persisted in-flight migration record on the
<tt>(clientid, file_FH, layout_stid)</tt> triple.  No new stateid type
is required.</t>
      <section anchor="sec-PROXY_DONE">
        <name>Operation 99: 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 PS
was assigned via PROXY_PROGRESS.  <tt>pd_stateid</tt> is the
proxy_stateid the MDS minted when it delivered the
corresponding <tt>proxy_assignment4</tt>
(<xref target="sec-proxy-stateid"/>).  <tt>pd_status == NFS4_OK</tt> directs the
MDS 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 MDS to roll back (keep L1,
discard L2 and the PS-only composite L3).</t>
          <t>The PS compounds PROXY_DONE after the byte-shoveling phase
completes (or fails):</t>
          <t><tt>
SEQUENCE PUTFH(file_FH) LAYOUTRETURN(L3_stateid) PROXY_DONE(pd_stateid, status)
</tt></t>
          <t>LAYOUTRETURN runs FIRST per <xref target="RFC8881"/> S18.51, releasing the
PS's reference to the L3 layout cleanly via the standard
mechanism.  PROXY_DONE then operates on the persisted
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 PS <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 MDS <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 PS (i.e., the
session's owning client has <tt>nc_is_registered_ps == true</tt>).
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>A migration record exists in this boot whose recorded
proxy_stateid.other matches <tt>pd_stateid.other</tt>.  Otherwise:
<tt>NFS4ERR_BAD_STATEID</tt>.</t>
              </li>
              <li>
                <t>The migration record's recorded <strong>registered-PS identity</strong>
matches the calling session's registered-PS 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, <strong>not</strong> the per-EXCHANGE_ID
<tt>clientid4</tt>.  This makes PROXY_DONE / PROXY_CANCEL
tolerant of PS reconnect: a PS 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) matches
the migration record's recorded <tt>file_FH</tt>.  Otherwise:
<tt>NFS4ERR_BAD_STATEID</tt>.</t>
              </li>
              <li>
                <t><tt>pd_stateid.seqid</tt> matches the most recently issued seqid
for this proxy_stateid (per <xref target="RFC8881"/> S8.2.4 stateid
sequence semantics).  Otherwise: <tt>NFS4ERR_OLD_STATEID</tt>.</t>
              </li>
            </ol>
            <t>If all validations succeed, the MDS atomically:</t>
            <ul spacing="normal">
              <li>
                <t>For <tt>pd_status == NFS4_OK</tt>: applies the migration's recorded
per-instance deltas to the inode's active layout
(<tt>i_layout_segments</tt>), removing DRAINING slots, promoting
INCOMING slots to STABLE, drops the L3 PS-only composite,
issues CB_LAYOUTRECALL on the prior layout to external
clients still holding cached L1 references, defers final
removal of decommissioned mirrors until all L1 holders
return their layouts.  See "Layout Shape During a Proxy
Operation" (<xref target="sec-layout-shape"/>) for the per-instance
delta machinery (informative).</t>
              </li>
              <li>
                <t>For <tt>pd_status != NFS4_OK</tt>: discards the migration's
recorded deltas without touching <tt>i_layout_segments</tt>.
No CB_LAYOUTRECALL is needed (external clients never saw
the post-image).  The PS owns cleanup of any half-written
data it placed on INCOMING DSes.</t>
              </li>
            </ul>
            <t>In both cases the migration record is unhashed and freed; the
proxy_stateid is retired.</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 100: 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 PS uses it when it knows it cannot complete the
assignment (the PS is being shut down gracefully, the source
DS is unreachable, the destination DS rejected the writes,
etc.) and wants to release the work item back to the MDS
without computing a specific failure status.</t>
          <t><tt>pc_stateid</tt> is the proxy_stateid the MDS minted when it
delivered the corresponding <tt>proxy_assignment4</tt>.</t>
          <t>Compound shape:</t>
          <t><tt>
SEQUENCE PUTFH(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
persisted 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 migration record's
recorded registered-PS identity <bcp14>MUST</bcp14> match the caller's, or
the MDS returns <tt>NFS4ERR_PERM</tt>; a PS cannot cancel another
PS's migration.</t>
          </section>
          <section anchor="side-effects">
            <name>Side effects</name>
            <t>If validation succeeds, the MDS discards the migration's
recorded deltas, unhashes and frees the migration record,
retires the proxy_stateid, and (informatively) updates its
operator-facing telemetry to record the cancellation.  No
CB_LAYOUTRECALL is needed.  Side effects on <tt>i_layout_segments</tt>
mirror PROXY_DONE with <tt>pd_status != NFS4_OK</tt>.</t>
            <t>The distinction between PROXY_DONE(FAIL) and PROXY_CANCEL is
purely intent / accounting: PROXY_DONE(FAIL) records that the
PS attempted the migration and ran into a recoverable error;
PROXY_CANCEL records that the PS abandoned the assignment
without attempting it (or while attempting, decided not to
report a specific failure cause).  An MDS 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-PS Assignment Fan-out</name>
      <t><tt>[[REVISED 2026-04-26 -- new normative section.]]</tt></t>
      <t>When multiple PSes are registered against the same MDS, the
MDS coordinates assignment fan-out per the following rules:</t>
      <ol spacing="normal" type="1"><li>
          <t><strong>At most one in-flight migration per <tt>(file_FH,
target_dstore)</tt> pair at any time.</strong>  This is a HARD
invariant.  The MDS keys its in-flight migrations registry
on this pair and <bcp14>MUST NOT</bcp14> assign a migration whose key
matches a still-in-flight entry.</t>
        </li>
        <li>
          <t><strong>PS selection: round-robin within the registered set.</strong>
The MDS maintains an ordered list of currently-registered
PSes (insertion order).  For each new assignment, walk the
list starting after the last PS assigned; pick the first PS
whose in-flight migration count is below a per-PS cap
(default 8, configurable).  If no PS qualifies, the
assignment stays in the queue; the next PS poll re-tries
the walk.</t>
        </li>
        <li>
          <t><strong>No PS affinity.</strong>  The MDS does not implement
"this file always goes to this PS"; round-robin is the
default.  An implementation <bcp14>MAY</bcp14> add affinity (e.g., by
client-IP locality) without breaking conformance.</t>
        </li>
        <li>
          <t><strong>Cross-PS reassignment on lease expiry.</strong>  If a PS holding
in-flight migrations loses its session (lease expiry, squat
from a competing PS), the MDS:  </t>
          <ul spacing="normal">
            <li>
              <t>Internally treats the abandoned migrations as
PROXY_DONE(FAIL): commits L1, drops L2/G half-fills.</t>
            </li>
            <li>
              <t>Re-queues each abandoned migration as a fresh assignment.</t>
            </li>
            <li>
              <t>On reassignment, the per-<tt>(file_FH, target_dstore)</tt>
invariant catches any duplicate (the new PS picks a fresh
target if the old target was contaminated; the autopilot
decides).</t>
            </li>
          </ul>
        </li>
        <li>
          <t><strong>PS Identity continuity across reconnects.</strong>  A PS that
reconnects with the same <tt>client_owner4</tt> (recovers the same
clientid via EXCHANGE_ID) retains ownership of its
in-flight migrations.  No new assignment necessary; the PS
reclaims its layouts via the recovery path in <xref target="sec-mds-recovery"/>.</t>
        </li>
      </ol>
      <t>The per-PS in-flight cap exists to prevent one PS monopolising
the queue while others sit idle.  It also bounds the
PROXY_PROGRESS reply size for the assignment-fanout amplification
case (e.g., MDS has thousands of files to migrate; without a
cap, the first PS poll receives all of them).</t>
      <t>Implementations <bcp14>SHOULD</bcp14> include a TSan-style invariant test that
confirms, under concurrent PROXY_PROGRESS polls from N PSes,
the MDS never assigns two records with the same <tt>(file_FH,
target_dstore)</tt> key.</t>
    </section>
    <section anchor="sec-affinity">
      <name>Affinity Matching</name>
      <t>A PS <bcp14>MAY</bcp14> populate prr_affinity at registration time with a
token that lets the MDS recognize co-residency with a client.
The canonical use case: a client host is running a local PS,
potentially in a container on the same physical machine as
the client.  Network-level checks alone are not reliable --
the PS may be on a container IP, a separate netns, or behind
a NAT -- so an explicit token is required.</t>
      <t>The matching algorithm has three moving parts.  First,
clients opt in by embedding an affinity token in the
co_ownerid they present at EXCHANGE_ID; clients that do not
wish to participate send a normal co_ownerid with no embedded
token.  Second, when the MDS processes a LAYOUTGET on a file
that has an active proxy MOVE or REPAIR migration, the MDS
iterates over registered PSes and compares each PS's
prr_affinity against the requesting client's co_ownerid; a
match (equality, substring, or hash equivalence -- the match
predicate is implementation-defined but <bcp14>MUST</bcp14> be deterministic
for a given MDS instance) indicates co-residency.  Third,
when a match exists the MDS <bcp14>MAY</bcp14> use it as input to PS
selection, preferring, when multiple PSes are eligible, the
one that matches the most clients' affinity tokens.</t>
      <t>The layout returned names the selected PS first in
ffs_data_servers.  For mirrored coding types this makes the
local PS the client's default read target (matching the FFv1
affinity pattern).  For erasure-coded types it makes the
local PS the preferred encode endpoint.</t>
      <t>Affinity is advisory.  The MDS <bcp14>MUST NOT</bcp14> grant any authority
based solely on affinity; the normal authentication model
still applies, and a client that claims an affinity token it
has no right to gains at most a sub-optimal layout, not
unauthorized access.</t>
      <t>Note: there is no proposal to stamp the affinity token into the
filehandle.  The MDS has already performed the match before the
layout reaches the client, and the layout's deviceinfo carries
all the information a client-side shortcut needs.</t>
    </section>
    <section anchor="sec-layout-shape">
      <name>Layout Shape During a Proxy Operation</name>
      <t>The layout the MDS 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
MDS and the PS.  The layout shape is therefore what a client
implementer needs to read to know how its code interacts with
a proxied file.</t>
      <t>When a proxy MOVE or REPAIR migration is active for a file,
the layout the MDS hands out to clients contains a <strong>proxy
DS entry</strong> at the head of ffs_data_servers (or otherwise
flagged for routing; see the flag below).  This entry names
the selected PS.  Source and destination DS entries <bcp14>MAY</bcp14> also
appear in the layout at the MDS's discretion, but in the
simplest case the PS is the only visible DS, and the source
and destination mirror sets are internal to the PS.</t>
      <t>The PROXY flag is a new bit on ffv2_ds_flags4:</t>
      <figure anchor="fig-FFV2_DS_FLAGS_PROXY">
        <name>FFV2_DS_FLAGS_PROXY</name>
        <sourcecode type="xdr"><![CDATA[
/// const FFV2_DS_FLAGS_PROXY         = 0x00000040;
]]></sourcecode>
      </figure>
      <t>As per <xref target="I-D.haynes-nfsv4-flexfiles-v2"/>'s Flag-Word Allocation
rule, IANA does not maintain a registry for ffv2_ds_flags4; the
bit is governed by this document.</t>
      <t>When FFV2_DS_FLAGS_PROXY is set on any data server entry in
a layout, clients <bcp14>MUST</bcp14> direct all CHUNK I/O for this file to
that DS rather than to any other data server in the layout.
The PS internally dispatches reads and writes to the source
and destination DSes.</t>
      <section anchor="single-layout-model">
        <name>Single-Layout Model</name>
        <t>This design uses a single layout with a PROXY-flagged entry
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 DS is the PS" -- is the truth during
the operation, so exposing the source and destination DSes
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>
      </section>
      <section anchor="sec-two-layout-state">
        <name>Two-Layout State on the MDS Side</name>
        <t><tt>[[REVISED 2026-04-26 -- new normative subsection.  This
specifies the MDS's internal layout state during a migration.
External clients see only the active layout (L1 before the
PROXY_DONE swap, L2 after); the PS sees a composite (L3) for
the duration of the migration.]]</tt></t>
        <t>For each file F whose mirror on a draining dstore D is being
migrated, the MDS persists three logical layout records:</t>
        <ul spacing="normal">
          <li>
            <t><strong>L1</strong> -- the <strong>active</strong> layout for external clients.  Mirror
set includes D unchanged.  All external traffic (existing
cached layouts, fresh LAYOUTGETs) sees L1.</t>
          </li>
          <li>
            <t><strong>L2</strong> -- the <strong>candidate</strong> post-migration layout.  Mirror set
has D replaced by the target G.  Not visible to external
clients during the migration window.</t>
          </li>
          <li>
            <t><strong>L3</strong> -- the <strong>composite</strong> layout served only to the
registered PS that owns the migration.  Two mirror entries:
            </t>
            <ul spacing="normal">
              <li>
                <t><tt>M1</tt> (read source): the current L1 mirror set.  PS reads
source bytes from any mirror in M1.</t>
              </li>
              <li>
                <t><tt>M2</tt> (write target): L1's mirror set PLUS G.  PS writes via
CSM to every mirror in M2.</t>
              </li>
            </ul>
          </li>
        </ul>
        <t>The presence of D in M2 (alongside G) is intentional and
load-bearing: PS-issued CSM writes land on D (keeping D in sync
with concurrent external client writes, which also CSM to D
via L1) and on G (filling the destination as the PS catches up).
Both D and G converge to the same byte image.</t>
        <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  (PS's read-source set)</t>
            </li>
            <li>
              <t>L3.M2 = L1.mirrors union {G}  (PS's CSM write-target set)</t>
            </li>
          </ul>
        </section>
        <section anchor="atomic-commit-on-proxydone">
          <name>Atomic commit on PROXY_DONE</name>
          <t>When the PS issues <tt>PROXY_DONE(layout_stid, status=NFS4_OK)</tt>,
the MDS atomically (in one persisted transaction):</t>
          <ol spacing="normal" type="1"><li>
              <t>Flips the active layout to L2 (D dropped, G promoted)</t>
            </li>
            <li>
              <t>Drops L1 from the inode's layout records</t>
            </li>
            <li>
              <t>Drops L3 (PS no longer needs the migration view)</t>
            </li>
            <li>
              <t>Issues CB_LAYOUTRECALL to external clients holding cached L1</t>
            </li>
            <li>
              <t>Defers <tt>REMOVE_MIRROR(D)</tt> until all L1 holders return</t>
            </li>
          </ol>
          <t>When PROXY_DONE indicates failure (or PROXY_CANCEL is issued):</t>
          <ol spacing="normal" type="1"><li>
              <t>Keeps L1 active, unchanged</t>
            </li>
            <li>
              <t>Drops L2; the half-filled G instance is internally unlinked</t>
            </li>
            <li>
              <t>Drops L3</t>
            </li>
            <li>
              <t>No CB_LAYOUTRECALL needed (external clients never saw L2)</t>
            </li>
          </ol>
        </section>
        <section anchor="late-writes-during-the-swap-window">
          <name>Late writes during the swap window</name>
          <t>The deferred REMOVE_MIRROR(D) (step 5 of the success path)
matters because clients with cached L1 layouts may have writes
in flight that land on D after the swap.  Without the deferral,
late writes would arrive at a destroyed D instance and the
client's CSM would see NFS3ERR_STALE.</t>
          <t>Late writes that arrive at D between the swap and the deferred
REMOVE are harmless: the bytes land on D's instance which is
about to be unlinked; the bytes are dropped with the unlink.
The client sees the write succeed (CSM to D succeeded) and the
data is present on the surviving mirrors {E, G}.  No data loss
or client-visible error.</t>
          <t>Late writes that arrive after D's instance has been unlinked
(rare: client held L1 cache past CB_LAYOUTRECALL) return
NFS3ERR_STALE on the CSM to D.  The client retries CSM with its
cached layout; on next LAYOUTGET it gets L2 and writes only
to {E, G} thereafter.  This is a recoverable transient error,
not data loss.</t>
        </section>
        <section anchor="no-new-claim-type">
          <name>No new claim type</name>
          <t>The PS uses normal <tt>OPEN(CLAIM_NULL)</tt> to open the file.  The MDS
recognises the registered-PS session
(<tt>nc_is_registered_ps == true</tt>) and serves the L3 composite
layout instead of a normal L1 RW grant.</t>
          <t>The L3 layout stateid is a normal NFSv4 layout stateid; the
PS uses it for CHUNK / WRITE / READ I/O against the source and
target DSes in the standard way.  It is <strong>distinct</strong> from the
per-migration handle, which is <tt>proxy_stateid4</tt>
(<xref target="sec-proxy-stateid"/>); the MDS keys its persisted in-flight
migration record on the proxy_stateid, not on the layout
stateid.  Separating the two handles -- one for I/O on a
specific layout, one for the migration as a whole --
keeps the migration record's lifetime independent of any
single LAYOUTGET / LAYOUTRETURN cycle the PS may perform
during the byte-shoveling phase.</t>
        </section>
        <section anchor="drain-interaction">
          <name>Drain interaction</name>
          <t>The DRAINING state on dstore D is observable to external
clients only through the absence of new instance allocations on
D (via the runway-pop filter).  Before the in-flight migration
record becomes visible to the LAYOUTGET path, the MDS issues
CB_LAYOUTRECALL on every layout outstanding for the file whose
composition 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 record
is published and subsequent LAYOUTGETs return the post-image
view (L2 from external clients' perspective; L3 from the PS's).</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 PS shadows client writes from D to G as they happen
-- requires the PS 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 PS 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
codec).  An MDS 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 <strong>per-instance deltas</strong> 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>i_layout_segments</tt>.  Four instance states are useful:</t>
          <ul spacing="normal">
            <li>
              <t><tt>STABLE</tt> -- unchanged; client writes go here directly.</t>
            </li>
            <li>
              <t><tt>DRAINING</tt> -- a slot being decommissioned; under
omit-and-replace, the LAYOUTGET view-build path omits this
slot and replaces it with the matching INCOMING.</t>
            </li>
            <li>
              <t><tt>INCOMING</tt> -- a new slot the PS is filling; under
omit-and-replace, the LAYOUTGET view-build path emits this
slot in place of the matching DRAINING.</t>
            </li>
            <li>
              <t><tt>INTERPOSED</tt> -- a slot whose visible endpoint is the PS,
with the PS internally fanning writes out to one or more
target DSes.  Used by keep-and-shadow (forward-compat;
not produced by the wire ops in this revision).</t>
            </li>
          </ul>
          <t>The current published layout (<tt>i_layout_segments</tt>) is built
<strong>through</strong> 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>i_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; an MDS 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>
    <section anchor="client-behavior">
      <name>Client Behavior</name>
      <t>A client that observes a layout with FFV2_DS_FLAGS_PROXY
routes all CHUNK I/O to the PROXY-flagged DS entry and does
not issue I/O directly to any non-PROXY DS in that layout.
Non-PROXY DSes <bcp14>MAY</bcp14> appear in the layout for informational
reasons but <bcp14>MUST NOT</bcp14> be addressed by the client.</t>
      <t>The client uses its existing layout stateid against the
PROXY-flagged DS entry; the PS accepts CHUNK ops under that
stateid because the MDS has registered the stateid via
TRUST_STATEID on the PS, per the tight-coupling semantics in
<xref target="I-D.haynes-nfsv4-flexfiles-v2"/>.</t>
      <t>The client handles PS-side errors (NFS4ERR_DELAY, connection
loss, NFS4ERR_BAD_STATEID) exactly as it would any other DS
error: report LAYOUTERROR to the MDS and expect either a new
layout or a PS reassignment in return.</t>
      <section anchor="when-the-layout-is-recalled">
        <name>When the Layout Is Recalled</name>
        <t>If the MDS recalls the layout mid-operation (the PS failed
and is being replaced, or the operation completed and normal
DS layouts are being reissued), the client LAYOUTRETURNs as
usual and reacquires via LAYOUTGET.  The new layout may name
a different PS, a different mirror set, or no PROXY-flagged
entry if the operation has completed.</t>
      </section>
      <section anchor="in-flight-io-when-the-ps-changes">
        <name>In-Flight I/O When the PS Changes</name>
        <t>In-flight I/O to the old PS when the MDS recalls the layout
<bcp14>MAY</bcp14> complete at the old PS; results remain valid under the
old PS's authority.  New I/O issued after LAYOUTRETURN <bcp14>MUST</bcp14>
go through the replacement PS (or, if the new layout has no
PROXY-flagged entry, directly to the DSes named there).</t>
      </section>
    </section>
    <section anchor="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
MDS has queued an assignment for a PS but the PS has not
acknowledged it via OPEN+LAYOUTGET), PROXY_ACTIVE (the PS
is driving a move or repair), COMMITTING (the PS has issued
PROXY_DONE(OK) and the MDS is recalling the old layout from
external clients), and DONE (clients are on the post-move
layout, source DSes retired).  The state is MDS-local:
clients never observe these state names directly, but a
client's behaviour is shaped by which layout the MDS 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 happy-path progression; the
table that follows enumerates every state transition
including the unhappy ones (cancellation, PS failure without
replacement).</t>
      <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   |
                         | MDS has the  |
                         | in-flight    |
                         | record; PS   |
                         | has not yet  |
                         | OPEN'd file  |
                         +-----+--------+
                               |
                               | PS picks up the assignment:
                               | OPEN(file_FH) + LAYOUTGET
                               | (L3 composite layout)
                               v
                         +--------------+
                         | PROXY_ACTIVE |
                         | clients see  |
                         | layout with  |
                         | PS DS at     |
                         | head of      |
                         | ffs_data_    |
                         | servers;     |
                         | 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    |
                         +------------+
]]></artwork>
      <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">MDS decides to move or repair</td>
              <td align="left">MDS queues a <tt>proxy_assignment4</tt> (kind=MOVE or REPAIR) for delivery in the next PROXY_PROGRESS reply to the selected PS; creates the in-flight migration record</td>
            </tr>
            <tr>
              <td align="left">ASSIGNED</td>
              <td align="left">PROXY_ACTIVE</td>
              <td align="left">PS picks up the assignment</td>
              <td align="left">PS issues OPEN + LAYOUTGET against <tt>pa_file_fh</tt>; MDS starts handing out the L3 composite layout with FFV2_DS_FLAGS_PROXY set on the PS entry</td>
            </tr>
            <tr>
              <td align="left">PROXY_ACTIVE</td>
              <td align="left">COMMITTING</td>
              <td align="left">PS issues PROXY_DONE with <tt>pd_status=NFS4_OK</tt></td>
              <td align="left">MDS 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">MDS issues post-move layouts (L2); source DSes retired</td>
            </tr>
            <tr>
              <td align="left">ASSIGNED</td>
              <td align="left">READY</td>
              <td align="left">MDS-initiated cancellation: MDS includes a <tt>PROXY_OP_CANCEL_PRIOR</tt> assignment in the next PROXY_PROGRESS reply</td>
              <td align="left">MDS drops the in-flight record; PS drops the assignment from its in-flight queue</td>
            </tr>
            <tr>
              <td align="left">PROXY_ACTIVE</td>
              <td align="left">READY</td>
              <td align="left">PS failed and no replacement available; or PS-initiated cancellation via PROXY_CANCEL; or PROXY_DONE with <tt>pd_status != NFS4_OK</tt></td>
              <td align="left">MDS reverts layouts to pre-move source set (L1)</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
    <section anchor="ps-failure-and-recovery">
      <name>PS Failure and Recovery</name>
      <section anchor="ps-crash-during-proxyactive">
        <name>PS Crash During PROXY_ACTIVE</name>
        <t>When a PS crashes mid-operation, client I/O routed through
it receives NFS4ERR_DELAY (if the PS is reachable but
unhealthy) or connection errors (if unreachable), and the
affected clients report LAYOUTERROR to the MDS.  The MDS <bcp14>MAY</bcp14>
select a replacement PS from the registered pool and queue a
fresh <tt>proxy_assignment4</tt> (kind MOVE or REPAIR) for that PS
in its next PROXY_PROGRESS reply, with the source layout
updated to reflect current reality -- destination DSes that
the failed PS populated are now part of the source set -- and
the destination layout unchanged; the replacement PS resumes
from wherever the failed PS left off.  The MDS then issues
CB_LAYOUTRECALL on the old layout and the replacement PS's
layout becomes live for new LAYOUTGETs.</t>
        <t>If the MDS 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 DSes for cleanup or retry.</t>
      </section>
      <section anchor="cascading-ps-failure">
        <name>Cascading PS Failure</name>
        <t>Repeated PS failures on the same operation <bcp14>SHOULD</bcp14> trigger
escalation to deployment management rather than recursive
retry.  Recurring failures likely indicate an environmental
issue the PS cannot work around.</t>
      </section>
      <section anchor="source-ds-crash-during-proxyactive">
        <name>Source DS Crash During PROXY_ACTIVE</name>
        <t>Reduces the PS's read parallelism but does not block forward
progress as long as the erasure code can still reconstruct
from surviving source DSes.  If the source degrades past
reconstructibility, the operation transitions to whole-file
repair semantics automatically: partial reconstruction
succeeds; ranges that cannot be reconstructed terminate the
operation with NFS4ERR_PAYLOAD_LOST.</t>
      </section>
      <section anchor="destination-ds-crash-during-proxyactive">
        <name>Destination DS Crash During PROXY_ACTIVE</name>
        <t>Treated as a normal DS failure on the destination side.  The
PS acts like a client to the destination DSes: LAYOUTERROR to
the MDS, which <bcp14>MAY</bcp14> substitute a spare or mark the destination
FFV2_DS_FLAGS_REPAIR.  The PS continues pushing to the
remaining destinations.  Clients are unaffected.</t>
      </section>
    </section>
    <section anchor="sec-mds-recovery">
      <name>MDS Crash Recovery</name>
      <t>Clients and the PS detect MDS session loss and enter RECLAIM
per <xref target="RFC8881"/> S8.4 / S10.2.1.  The MDS persists three
independent things across restart:</t>
      <ol spacing="normal" type="1"><li>
          <t><strong>Client identity</strong> for every NFSv4 client, including the PS.
This is the standard NFSv4 client-state persistence: the PS's
<tt>client_owner4</tt> and assigned <tt>clientid4</tt> survive MDS reboot.</t>
        </li>
        <li>
          <t><strong>The <tt>nc_is_registered_ps</tt> attribute</strong> on the PS's persisted
client record.  After reboot the MDS knows the PS was
previously registered without re-issuing PROXY_REGISTRATION.</t>
        </li>
        <li>
          <t><strong>Per-file in-flight migration records</strong>:
<tt>{file_FH, source_dstore, target_dstore, owning_PS_clientid,
started_at}</tt>.  Lives alongside (1) and (2).  Keyed on
<tt>clientid</tt> (stable across PS-process restarts that preserve
<tt>client_owner4</tt>), NOT on the layout stateid (which is
volatile per-boot).</t>
        </li>
      </ol>
      <section anchor="ps-recovery-sequence">
        <name>PS Recovery Sequence</name>
        <t>After detecting session loss, the PS:</t>
        <ol spacing="normal" type="1"><li>
            <t><strong>Re-establishes the session</strong> with EXCHANGE_ID using its
prior <tt>client_owner4</tt> (recovers the same <tt>clientid4</tt>),
followed by CREATE_SESSION.</t>
          </li>
          <li>
            <t><strong>Issues RECLAIM_COMPLETE</strong> to enter the reclaim phase.
PROXY_REGISTRATION is NOT re-issued -- the persisted
<tt>nc_is_registered_ps</tt> flag is sufficient.</t>
          </li>
          <li>
            <t><strong>Per-file recovery</strong> for each in-flight migration the PS
was working on uses the standard NFSv4 reclaim path with one
PS-side persistence requirement:
            </t>
            <ul spacing="normal">
              <li>
                <t><strong>PS implementations <bcp14>MUST</bcp14> persist each in-flight migration's
layout stateid in PS-local stable storage</strong> when the MDS
grants the L3 layout.  Lives in PS-side state (e.g., a small
sidecar file or DB table keyed by file FH).  This is the
only PS-side persistence the data mover requires beyond
what a normal NFSv4 client persists; without it the PS
cannot reclaim its layouts after a PS-process restart and
the migration is abandoned.</t>
              </li>
              <li>
                <t><tt>OPEN_RECLAIM(CLAIM_PREVIOUS, file_FH)</tt> per <xref target="RFC8881"/>
S9.11.1.  The MDS validates that the prior <tt>clientid4</tt>
had an OPEN on this file (which it did -- the OPEN was
created when the PS picked up the assignment from a
PROXY_PROGRESS reply).  MDS re-grants the OPEN.</t>
              </li>
              <li>
                <t><tt>LAYOUTGET(reclaim=true)</tt> per <xref target="RFC8881"/> S18.43.3, supplying
the previously-persisted layout stateid as the reclaim key.
The MDS validates that:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The session's client has <tt>nc_is_registered_ps == true</tt></t>
                  </li>
                  <li>
                    <t>A persisted in-flight migration record exists for this
<tt>(clientid, file_FH, layout_stateid)</tt> triple</t>
                  </li>
                  <li>
                    <t>The reclaim falls within the server grace window
and re-grants the L3 composite layout with a fresh stateid
(the stateid the PS supplied is consumed; a new one is
issued for the resumed migration session, which the PS
<bcp14>MUST</bcp14> persist again per the rule above).</t>
                  </li>
                </ul>
              </li>
            </ul>
            <t>
This is the standard <xref target="RFC8881"/> layout reclaim path; no new
claim type, no side-channel grant signal.  The
data-mover-specific contribution is the <tt>nc_is_registered_ps</tt>
session attribute and the persisted in-flight migration
record on the MDS side.</t>
          </li>
          <li>
            <t><strong>Continue the migration</strong> from wherever it left off.  Bytes
already on G are preserved (the DS holds them); the PS
reads the remaining source bytes from D, writes them to G.</t>
          </li>
          <li>
            <t><strong>Eventually issues PROXY_DONE</strong> with success or failure;
the L1-&gt;L2 commit (or rollback) completes.</t>
          </li>
        </ol>
      </section>
      <section anchor="ps-identity-continuity">
        <name>PS Identity Continuity</name>
        <t>A PS implementation <bcp14>SHOULD</bcp14> persist its <tt>client_owner4</tt> to
survive PS-process restart so that post-restart EXCHANGE_ID
recovers the same clientid and the persisted in-flight
migration records remain valid.</t>
        <t>If the PS's <tt>client_owner4</tt> rotates (e.g., because PS process
state was lost), the new EXCHANGE_ID gets a fresh <tt>clientid4</tt>.
The PS's <tt>prr_registration_id</tt> (if matching the prior
registration) identifies it as the "same operator-meaningful PS
instance" via the squat-guard, but the in-flight migration
records keyed on the OLD clientid cannot be claimed by the
NEW clientid.  Those moves get re-assigned fresh by the
autopilot via the next PROXY_PROGRESS poll.</t>
      </section>
      <section anchor="lost-migration-records">
        <name>Lost Migration Records</name>
        <t>If the persisted migration record cannot be matched (e.g., MDS
state corruption), the per-file reclaim returns
<tt>NFS4ERR_NO_GRACE</tt> or <tt>NFS4ERR_RECLAIM_BAD</tt>.  The PS reports
the move as failed via <tt>PROXY_DONE(layout_stid, FAIL)</tt>; the
autopilot retries on a fresh PROXY_PROGRESS poll with a new
target dstore (or the same target if it is still the best
choice).</t>
      </section>
    </section>
    <section anchor="backward-compatibility">
      <name>Backward Compatibility</name>
      <t>This section addresses client/DS compatibility with the
proxy-server protocol.  For implementations of an earlier
revision of this draft that pre-built against the prior
CB_PROXY_* shape, see "Major revision (2026-04-26)" at the
front of the draft: pre-built CB_PROXY_* implementations
<bcp14>SHOULD</bcp14> treat CB op numbers 17-20 as defunct (return
NFS4ERR_NOTSUPP if received), <bcp14>MUST</bcp14> migrate driving logic to
the PROXY_PROGRESS poll path, and <bcp14>MUST</bcp14> replace any
CB_PROXY_CANCEL receive logic with the new fore-channel
PROXY_CANCEL send logic.</t>
      <section anchor="clients">
        <name>Clients</name>
        <t>Client behavior is a normal layout path with a new flag.
Clients that do not recognize FFV2_DS_FLAGS_PROXY will treat
the PROXY-flagged DS entry as any other DS and route I/O to
it normally; that is in fact the correct behavior.  No
client-side version negotiation is needed.</t>
        <t>Clients that require strict per-DS identity checking (e.g.,
"the layout's DS must match a pre-allowlisted fingerprint")
should extend their allowlist to include registered proxy
servers.  This is a deployment concern, not a protocol one.</t>
      </section>
      <section anchor="data-servers">
        <name>Data Servers</name>
        <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 PS falls back to per-chunk CB_CHUNK_REPAIR for
single-shard repair, to admin-coordinated offline procedures
for policy transitions and DS evacuation, and to blocking
DS maintenance -- the DS cannot drain through a PS, so it
must remain reachable to clients throughout its service
life.</t>
        <t>Deployments <bcp14>SHOULD</bcp14> ensure at least one registered PS exists
per failure domain to avoid a single point of failure on
move operations.</t>
      </section>
      <section anchor="nfsv3-source-dses">
        <name>NFSv3 Source DSes</name>
        <t>When the source mirror is an NFSv3 DS, the PS reads from it
using NFSv3 semantics and writes to the NFSv4.2 destination
using CHUNK semantics.  This is the same pattern
<xref target="I-D.haynes-nfsv4-flexfiles-v2"/> uses for InBand I/O.</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 PS establishes with the MDS, and the
data path clients take through the PS during a proxy
operation.  The session is narrower than the data path --
only the MDS talks to the PS over it, and the MDS has long
been a trusted coordinator in the pNFS model -- but it
carries operations that affect every client whose layouts
reach a PS.  The data path is broader, because it exposes
the PS to every client whose layout has the FFV2_DS_FLAGS_PROXY
flag; a compromised PS on that path has the same observational
and modification reach as a compromised DS, and in the
translating-PS case a larger reach because of the elevated
identity the PS typically runs with.</t>
      <t>The numbered items below name the specific threats the
design either addresses or explicitly leaves out of scope.
The rule on credential forwarding, because it is the most
consequential and the most easily implemented incorrectly,
is expanded in <xref target="sec-credential-forwarding"/>.</t>
      <ol spacing="normal" type="1"><li>
          <t><strong>PS authority.</strong>  A PS in PROXY_ACTIVE sees all client
I/O for the proxied file.  A compromised PS can observe
or modify file data.  Deployments <bcp14>MUST</bcp14> treat PS-capable
hosts as at least as trusted as the DSes they proxy for.
PROXY_REGISTRATION <bcp14>SHOULD</bcp14> be gated by a deployment-level
allowlist; arbitrary hosts that present the op without
prior provisioning <bcp14>SHOULD</bcp14> be rejected.</t>
        </li>
        <li>
          <t><strong>Transport security across the operation.</strong>  The PS's
connections to source and destination DSes are
independent of the client's connection to the PS.  A PS
<bcp14>MAY</bcp14> read from an AUTH_SYS source and write to a TLS
destination (or any other combination).  The PS is
responsible for enforcing the effective security policy
(e.g., do not downgrade encrypted data to a plaintext
DS).</t>
        </li>
        <li>
          <t><strong>Principal binding during a proxy operation.</strong>  For
PS-to-DS traffic (the PS reading source DSes and writing
destination DSes to carry out a MOVE or REPAIR
assignment), the PS presents a principal to those
DSes that they will accept; this is the PS's own service
identity unless constrained delegation or equivalent is
arranged.  Forwarding the client's identity to the peer
DSes for PS-driven data movement is NOT required and is
typically NOT practical (the client is not in the
conversation at that point).  See the Credential
Forwarding and Privilege Boundary section below for the
case of client-initiated file I/O through a translating
PS, where the credential-forwarding rule is different and
stricter.</t>
        </li>
        <li>
          <t><strong>PS impersonation.</strong>  A malicious MDS could register a
hostile entity as a PS.  The existing MDS trust model
already grants the MDS this capability via
CB_LAYOUTRECALL and the ability to issue any layout it
chooses; PROXY_REGISTRATION does not weaken it.  Clients
that require stronger PS identity verification <bcp14>SHOULD</bcp14>
validate the PS's transport-security credentials against
a deployment allowlist.</t>
        </li>
        <li>
          <t><strong>Affinity token.</strong>  prr_affinity is a co-residency
attestation, not an authentication mechanism.  Matching
an affinity token between a PS and a client grants the
client no new access rights; it is used only as input to
PS-selection preferences.  A client cannot elevate
privilege by spoofing an affinity token.</t>
        </li>
        <li>
          <t><strong>Registration lease expiry.</strong>  If a PS's lease expires
mid-operation, the MDS <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 DSes.  The MDS
<bcp14>MUST NOT</bcp14> continue to route client I/O to a PS whose
registration has lapsed.</t>
        </li>
      </ol>
      <section anchor="sec-credential-forwarding">
        <name>Credential Forwarding and the Privilege Boundary</name>
        <t>A translating PS (see <xref target="sec-codec-translation"/>) has
structurally elevated privilege by design.  To perform its
management tasks -- moves, repairs, evacuations,
cross-tenant re-exports -- the deployment grants the PS's
service identity broad access: typically not-root-squashed,
often read/write to every file in the namespace, and session
authority to every DS.  That privilege is intentional.</t>
        <t>A codec-ignorant client that reaches the PS, however, arrives
with its own RPC credentials that the PS 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 PS's own.  If the PS ignores the client's
credentials and issues MDS or DS operations under its own
service identity when translating client I/O, every client
that reaches the PS silently inherits the PS'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 PS is
translating client-initiated file I/O (as distinct from
PS-driven move / repair work, which runs under the PS's own
authority on directives from the MDS).  They form a cohesive
set: credential pass-through (rule 1) is the core
requirement; no-squash-inversion (rule 2) closes the most
common way rule 1 can be implemented incorrectly;
authorization-remains-with-MDS (rule 3) names the
responsibility on the MDS side of the same contract;
service-identity-is-for-the-control-plane (rule 4) draws the
line between the op paths where the PS uses its own
credentials and the op paths where it does not; and the
failure-mode rule (rule 5) specifies the correct refusal
behaviour rather than letting a silent fall-through become
the escape hatch.</t>
        <ol spacing="normal" type="1"><li>
            <t><strong>Credential pass-through.</strong>  The PS <bcp14>MUST</bcp14> present the
client's credentials (RPC auth flavor and principal) on
every MDS or DS operation it issues as a consequence of a
client-initiated request.  Specifically, a client <tt>READ</tt>
that the PS 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 MDS and the <tt>CHUNK_READ</tt> against the DSes.
The PS <bcp14>MUST NOT</bcp14> substitute its own service identity for
client-initiated operations.</t>
          </li>
          <li>
            <t><strong>No squash inversion.</strong>  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 PS), the PS <bcp14>MUST</bcp14> preserve the
squashed identity when forwarding.  The PS <bcp14>MUST NOT</bcp14>
translate a client's squashed credentials back into
unsquashed root, even though the PS's own identity is
typically unsquashed.</t>
          </li>
          <li>
            <t><strong>Authorization remains with the MDS.</strong>  When a client-
initiated operation reaches the MDS over a PS &lt;-&gt; MDS
session, the MDS <bcp14>MUST</bcp14> use the RPC credentials carried on
that compound for authorization and <bcp14>MUST NOT</bcp14> substitute
the PS's session-level identity.  Equivalently: the MDS
performs access-control checks against the forwarded
client credentials, not against the PS's service
identity, for any client-initiated file operation.  The
PS is a translator, not an authority.  This is what
prevents PS deployment from becoming a blanket ACL
override.</t>
          </li>
          <li>
            <t><strong>PS service identity is for the control plane only.</strong>
The PS <bcp14>MAY</bcp14>, and typically <bcp14>MUST</bcp14>, use its own service
identity for:
            </t>
            <ul spacing="normal">
              <li>
                <t>The MDS &lt;-&gt; PS session (the session the PS opens to
the MDS, 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-DS session setup for PS-driven data movement
(reading source DSes, writing destination DSes under
a MOVE assignment the MDS has delivered via
PROXY_PROGRESS).</t>
              </li>
              <li>
                <t>PS housekeeping.</t>
              </li>
            </ul>
            <t>
The PS's service identity <bcp14>MUST NOT</bcp14> be used for
client-initiated file data operations.</t>
          </li>
          <li>
            <t><strong>Failure mode on missing credentials.</strong>  If the PS
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 PS cannot
propagate), the PS <bcp14>MUST</bcp14> reject the client operation with
the equivalent of NFS4ERR_ACCESS (or NFS3ERR_ACCES for
NFSv3 clients).  The PS <bcp14>MUST NOT</bcp14> fall back to serving the
operation under its own identity.</t>
          </li>
        </ol>
        <t>Deployment-level requirements:</t>
        <ul spacing="normal">
          <li>
            <t>PROXY_REGISTRATION <bcp14>MUST</bcp14> be allowlisted.  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 PS and then receiving client-forwarded
credentials.</t>
          </li>
          <li>
            <t>The MDS &lt;-&gt; PS session <bcp14>MUST</bcp14> use RPCSEC_GSS <xref target="RFC7861"/> or
RPC-over-TLS <xref target="RFC9289"/> with mutual authentication.
AUTH_SYS on the MDS &lt;-&gt; PS session is forbidden.</t>
          </li>
          <li>
            <t>Deployments <bcp14>SHOULD</bcp14> audit both the PS's credential-
forwarding behavior (the PS logs what it forwards) and
the MDS's authorization checks (the MDS 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 PS has direct access to whatever credentials
pass through it.  Credential confidentiality collapses the
moment the PS is under adversary control.  Mitigation is
operational: restrict which hosts can register as a PS,
audit PROXY_REGISTRATION events, rotate deployment-level
keys.</t>
          </li>
          <li>
            <t>A deployment that configures a PS to run as root while
the client is root-squashed has already violated rule 2
above; no wire mechanism detects a PS deliberately
mis-implementing credential forwarding.  Deployments
<bcp14>SHOULD</bcp14> verify their PS 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
PS-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 PS that translates client I/O has to know how the MDS's
namespace is shaped: which paths are exported, what filehandle
each path resolves to, how the exports mount within one another.
The PS acquires this information by traversing the MDS's
namespace -- LOOKUP, LOOKUPP, PUTFH, PUTROOTFH, GETFH on the
PS &lt;-&gt; MDS session.</t>
        <t>This traversal cannot always run under forwarded client
credentials: at the point the PS needs to discover a new export
(a client has not yet asked for it, or the PS has just restarted
and has no FH cache) there is no client whose credentials the PS
could forward.  Deployments have two choices for how the PS
acquires namespace shape:</t>
        <ol spacing="normal" type="1"><li>
            <t><strong>Grant a narrow traversal privilege.</strong>  The MDS <bcp14>MAY</bcp14> treat
a registered PS's service identity as authorized for
LOOKUP, LOOKUPP, PUTFH, PUTROOTFH, GETFH, and SEQUENCE on
the PS &lt;-&gt; MDS session without applying the MDS's
export-rule filtering that would normally gate those
names.  This is strictly a structural privilege: it
permits the PS 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 PS
service identity only for control-plane operations.  </t>
            <t>
A deployment that grants this privilege discloses the
MDS's namespace shape to the PS's service identity --
specifically, names that the PS's source address would
not be able to see through the MDS's normal export
filtering.  Deployments <bcp14>SHOULD</bcp14> audit traversal compounds
on registered-PS sessions so the disclosure is reviewable;
the MDS <bcp14>SHOULD</bcp14> log each LOOKUP / GETFH that benefits from
the bypass.</t>
          </li>
          <li>
            <t><strong>Do not grant the privilege.</strong>  The PS is required to
translate every client-originated LOOKUP into a separate
LOOKUP against the MDS under the forwarding client's
credentials, caching only what the client's credentials
authorized the MDS to return.  This eliminates the
namespace-shape disclosure but costs an extra MDS
round-trip per client LOOKUP-miss and leaves the PS
unable to pre-discover exports.</t>
          </li>
        </ol>
        <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 DS+PS case is
that option (1) is expected and the narrower privilege is
acceptable given the PS is already a trusted control-plane
peer of the MDS.</t>
        <t>The traversal privilege is distinct from and narrower than
root_squash bypass.  A forwarded-uid-0 client operation (OPEN,
READ, etc.) under option (1) is still subject to normal
root_squash handling on the PS's source-address rule at the
MDS; the traversal privilege applies only to the six ops
enumerated above.</t>
      </section>
      <section anchor="sec-ps-side-policy-enforcement">
        <name>PS-Side Policy Enforcement (informative)</name>
        <t>A PS implementation <bcp14>MAY</bcp14> perform per-client export-rule
enforcement locally, rejecting operations the MDS would also
reject before forwarding them.  This is a performance
optimization: it keeps bad requests off the PS &lt;-&gt; MDS wire and
lets the PS 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 MDS as the authority
for every client-initiated file operation.  A PS that performs
local enforcement is checking its own cached copy of the MDS's
per-client rules; if the copy is stale, wrong, or absent, the
PS <bcp14>MUST</bcp14> forward the operation and let the MDS decide.  A PS
implementation that declines to perform local enforcement is
conformant with this specification.</t>
        <t>Deployments that want local enforcement need a mechanism for
the PS to acquire the MDS'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> itself be authenticated
against the PS allowlist (the rules are sensitive deployment
policy) and <bcp14>MUST</bcp14> support a refresh path so PSes see rule changes
within a bounded time.</t>
      </section>
    </section>
    <section anchor="sec-implementations">
      <name>Implementations</name>
      <t>This section documents the publicly available implementation
the editors are aware of at the time of writing, in line with
<xref target="RFC7942"/>.</t>
      <section anchor="reffs">
        <name>reffs</name>
        <t>reffs is an open-source NFSv4.2 server, MDS, and erasure-coding
client.  The reffs source ships an MDS, a Proxy Server, and a
multi-codec client harness used as the working implementation
for this draft.  reffs is licensed AGPL-3.0-or-later.</t>
        <t>The PS 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> PS 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 PS poll.</t>
          </li>
          <li>
            <t>Forwarding of LOOKUP, OPEN, READ, WRITE, GETATTR, CLOSE,
LAYOUTGET, GETDEVICEINFO, LAYOUTRETURN, LAYOUTERROR through
the PS to the upstream MDS 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 MDS-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-PS proxying, exercising
the layout-passthrough data path through PS-A and PS-B against a
shared MDS + 6 DSes, 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 codec-encoded write through one PS is recoverable
byte-for-byte through a peer PS that shares the same MDS.</t>
        <t>The matrix:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Path</th>
              <th align="left">Layout</th>
              <th align="left">Codec</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 PS-A proxy listener,
performs a codec-encoded write of a 96 KiB random payload, then
opens the same filehandle through the PS-B proxy listener and
reads it back.  The client's <tt>cmp(1)</tt> of the original payload
and the PS-B-served payload returns no differences in all four
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>The fore-channel NFSv4.2 operations defined in <xref target="sec-new-ops"/>
and <xref target="sec-new-fore-channel"/> -- OP_PROXY_REGISTRATION (93),
OP_PROXY_PROGRESS (94), OP_PROXY_DONE (99), and
OP_PROXY_CANCEL (100) -- follow the convention that NFSv4.2
operation numbers are governed by the publishing document and
do not require a separate IANA registry entry.  The same
convention applies to the new flag bit FFV2_DS_FLAGS_PROXY,
which is an additional bit in the ffv2_ds_flags4 bitmap
defined by <xref target="I-D.haynes-nfsv4-flexfiles-v2"/>; that document
explicitly records its flag-word bitmaps as not
IANA-registered, and any future bit allocations are made by a
document that updates or obsoletes it.</t>
      <t>NFSv4.2 callback operation numbers 17, 18, 19, and 20 (which
the prior version of this document had assigned to
OP_CB_PROXY_MOVE, OP_CB_PROXY_REPAIR, OP_CB_PROXY_STATUS, and
OP_CB_PROXY_CANCEL respectively) are <strong>reserved</strong> by this
document and <bcp14>MUST NOT</bcp14> be reused for any future callback
operation.  The reservation prevents wire-protocol confusion
with implementations of the prior version of this draft.  See
"Major revision (2026-04-26)" for the design context behind
the retirement.</t>
      <t>Following the precedent in
<xref target="I-D.haynes-nfsv4-flexfiles-v2"/> (which in turn follows
<xref target="RFC8435"/>), this document does not establish an IANA
registry for its bit spaces (the <tt>ppa_flags</tt> reserved word in
PROXY_PROGRESS, the <tt>prr_flags</tt> reserved word in
PROXY_REGISTRATION, and FFV2_DS_FLAGS_PROXY); future bit
allocations are made by a document that updates or obsoletes
this one.  Implementations <bcp14>MUST</bcp14> treat unknown bits as
reserved and <bcp14>MUST NOT</bcp14> assign meaning to them locally.</t>
    </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 PS is active on a file.  Two of the four
(chunk_guard4, CHUNK_LOCK) describe what the PS does on the
DS side of the mechanism; the other two (CB_CHUNK_REPAIR,
TRUST_STATEID) describe how MDS-side bookkeeping composes
with a live proxy operation.</t>
      <section anchor="chunkguard4">
        <name>chunk_guard4</name>
        <t>The PS enforces chunk_guard4 CAS on the destination mirror
set on behalf of clients.  The PS <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 PS takes
ownership of the lock on the destination mirror set, and the
MDS-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 MDS <bcp14>MUST NOT</bcp14> issue CB_CHUNK_REPAIR for a
file currently in PROXY_ACTIVE; the PS handles any mid-move
repair internally.  If the MDS 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 MDS selects a PS for a proxy operation, it issues
TRUST_STATEID on the PS for every client layout stateid that
will route through the PS during PROXY_ACTIVE.  On PS
retirement the MDS issues REVOKE_STATEID on the retired PS.
This is the same mechanism <xref target="I-D.haynes-nfsv4-flexfiles-v2"/>
defines for any DS in a tightly coupled deployment.</t>
      </section>
    </section>
    <section 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
(renewal semantics, the affinity match predicate, 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 (MDS 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>
      <ol spacing="normal" type="1"><li>
          <t><strong>Registration renewal semantics.</strong>  Is renewal a fresh
PROXY_REGISTRATION with the same prr_registration_id
(idempotent), or a separate PROXY_RENEW op (lighter-
weight)?  The idempotent-reregistration path keeps the op
count smaller and keeps renewal and first-time
registration on a single code path, at the cost of
carrying codec and affinity fields on every renewal.  A
dedicated PROXY_RENEW op is cheaper on the wire but adds
an op number and a second code path.  The choice mostly
affects implementation complexity, not protocol
expressiveness.</t>
        </li>
        <li>
          <t><strong>Affinity match predicate.</strong>  Is exact equality of
prr_affinity and co_ownerid sufficient, or does the spec
need to define substring / hash matching explicitly?  If
implementation-defined, MDS implementations that pick
different predicates will produce different layouts --
is that acceptable?</t>
        </li>
        <li>
          <t><strong>Multiple concurrent proxies per file.</strong>  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 PS entries in ffs_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>
        </li>
        <li>
          <t><strong>Transitive proxy.</strong>  If a file in PROXY_ACTIVE needs a
second move (e.g., a DS 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 MDS policy rather than a protocol rule.</t>
        </li>
        <li>
          <t><strong>Persistent vs ephemeral MDS operation state.</strong>  Is
operation persistence a <bcp14>SHOULD</bcp14> or a <bcp14>MAY</bcp14>?  Production
deployments probably want <bcp14>SHOULD</bcp14> to avoid restart cost on
large moves; prototypes probably want <bcp14>MAY</bcp14>.</t>
        </li>
        <li>
          <t><strong>Registration as a capability-scoped authority.</strong>  Should
PROXY_REGISTRATION require a separate EXCHGID4 flag (e.g.,
EXCHGID4_FLAG_USE_PROXY_DS) to distinguish proxy-capable
DSes from generic DSes, or is the registration itself the
capability declaration?</t>
        </li>
        <li>
          <t><strong>Richer capability advertising.</strong>  prr_codecs 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>
        </li>
        <li>
          <t><strong>RPCSEC_GSSv3 for translating-proxy credential
forwarding.</strong>  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>
        </li>
        <li>
          <t><strong>DEVICEID_REGISTRATION generalization.</strong>
PROXY_REGISTRATION in this document is a proxy-specific
capability-advertisement op: a DS opens a session to the
MDS and declares that it is proxy-capable, along with
codec-set membership, an affinity token, and a lease.  </t>
          <t>
The same mechanism has broader applicability as a generic
DS -&gt; MDS 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 MDS
to recall all layouts referencing DSes 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 MDS can
preemptively drain a DS 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 (DS -&gt; MDS) 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 MDS -&gt; DS).  A resolution of
this item also settles whether the data-mover draft
introduces a new DS-initiated session or whether the
generalized version does.</t>
        </li>
      </ol>
    </section>
    <section 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 MDS 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>
        <li>
          <t>FH-stamped affinity tokens (not proposed; deviceinfo
already carries the necessary information for client-side
locality shortcuts).</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="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="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="22" month="April" 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 Layout Type Version 2 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-04"/>
        </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="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 2667?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>David Flynn and Trond Myklebust shaped the data-mover
architecture, in particular the split between proxy
registration and MDS-issued directives.</t>
      <t>Brian Pawlowski and Gorry Fairhurst guided this process.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAHcB8WkAA7y961ob2bUu/H9eRW3nhyUi4cZ2km5IZ23aYDc72HgDTlZ2
vjxQSAVULFVpqUrQSneva/mu5buyPd5xmIdSAe6sfMvPkzSS6jAPY47zeMd4
PHZt2c6K3ezjsv5hPT5YlndFlZ0Vy7timV3Xy+ztrPihvJoV2dtyVjTZn4pl
U9ZV9tLlV1fL4m43e/v27qXcrbe5aT2p8jk9c7rMr9vxbb6uimZcXTd3r8fX
9LhrPGl893K84Hc2fNf4q6/cJG+Lm3q53s2aduqm9Gk3+/Fg//zwZzepq6ao
mlWzm7XLVeHKxZL/atqXX331zVc0nGWR72bviqpY5jN3Xy8/3yzr1WI3+1C0
+MTjz87WTVvM/Sxeu8/Fmn6d7mZHVVssq6KlJaBBO9e0eTW9yGd1RYNYF41b
lLvZX9t6Msqaetkui+uG/lrP5Q+a8jxfLMrqZpRN6vm8qNrmb87lq/a2Xu66
bOwy+ldWNPzz7ex7XhH+Shbq/Lae5038fb28yavyH3lLw9ylH+iRy2aRTwr+
tZjn5Ww3m9U3t+vl/7zBp216rXNVvZzTPXcFvTM7ffvmd1//dif8+TL8+Ur/
/Hrnd1/bn19/bdd+8/Lrb/Dn0fhg+8Ht23WurK47L9z5esc/+vWr39A14/E4
y6+adplPaFk/5rQ9s2KWfXh7lg0W9P/D7L5sb7P2tniQ1rJZvq5XrWvXiyJr
VosFbUCTTWYlLfO4KadFRpverJYFrf2U9iCjrcsWRFOT21X1OVsWi7xcuisi
hIKIW+5r+CKisTwTAmy2M9qHssFerrCBWfFDW1TThoaWt0Rfk9uyLSYtXsMj
zjOmX709G3ykqSxrnKWcXnlTEqUtC4yDjkR9zROcF20evZKfnC3q2azp/ZkW
lyk5y5umvKnmftiTfLksC75pntHKZLTG8/qOp55hf7LrZU2/VIWTpcvamm6s
6frliAaH00SHZ9LKHfe3NW7x99FS3pV4mmtu8+WU6JsYAW1g1cxyvsUvZT0t
Jg3zCVtVntIkr+hlbpEv23JSLuggE+3zFPGS5w2RPWgmKyrdsEFZTWYr/pNI
4u6V08cNaVP2Z7Ps49n4/cEZvY/OalnxqchKfnFBm0xvK+g40PNddwmXBW1Y
1WQby1hWs7Lyw1oWzQIcxmGd8LayKtuSxj3NPp6e/PtfLuj/350enp3xbo14
E3DfxzNQF8iRONR8MSt4ZHdljn2IBqdPOTj5cEgz+lDTCs1mV/nks6uJTnk+
tLNLDOQ/ViXIBmuqbyAyI75Tz7blMNHKFhcf8H9tfXFa5FOiXecOymayavi8
MLGBkMHJsjb/TJSymBHvIILgZ2KJX/OSYMGZTzrwEHyaEd1mAz7t/7Ms2utt
4kTDEZFIObnFkvM5uKMB0pn4698Gt227aHZfvMDt+tO23fYCX7xoCv7PvzHP
usDjv+WnD7fdWb1aTvjQFryiZdOsaKw8BJm/nwVRFFEdfbuquq++ocO4ugL/
e4E3j+9vhFm9SGQNiGJMZ6RY0ovdn3Xu7zD3zLMxWp9/4kVD3Zh5OZ3OCud+
BWGyrKc4X3Xl3PnTrC0Da3ODH398lOP+/POQxiqPLhIG6DoMEKsH5srLmm/w
Qk9SbvDmu4s333/68MeL08OP+0enQznARMj9LGlKxDlp6bGO2DmOsAwC/CVi
KzTKKTGQ6SqfEYud5zdEL/x+YbK0rPMCJ6Ns5qCpZnV9TXwCz8HAZYwN2FJD
/H5CR4QpL6M7pterGRG4k6fh+CrD42HfkhDl0edEQcT9iJT8ELexEcsCH4kP
0PLRMRGuQMtGW8ByBFPeWKw50ScdvnNmX0t6Mg1ma4uZ5pjfLddtbTELIgpq
mK/IkSmqenVz62JBQ8OkUV3TcSimKgKiVwbeTPRxX69mU6dMgfhKUzL/Legx
a1lR5s3+bVUdT5kG6vI7nExQHm3RFOqdMjyeGr2bGBFvCq003j2V2ZnEBdMv
mT1herrWc1K7IG+CmDEyvilqohgaW1s7lTdCi/WsnKzprXkDTjeYlzdLESXM
cKvi3igXBwFzokmP5+VyWS/pW2JAeApxENLSqryaFOFRxV0+WeUqybDMTkk1
vyXeiF0mGUUqWcnMccjrhYcV1V25rFkaEJXq49xAxahJOF4AMHhSUyerZdmu
cXb4QOJBepnDF6BOWhxwdagNQ11VYmJLXVQWl0GQ1hWvqbMjFCRn9qTklEeR
+h4EpxAFi0/df5FTebWmE3GT0/pjDUmyzfOZyIDk1dOa5oSXlxBkc/nev9eL
albC6MVNW5JgrooCGhJOfz7l193TIhX+Tj51sVLVLIpJeQ3lJacV2dCgtrZY
h2L6mU5JLIMNgQ20cnZznFxVvxoaDqjRWMmuCkzIVIhTeq4IRBpeHy/DaE1R
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
W19vka4FXwcfS4EMKZCK/wevnMxS3csBAA==

-->

</rfc>
