<?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-01" 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-01"/>
    <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-proxy-server"/>.</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 whole-file repair: the case in which enough
data servers have failed that per-chunk reconstruction would
require visiting every chunk, or in which no live client is
available to drive the repair at all.  The second is layout
transitions: a file must move from one layout geometry to
another for policy reasons (migrating to a new coding type, or
re-mirroring), for maintenance reasons (evacuating a data
server ahead of decommission), or for environmental reasons
(moving between transport-security profiles or between
filehandle backends).  The third is codec translation: 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 proxy server (PS) 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.  A client reaches a proxied
file either by contacting the PS directly, as an ordinary
NFS server, or through a pNFS layout whose data server is
the PS.  While a migration is in progress every client
routes its I/O through the PS; for codec translation, only
a client that cannot encode the file does.</t>
      <t>Flex Files v1 provides no standardized mechanism for migrating
a file's layout while the file remains in use.  Without such
primitives, migration is left to implementation-specific
machinery and cannot be performed safely across
implementations.  This design codifies that mechanism, closing
what is today the single biggest interop gap between pNFS and
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
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 proxy server (PS), 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 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.</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>
        <dl>
          <dt>Journaling and partial moves:</dt>
          <dd>
            <t>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>
          </dd>
          <dt>Orchestration beyond a single proxy:</dt>
          <dd>
            <t>Multi-proxy pipelines (staged moves for very large
files) and automated load balancing or predictive
selection across registered proxies are out of scope.
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>
          </dd>
          <dt>Server-side copy as an alternative path:</dt>
          <dd>
            <t>Integration with server-side copy (<xref target="RFC7862"/> Section 4)
as an alternative to 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>
          </dd>
          <dt>Proxy-internal features that do not surface on the wire:</dt>
          <dd>
            <t>A proxy <bcp14>MAY</bcp14> implement content-integrity and
error-correction layers, encryption and compression
pass-through, log-structured write staging, and
sector-alignment normalisation.  These are useful
motivating scenarios for the move/repair vocabulary but
do not require new protocol surface beyond what the
PROXY_PROGRESS / PROXY_DONE / PROXY_CANCEL fore-channel
set already provides, and so they are left to
implementation rather than standardised here.</t>
          </dd>
        </dl>
      </section>
    </section>
    <section anchor="use-cases">
      <name>Use Cases</name>
      <t>Seven motivating scenarios converge on the same mechanism.
Six of them are transient transitions on the file itself: the
file is changing state (being ingested, re-coded, evacuated,
reconstructed, migrated between transport-security profiles,
or migrated between filehandle backends), and the transition
is what the 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 deviceid in
<tt>proxy_assignment4</tt>; the proxy reshapes the file's shards to
match.  Because the transformation type (encode / decode /
transcode) is entirely specified by the (source, destination)
deviceid pair plus the file's recorded layout type, the
assignment does not need a separate transformation-class
field.</t>
      </section>
      <section anchor="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 failure via PROXY_DONE with
<tt>pd_status</tt> set to <tt>NFS4ERR_PAYLOAD_LOST</tt>, matching the
per-chunk repair semantics in the Repair Client Selection
section of <xref target="I-D.haynes-nfsv4-flexfiles-v2"/>.</t>
      </section>
      <section anchor="tls-coverage-transition">
        <name>TLS Coverage Transition</name>
        <t>A file whose layout currently points at non-TLS-capable 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 persistent per client.  The
file itself is not changing state.  What changes is the layout
the MDS hands to a codec-ignorant client: that client gets a
single-DS layout naming a translating PS, with a coding_type
the client does support (typically FFV2_ENCODING_MIRRORED, or
for NFSv3 clients just a flat NFSv3 data surface).  The proxy
encodes and decodes on the fly against the real 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; only the codec-ignorant case routes through the PS.</t>
        <section anchor="mechanism">
          <name>Mechanism</name>
          <t>A translating proxy runs two sides that meet internally.  On
its client-facing side it speaks the protocol the
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_ENCODING_MIRRORED (or an equivalent codec the client
supports).  On its MDS-facing 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 the DS named
in a single-DS 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="layout-model">
        <name>Layout Model</name>
        <section anchor="single-layout-model">
          <name>Single-Layout Model</name>
          <t>This design uses a single layout naming the PS as the sole
DS 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>
          <t>Routing all client I/O through the PS has a cost deployments
<bcp14>MUST</bcp14> weigh.  For the duration of a migration the PS is a
data-path single point of failure for the file: the client
sees one data server, the PS, and the usual Flex Files
mitigation -- client-side mirroring across several DSes -- is
unavailable to it.  A file under migration therefore has
lower availability than a normally-mirrored file until
PROXY_DONE.  The PS is also a throughput funnel: all client
read and write traffic for the file, plus the PS's own copy
traffic, passes through one PS, adding a latency hop and a
bandwidth bottleneck.  These costs are inherent to the
single-layout choice; they argue against migrating very
large files in a single proxy operation, and motivate the
multi-PS and partial-range extensions listed as out of scope
(<xref target="sec-scope-out"/>).</t>
        </section>
        <section anchor="sec-two-layout-state">
          <name>Two-Layout State on the MDS Side</name>
          <t>For each file F whose mirror on a draining DS D is being
migrated, the MDS keeps three logical layout records.  Only
L3 backs a client-facing layout; L1 and L2 are MDS-internal
bookkeeping for the duration of the migration.</t>
          <dl>
            <dt>L1:</dt>
            <dd>
              <t>the pre-migration mirror set, including D.  This record
is MDS-internal: it preserves what the file's layout was
before the migration and is handed to no client while the
migration is active.</t>
            </dd>
            <dt>L2:</dt>
            <dd>
              <t>the post-migration mirror set: L1 with D replaced by the
target G.  Also MDS-internal; it becomes the file's
layout after the PROXY_DONE swap.</t>
            </dd>
            <dt>L3:</dt>
            <dd>
              <t>the composite the PS works from.  It backs the layout
every client is served during the migration: that
client-facing layout names the PS as its data server, and
the PS does the real I/O against L3's two mirror entries:
</t>
              <ul spacing="normal">
                <li>
                  <t><tt>M1</tt> (read source): the L1 mirror set.  The PS reads
source bytes from any mirror in M1.</t>
                </li>
                <li>
                  <t><tt>M2</tt> (write target): the L1 mirror set PLUS G.  The PS
writes via CSM to every mirror in M2.</t>
                </li>
              </ul>
            </dd>
          </dl>
          <t>During the migration every client of F -- whichever front
door it used -- is served a layout naming the PS; the PS is
the sole writer to M1 and M2.  No client addresses D, E, or G
directly.  Because the PS is the sole writer, it <bcp14>MUST NOT</bcp14>
acknowledge a client write until every mirror in M2 is
durable: an acknowledged write has reached the whole target
set, so a PS crash cannot leave a write acknowledged to the
client but applied to only part of the mirror set.</t>
          <t>D's presence in M2 (alongside G) is intentional: the PS keeps
D a current mirror until the PROXY_DONE swap, so a cancelled
migration can fall back to L1 with no data loss.  The PS
writes both D and G, and because the PS is the only writer
they converge to the same byte image with no inter-writer
race.</t>
          <t>A source mirror <bcp14>MAY</bcp14> be an NFSv3 DS.  When it is, the PS
reads from it using NFSv3 semantics and writes the NFSv4.2
destination using CHUNK semantics; the asymmetric-protocol
bridging is the PS's responsibility and is not visible to
the client.</t>
        </section>
        <section anchor="pinned-definitions">
          <name>Pinned definitions</name>
          <ul spacing="normal">
            <li>
              <t>L1.mirrors = the file's pre-migration mirror set, includes D</t>
            </li>
            <li>
              <t>L2.mirrors = (L1.mirrors \ {D}) union {G}</t>
            </li>
            <li>
              <t>L3.M1 = L1.mirrors  (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>
      <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
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; 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_deviceid)</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 a single-DS
layout naming the PS; clients route CHUNK I/O to that DS.  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)
  | <--- reg_id, granted_lease ---- |
  |                                 |
  | ---- PROXY_PROGRESS ----------> | (heartbeat poll)
  | <--- NFS4_OK, ppr_assignments   | (zero or more entries; one
  |       includes MOVE assignment  |  delivers the MOVE work)
  |                                 |
  | ---- OPEN(pa_file_fh) --------> | (PS picks up the work)
  | ---- LAYOUTGET (L3 composite) > |
  |                                 |
  |  [PS drives move: reads source  |
  |   DSes, encodes per destination |
  |   codec, writes destination     |
  |   DSes via L3 fan-out]          |
  |                                 |
  | ---- PROXY_PROGRESS ----------> | (heartbeat; lease renewal,
  | <--- NFS4_OK, ppr_lease_rem.... |  no new assignment needed)
  |                                 |
  |  ...                            |
  |                                 |
  | ---- SEQUENCE                   |
  |      PUTFH(pa_file_fh)          |
  |      LAYOUTRETURN(L3_stid)      |
  |      PROXY_DONE(L3_stid, OK) -> | (terminal: commit L1 -> L2)
  | <--- NFS4_OK ------------------ |
  |                                 |
  |                                 | --- CB_LAYOUTRECALL --->
  |                                 |     (to clients holding L1)
  |                                 |
  |                                 | <-- LAYOUTRETURN ------
  |                                 |     (from each client)
  |                                 |
  |                                 | (MDS retires source DSes;
  |                                 |  next LAYOUTGET on this
  |                                 |  file returns L2)
  v                                 v
]]></artwork>
        </figure>
      </section>
      <section anchor="message-sequence-whole-file-repair">
        <name>Message Sequence: Whole-File Repair</name>
        <t>Same shape as a move, but the assignment in PROXY_PROGRESS
carries <tt>pa_kind = PROXY_OP_REPAIR</tt> and the source layout is
degraded.  Terminal outcomes:</t>
        <ul spacing="normal">
          <li>
            <t><tt>NFS4_OK</tt> in <tt>pd_status</tt>: the PS reconstructed the file;
the MDS proceeds as in <xref target="fig-seq-policy-move"/>.</t>
          </li>
          <li>
            <t><tt>NFS4ERR_PAYLOAD_LOST</tt> in <tt>pd_status</tt>: fewer than k
shards survived across the mirror set; the 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>
        <dl>
          <dt>Assignment not yet acknowledged by the PS:</dt>
          <dd>
            <t>The MDS includes a <tt>PROXY_OP_CANCEL_PRIOR</tt> assignment in
the next PROXY_PROGRESS reply, naming the same
<tt>(pa_file_fh, pa_target_deviceid)</tt> pair as the prior MOVE
/ REPAIR assignment.  The PS, which has not yet OPEN'd
the file, simply drops the prior assignment from its
in-flight queue.</t>
          </dd>
          <dt>Assignment acknowledged and in flight:</dt>
          <dd>
            <t>The 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>
          </dd>
        </dl>
        <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 pa_file_fh/target)
  |                                 |
  |  [PS drops the prior assignment |
  |   from its in-flight queue;     |
  |   no PROXY_DONE / PROXY_CANCEL  |
  |   is issued for this work]      |
  v                                 v
]]></artwork>
        </figure>
      </section>
    </section>
    <section anchor="sec-new-ops">
      <name>New NFSv4.2 Operations</name>
      <t>This document defines 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 (95) commits
or rolls back an individual migration when the PS finishes
it; PROXY_CANCEL (96) lets the PS abort early.  None of
these operations is sent by pNFS clients.</t>
      <figure anchor="fig-proxy-server-opnums">
        <name>Proxy server operation numbers</name>
        <sourcecode type="xdr"><![CDATA[
/// /* New operations for the proxy server (PS -> MDS) */
///
/// OP_PROXY_REGISTRATION   = 93;
/// OP_PROXY_PROGRESS       = 94;
/// OP_PROXY_DONE           = 95;
/// OP_PROXY_CANCEL         = 96;
]]></sourcecode>
      </figure>
      <t>Opcodes 93 through 96 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).</t>
      <t>The following amendment blocks extend the nfs_argop4 and
nfs_resop4 dispatch unions from <xref target="RFC7863"/> with the new ops.
A consumer that combines this document's extracted XDR with the
<xref target="RFC7863"/> XDR applies the amendments at the unions' extension
point.</t>
      <figure anchor="fig-nfs_argop4-amend">
        <name>nfs_argop4 amendment block</name>
        <sourcecode type="xdr"><![CDATA[
/// /* nfs_argop4 amendment block */
///
/// case OP_PROXY_REGISTRATION:
///     PROXY_REGISTRATION4args opproxyregistration;
/// case OP_PROXY_PROGRESS:
///     PROXY_PROGRESS4args opproxyprogress;
/// case OP_PROXY_DONE:
///     PROXY_DONE4args opproxydone;
/// case OP_PROXY_CANCEL:
///     PROXY_CANCEL4args opproxycancel;
]]></sourcecode>
      </figure>
      <figure anchor="fig-nfs_resop4-amend">
        <name>nfs_resop4 amendment block</name>
        <sourcecode type="xdr"><![CDATA[
/// /* nfs_resop4 amendment block */
///
/// case OP_PROXY_REGISTRATION:
///     PROXY_REGISTRATION4res opproxyregistration;
/// case OP_PROXY_PROGRESS:
///     PROXY_PROGRESS4res opproxyprogress;
/// case OP_PROXY_DONE:
///     PROXY_DONE4res opproxydone;
/// case OP_PROXY_CANCEL:
///     PROXY_CANCEL4res opproxycancel;
]]></sourcecode>
      </figure>
      <section anchor="sec-proxy-stateid">
        <name>proxy_stateid4: A New Stateid Type</name>
        <t>This document introduces <tt>proxy_stateid4</tt>, a new server-issued
stateid type used as the canonical handle for an in-flight
proxy migration.  The wire shape reuses the standard NFSv4
<tt>stateid4</tt> from <xref target="RFC8881"/> S3.3.12; no new XDR type is added:</t>
        <figure anchor="fig-proxy_stateid4">
          <name>proxy_stateid4 wire shape</name>
          <sourcecode type="xdr"><![CDATA[
/// typedef stateid4  proxy_stateid4;
]]></sourcecode>
        </figure>
        <section anchor="value-space">
          <name>Value Space</name>
          <t>The proxy_stateid value space is disjoint from the open,
lock, layout, and delegation stateid value spaces defined in
<xref target="RFC8881"/>.  Disjointness is enforced by context, not by an in-band tag.
A <tt>proxy_stateid4</tt> appears in exactly four places: the
PROXY_PROGRESS, PROXY_DONE, and PROXY_CANCEL arguments, and
the <tt>open_claim_proxy4</tt> operand of an <tt>OPEN(CLAIM_PROXY)</tt>
(<xref target="sec-claim-proxy"/>) -- where it is carried inside the open
claim, not in a stateid argument slot.  An implementation
<bcp14>MUST NOT</bcp14> use an open, lock, layout, or delegation stateid
lookup table to resolve a proxy_stateid.  Conversely, a
leaked proxy_stateid presented in the stateid argument of an
ordinary operation (e.g., READ, WRITE, SETATTR, CLOSE) <bcp14>MUST</bcp14>
be rejected with NFS4ERR_BAD_STATEID.</t>
        </section>
        <section anchor="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 as the
<tt>pa_stateid</tt> field of the <tt>proxy_assignment4</tt> carried in the
next PROXY_PROGRESS reply (<xref target="sec-PROXY_PROGRESS"/>).</t>
          <t>The 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.  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 not sufficient to drive
PROXY_DONE or PROXY_CANCEL on the corresponding migration.
The MDS additionally validates that the calling session's
registered-PS identity owns that migration (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 Proxy Server</name>
        <section anchor="arguments">
          <name>ARGUMENTS</name>
          <figure anchor="fig-PROXY_REGISTRATION4args">
            <name>XDR for PROXY_REGISTRATION4args</name>
            <sourcecode type="xdr"><![CDATA[
/// struct PROXY_REGISTRATION4args {
///     ffv2_coding_type4  prr_codecs<>;
///     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_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> authorize
the caller as a registered PS for this MDS.  How that
authorization is established -- a deployment allowlist, a
per-MDS provisioning step, integration with a directory
service, or any other mechanism -- is implementation.  The
MDS <bcp14>MUST</bcp14> reject an unauthorized PROXY_REGISTRATION with
NFS4ERR_PERM.</t>
          <t>The authorization <bcp14>MUST</bcp14> be applied to a cryptographically
authenticated identity, per the MDS &lt;-&gt; PS transport-
security requirements in <xref target="sec-credential-forwarding"/>.
AUTH_SYS is never sufficient for PROXY_REGISTRATION; 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 authorized 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;
///     deviceid4         pa_source_deviceid;
///     deviceid4         pa_target_deviceid;
///     opaque            pa_descriptor<>;
/// };
///
/// struct PROXY_PROGRESS4resok {
///     uint32_t              ppr_lease_remaining_sec;
///     proxy_assignment4     ppr_assignments<>;
/// };
///
/// union PROXY_PROGRESS4res switch (nfsstat4 ppr_status) {
/// case NFS4_OK:
///     PROXY_PROGRESS4resok ppr_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 DSes
the migration moves data between
(<tt>pa_source_deviceid</tt> / <tt>pa_target_deviceid</tt>), and a
kind-specific opaque descriptor (<tt>pa_descriptor&lt;&gt;</tt>) for future
extensions (for example, a precomputed source-layout
descriptor so the 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 presents it in the
<tt>OPEN(CLAIM_PROXY)</tt> that binds it to the file
(<xref target="sec-claim-proxy"/>) and references it as the handle in the
eventual PROXY_DONE / PROXY_CANCEL.</t>
          <t>The <tt>pa_kind</tt> discriminates the work type:</t>
          <dl>
            <dt><tt>PROXY_OP_MOVE</tt>:</dt>
            <dd>
              <t>drain or migrate the file's data between the named DSes.
<tt>pa_stateid</tt> is the proxy_stateid the PS will reference
in PROXY_DONE / PROXY_CANCEL.</t>
            </dd>
            <dt><tt>PROXY_OP_REPAIR</tt>:</dt>
            <dd>
              <t>reconstruct a missing or corrupt mirror on
<tt>pa_target_deviceid</tt> from the surviving mirrors.
<tt>pa_stateid</tt> is the proxy_stateid the PS will reference
in PROXY_DONE / PROXY_CANCEL.</t>
            </dd>
            <dt><tt>PROXY_OP_CANCEL_PRIOR</tt>:</dt>
            <dd>
              <t>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>
            </dd>
          </dl>
          <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>
      <dl>
        <dt><tt>PROXY_DONE</tt> (op 95):</dt>
        <dd>
          <t>PS reports terminal success or failure on a specific
in-flight migration.  The MDS uses the ppd_status to
atomically commit (success: swap the file's active layout
from L1 to L2) or roll back (failure: keep L1, drop
L2/G).</t>
        </dd>
        <dt><tt>PROXY_CANCEL</tt> (op 96):</dt>
        <dd>
          <t>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>
        </dd>
      </dl>
      <t>Both operations identify the affected migration by layout
stateid.  The PS acquired this stateid earlier when it issued
LAYOUTGET against the migration layout (L3) for this file; the
MDS keys its in-flight migration record on the
<tt>(clientid, pa_file_fh, layout_stid)</tt> triple.  No new stateid type
is required.</t>
      <section anchor="sec-PROXY_DONE">
        <name>Operation 95: 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"/>).  A <tt>pd_status</tt> of <tt>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(pa_file_fh) LAYOUTRETURN(L3_stateid) PROXY_DONE(pd_stateid, status)
</tt></t>
          <t>LAYOUTRETURN runs FIRST per <xref target="RFC8881"/> S18.51, releasing the
PS's reference to the L3 layout cleanly via the standard
mechanism.  PROXY_DONE then operates on the in-flight
migration record keyed by the proxy_stateid; the
record is the single source of truth for migration state, so
PROXY_DONE remains valid even though L3 has just been
returned.  The 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</tt> set).
Otherwise: <tt>NFS4ERR_PERM</tt>.</t>
              </li>
              <li>
                <t><tt>pd_stateid.other</tt> was minted in the current
(server_state, boot_seq) tuple.  A proxy_stateid minted in
a prior boot returns <tt>NFS4ERR_STALE_STATEID</tt>.</t>
              </li>
              <li>
                <t><tt>pd_stateid.other</tt> identifies a proxy operation currently
in flight at the MDS.  Otherwise: <tt>NFS4ERR_BAD_STATEID</tt>.</t>
              </li>
              <li>
                <t>The proxy operation identified by <tt>pd_stateid</tt> is owned by
the calling session's registered-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, not 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) is the
<tt>pa_file_fh</tt> of the proxy operation identified by
<tt>pd_stateid</tt>.  Otherwise: <tt>NFS4ERR_BAD_STATEID</tt>.</t>
              </li>
              <li>
                <t><tt>pd_stateid.seqid</tt> matches the 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 a <tt>pd_status</tt> of <tt>NFS4_OK</tt>: commits the migration --
promotes L2 to be the file's layout (D dropped, G promoted),
drops L1 and L3, issues CB_LAYOUTRECALL on the prior layout
to external clients still holding cached L1 references, and
defers final removal of the decommissioned mirror D until
all L1 holders return their layouts.  See
<xref target="sec-atomic-commit"/> for the full mechanics.</t>
              </li>
              <li>
                <t>For any other <tt>pd_status</tt>: leaves the file's layout
unchanged -- L1 stays in force; L2 and L3 are discarded.
No CB_LAYOUTRECALL is needed (external clients never saw
the post-image).  The PS owns cleanup of any half-written
data it placed on the target G.</t>
              </li>
            </ul>
            <t>In both cases the MDS retires the proxy operation; <tt>pd_stateid</tt>
is thereafter invalid.</t>
            <t>Atomicity is critical: external client traffic must transition
cleanly across this op; either the per-instance deltas commit
fully or they do not commit at all.</t>
          </section>
        </section>
      </section>
      <section anchor="sec-PROXY_CANCEL">
        <name>Operation 96: 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(pa_file_fh) LAYOUTRETURN(L3_stateid) PROXY_CANCEL(pc_stateid)
</tt></t>
          <t>LAYOUTRETURN runs first (standard <xref target="RFC8881"/> S18.51 release
of the L3 layout); PROXY_CANCEL then operates on the
in-flight migration record only.</t>
          <section anchor="authorization-2">
            <name>Authorization</name>
            <t>The same priority-ordered validation as PROXY_DONE
(<xref target="sec-PROXY_DONE"/>) applies, with <tt>pc_stateid</tt> substituted
for <tt>pd_stateid</tt>.  In particular, the registered-PS identity
that owns the proxy operation identified by <tt>pc_stateid</tt> <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, layout-side effects mirror PROXY_DONE
with a failing <tt>pd_status</tt> -- L1 stays in force; L2 and L3 are
discarded; the half-filled target G is the PS's to clean up.
The MDS retires the proxy operation, invalidates <tt>pc_stateid</tt>,
and (informatively) updates its operator-facing telemetry to
record the cancellation.  No CB_LAYOUTRECALL is needed.</t>
            <t>The distinction between PROXY_DONE(FAIL) and PROXY_CANCEL is
purely intent / accounting: PROXY_DONE(FAIL) records that the
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>When multiple PSes are registered against the same MDS, the
MDS coordinates assignment fan-out under one hard invariant:
at any time, at most one migration <bcp14>MUST</bcp14> be in flight for a
given <tt>(pa_file_fh, pa_target_deviceid)</tt> pair.  The MDS <bcp14>MUST NOT</bcp14>
assign a migration whose <tt>(pa_file_fh, pa_target_deviceid)</tt> matches
that of an in-flight migration.</t>
      <t>How the MDS chooses among eligible PSes -- by load, locality,
fault domain, capability match, or any combination -- is an
implementation matter.  The protocol constrains only the
outcome: the PS that receives the assignment is registered at
delivery time, and the <tt>(pa_file_fh, pa_target_deviceid)</tt> invariant
holds.</t>
      <t>When a registered PS loses its session -- its lease expires,
or a competing PS takes its registration slot in a squat --
the MDS <bcp14>MUST</bcp14> treat each migration the PS had in flight as if
PROXY_DONE(FAIL) had been issued: L1 stays in force, L2 and
L3 are discarded.  The MDS <bcp14>MAY</bcp14> then reassign the work to
another eligible PS; the <tt>(pa_file_fh, pa_target_deviceid)</tt>
invariant continues to hold across reassignment.</t>
      <t>A PS that reconnects with the same <tt>client_owner4</tt>, and so
recovers the same <tt>clientid</tt> via EXCHANGE_ID, retains
ownership of its in-flight migrations; no reassignment is
needed.  The PS reclaims its layouts via the MDS-recovery
path in <xref target="sec-mds-recovery"/>.</t>
      <t>A host that does not implement the proxy server role simply
does not call PROXY_REGISTRATION and is never selected for
a MOVE or REPAIR assignment.  A deployment with no
registered 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="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>On a LAYOUTGET, the MDS chooses one of three outcomes:</t>
      <ul spacing="normal">
        <li>
          <t>A direct-DS layout, when no proxy operation is in flight
for the file and the client's coding-type support set
includes the file's coding.  This is the unchanged FFv2
path.</t>
        </li>
        <li>
          <t>A single-DS layout naming the PS, when a MOVE or REPAIR
migration is in flight for the file, or when the client's
coding-type support set does not include the file's coding
and a registered PS can translate.  The client uses this
layout as it would any FFv2 layout, sending CHUNK ops to
the named DS; the PS internally dispatches reads and
writes to the source and destination DSes.</t>
        </li>
        <li>
          <t><tt>NFS4ERR_CODING_NOT_SUPPORTED</tt> (see
<xref target="I-D.haynes-nfsv4-flexfiles-v2"/>), when the client's
coding-type support set does not include the file's coding
and no registered PS can translate.</t>
        </li>
      </ul>
      <t>A client that supports FFv2 -- which is the precondition for
any of this -- needs no proxy-specific code: the proxy case
arrives as a single-DS layout, indistinguishable from any
other FFv2 layout.</t>
      <section anchor="sec-atomic-commit">
        <name>Atomic commit on PROXY_DONE</name>
        <t>When the PS issues <tt>PROXY_DONE(pd_stateid, pd_status=NFS4_OK)</tt>,
the MDS atomically (in one transaction):</t>
        <ol spacing="normal" type="1"><li>
            <t>Promotes L2 to be the file's layout (D dropped, G promoted)</t>
          </li>
          <li>
            <t>Drops L1 and L3 from the file's layout records</t>
          </li>
          <li>
            <t>Retires the in-flight migration record</t>
          </li>
          <li>
            <t>Issues CB_LAYOUTRECALL for the file's outstanding
client-facing (PS-naming) layouts</t>
          </li>
          <li>
            <t>Defers <tt>REMOVE_MIRROR(D)</tt> until those layouts are returned</t>
          </li>
        </ol>
        <t>On its next LAYOUTGET each client receives the post-migration
layout (L2): the real DSes, with no PS.</t>
        <t>When PROXY_DONE indicates failure (or PROXY_CANCEL is issued):</t>
        <ol spacing="normal" type="1"><li>
            <t>L1 is promoted unchanged -- the file falls back to its
pre-migration mirror set</t>
          </li>
          <li>
            <t>L2 is dropped; the half-filled G instance is internally
unlinked</t>
          </li>
          <li>
            <t>L3 is dropped and the migration record retired</t>
          </li>
          <li>
            <t>CB_LAYOUTRECALL is issued for the PS-naming layouts; on the
next LAYOUTGET clients receive L1</t>
          </li>
        </ol>
      </section>
      <section anchor="the-swap-window">
        <name>The swap window</name>
        <t>Because every client wrote through the PS, no client ever
addressed D directly, and there are no client writes in flight
to D when the swap occurs.  The deferred <tt>REMOVE_MIRROR(D)</tt>
covers only the PS's own trailing writes: by the time it
issues PROXY_DONE the PS, as the sole writer, has quiesced its
M2 fan-out, so the deferral window is short and contains no
client-visible activity.</t>
        <t>A client holding a PS-naming layout when CB_LAYOUTRECALL
arrives returns it and re-LAYOUTGETs in the usual way.
In-flight client I/O to the PS across that boundary is handled
by the in-flight-I/O rules for a PS change (see "In-Flight I/O
When the PS Changes").</t>
      </section>
      <section anchor="sec-claim-proxy">
        <name>The CLAIM_PROXY open claim</name>
        <t>The PS opens the file with a new OPEN claim, <tt>CLAIM_PROXY</tt>.
A bare <tt>OPEN(CLAIM_NULL)</tt> cannot serve here: it would be
indistinguishable from an ordinary or racing OPEN on the
registered-PS session, leaving the MDS to infer proxy intent
from session state -- which it cannot do reliably.
<tt>CLAIM_PROXY</tt> makes the proxy OPEN explicit and carries, in
one step, what the MDS needs to bind the PS to the file.</t>
        <t><tt>open_claim_type4</tt> gains one enumerant and <tt>open_claim4</tt> one
union arm:</t>
        <figure anchor="fig-claim-proxy">
          <name>The CLAIM_PROXY open claim</name>
          <sourcecode type="xdr"><![CDATA[
/// /* New OPEN claim for a proxy server; extends the
///    open_claim_type4 enumeration of [RFC8881]. */
///
/// const CLAIM_PROXY = 7;
///
/// struct open_claim_proxy4 {
///         proxy_stateid4  ocp_proxy_stateid;
///         nfs_fh4         ocp_ps_fh;
/// };
///
/// /* open_claim4 gains the arm:
///         case CLAIM_PROXY:
///                 open_claim_proxy4       ocp_proxy;
///  */
]]></sourcecode>
        </figure>
        <t><tt>CLAIM_PROXY</tt> is filehandle-based and opens an existing file:
the PS issues <tt>PUTFH</tt> of the assignment's <tt>pa_file_fh</tt>
followed by <tt>OPEN(CLAIM_PROXY)</tt>, with no directory filehandle
and no component name, in the manner of <tt>CLAIM_FH</tt>.
<tt>CLAIM_PROXY</tt> <bcp14>MUST NOT</bcp14> be combined with <tt>OPEN4_CREATE</tt>.</t>
        <t>The operand carries two values:</t>
        <dl>
          <dt><tt>ocp_proxy_stateid</tt>:</dt>
          <dd>
            <t>the <tt>proxy_stateid4</tt> the MDS minted for this assignment
and returned in the PROXY_PROGRESS work assignment
(<xref target="sec-PROXY_PROGRESS"/>).  It is the correlator that
identifies this OPEN as the proxy OPEN for a specific
assignment; the MDS does not infer proxy intent from the
session.</t>
          </dd>
          <dt><tt>ocp_ps_fh</tt>:</dt>
          <dd>
            <t>the filehandle under which the PS will serve the file to
clients: the data-server filehandle that appears in the
layout the MDS hands a codec-incapable client, and the
filehandle a non-pNFS client obtains by LOOKUP against
the PS.  Only the PS can mint this filehandle; it is
opaque to the MDS, which records it and copies it
verbatim into the layouts it issues.  Carrying it in the
OPEN binds it atomically with the proxy OPEN.</t>
          </dd>
        </dl>
        <t>The MDS <bcp14>MUST</bcp14> verify that <tt>ocp_proxy_stateid</tt> is valid, that
it names an outstanding assignment, that the assignment was
made to the calling clientid, and that the current
filehandle is that assignment's file.  An invalid or stale
stateid draws <tt>NFS4ERR_BAD_STATEID</tt>.</t>
        <t>A PS <bcp14>MUST NOT</bcp14> issue <tt>OPEN(CLAIM_PROXY)</tt> unless it holds a
successful PROXY_REGISTRATION (<xref target="sec-PROXY_REGISTRATION"/>);
successful registration is what establishes that the MDS
implements this extension.</t>
        <t><tt>OPEN(CLAIM_PROXY)</tt> returns the ordinary OPEN result: an open
stateid, and an <tt>open_delegation4</tt> which the MDS <bcp14>MUST</bcp14> set to
<tt>OPEN_DELEGATE_NONE</tt> -- a delegation to the PS would conflict
with the migration the PS is itself driving.  The PS opens
with <tt>OPEN4_SHARE_ACCESS_BOTH</tt> and <tt>OPEN4_SHARE_DENY_NONE</tt>.
A retransmitted or re-issued <tt>OPEN(CLAIM_PROXY)</tt> is handled
exactly as for any other claim: the session replay cache
absorbs retransmits, and a genuine repeated OPEN by the same
open-owner is an ordinary share-state operation.</t>
        <t>The PS then obtains the L3 composite layout with an ordinary
LAYOUTGET; the MDS serves L3 because the calling clientid
holds an in-flight migration record for the file.  The L3
layout stateid is a normal NFSv4 layout stateid, used for
CHUNK / WRITE / READ I/O against the source and target DSes
in the standard way.  It is distinct from <tt>proxy_stateid4</tt>
(<xref target="sec-proxy-stateid"/>), which is a control-plane handle for
the migration as a whole and is never presented to LAYOUTGET;
the MDS keys its in-flight migration record on the
proxy_stateid.  Separating the two -- one for I/O on a
layout, one for the migration -- keeps the migration record's
lifetime independent of any LAYOUTGET / LAYOUTRETURN cycle
the PS performs during the byte-shoveling phase.</t>
      </section>
      <section anchor="drain-interaction">
        <name>Drain interaction</name>
        <t>The DRAINING state on D is observable to external
clients only through the absence of new layouts naming D:
while D is DRAINING, the MDS does not place D in any new
mirror set.  Before the migration becomes active for an
existing file whose layout names D, the MDS issues
CB_LAYOUTRECALL on every outstanding layout for the file
whose mirror set includes D.  Once those layouts have been
returned -- or administratively revoked when a client's CB
back-channel fails to ack within the recall window -- the
migration is in flight.</t>
        <t>From that point until the assigned PS completes its
<tt>OPEN(CLAIM_PROXY)</tt> (<xref target="sec-claim-proxy"/>) and registers the
filehandle under which it will serve the file, the MDS cannot
yet build a client-facing layout, and answers every LAYOUTGET
for the file with <tt>NFS4ERR_DELAY</tt>; clients retry.  This window
<bcp14>MUST</bcp14> be bounded: if the assigned PS does not complete its
<tt>OPEN(CLAIM_PROXY)</tt> within a deadline tied to its registration
lease, the MDS reassigns or abandons the assignment and stops
returning <tt>NFS4ERR_DELAY</tt>.  Once the PS has opened, subsequent
LAYOUTGETs for the file return a layout naming the PS.</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 per-instance deltas on the file's
existing layout records, rather than as a complete L2/L3 pair.</t>
        <t>In this informative model, each migration record carries an
array of per-instance deltas, each delta describing a
transformation on one position within one segment of
<tt>layout_segments</tt>.  Four instance states are useful:</t>
        <dl>
          <dt><tt>STABLE</tt>:</dt>
          <dd>
            <t>unchanged; client writes go here directly.</t>
          </dd>
          <dt><tt>DRAINING</tt>:</dt>
          <dd>
            <t>a slot being decommissioned; under omit-and-replace, the
LAYOUTGET view-build path omits this slot and replaces
it with the matching INCOMING.</t>
          </dd>
          <dt><tt>INCOMING</tt>:</dt>
          <dd>
            <t>a new slot the PS is filling; under omit-and-replace, the
LAYOUTGET view-build path emits this slot in place of the
matching DRAINING.</t>
          </dd>
          <dt><tt>INTERPOSED</tt>:</dt>
          <dd>
            <t>a slot whose visible endpoint is the 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>
          </dd>
        </dl>
        <t>The current published layout (<tt>layout_segments</tt>) is built
through the deltas: when LAYOUTGET runs while a migration
is active, the layout-build path consults the migration
record and emits the during-migration view by applying the
deltas to the base segments.  <tt>layout_segments</tt> itself is
never mutated until <tt>PROXY_DONE(NFS4_OK)</tt> collapses the
deltas into the base records permanently.</t>
        <t>This per-instance model and the L1/L2/L3 swap model agree on
the wire-visible behavior in the simplest case (single mirror
replacement, omit-and-replace).  The wire ops in this draft
do not require either implementation; 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 anchor="client-behavior">
      <name>Client Behavior</name>
      <t>During a proxy operation the layout the MDS hands a client is
a single-DS FFv2 layout naming the PS.  The client treats it
as any other FFv2 layout, sending CHUNK ops to the named DS
under its existing layout stateid.  Nothing in the client's
path distinguishes "the DS is a PS" from "the DS is a real
data server"; that distinction lives entirely on the MDS
side.</t>
      <t>The PS accepts those CHUNK ops under the client's existing
layout 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 -- if the proxy
operation has completed -- the real DSes directly.</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 DS(es) the new layout names: a replacement
PS, or the real DSes if the proxy operation has completed.</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 states and the principal
transitions, including the failure exits from ASSIGNED and
PROXY_ACTIVE back to READY.  The Transitions table that
follows enumerates each transition with its trigger and
effect.</t>
      <figure anchor="fig-state-machine">
        <name>File state during a proxy operation</name>
        <artwork><![CDATA[
            (admin, policy, repair, or maintenance trigger)
                               |
                               v
                         +------------+
                         |   READY    |
                         | source     |
                         | layout     |
                         | only       |
                         +-----+------+
                               |
                               | MDS selects registered PS;
                               | queues a proxy_assignment4
                               | for delivery in next
                               | PROXY_PROGRESS reply
                               v
                         +--------------+
                         |   ASSIGNED   |---> back to READY on
                         | MDS has the  |     cancellation
                         | in-flight    |     (MDS-initiated, or
                         | record; PS   |     lease expires before
                         | has not yet  |     the PS picks up)
                         | OPEN'd file  |
                         +-----+--------+
                               |
                               | PS picks up the assignment:
                               | OPEN(pa_file_fh) + LAYOUTGET
                               | (L3 composite layout)
                               v
                         +--------------+
                         | PROXY_ACTIVE |---> back to READY on
                         | clients see  |     PROXY_DONE(FAIL),
                         | single-DS    |     PROXY_CANCEL, or
                         | layout       |     PS lease expiry;
                         | naming PS;   |     layout reverts to L1
                         | PS drives    |
                         | source->dest |
                         +-----+--------+
                               |
                               | PS issues SEQUENCE
                               | PUTFH LAYOUTRETURN
                               | PROXY_DONE(stid, OK)
                               v
                         +------------+
                         | COMMITTING |
                         | MDS issues |
                         | CB_LAYOUT- |
                         | RECALL for |
                         | old layout |
                         +-----+------+
                               |
                               | all clients have
                               | LAYOUTRETURNed
                               v
                         +------------+
                         |   DONE     |
                         | new layout |
                         | live;      |
                         | source     |
                         | DSes       |
                         | retired    |
                         +------------+
]]></artwork>
      </figure>
      <section anchor="transitions">
        <name>Transitions</name>
        <table>
          <thead>
            <tr>
              <th align="left">From</th>
              <th align="left">To</th>
              <th align="left">Trigger</th>
              <th align="left">Actions</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">READY</td>
              <td align="left">ASSIGNED</td>
              <td align="left">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 <tt>OPEN(CLAIM_PROXY)</tt> + LAYOUTGET against <tt>pa_file_fh</tt>; MDS begins serving clients a layout naming the PS</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 a failing <tt>pd_status</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.</t>
        <t>Before the replacement PS's layout becomes live, the MDS
<bcp14>MUST</bcp14> fence the failed PS: it revokes the failed PS's L3
layout stateid (REVOKE_STATEID) and, where the DS protocol
supports it, fences the failed PS at the source and target
DSes.  Fencing closes the window in which a delayed write
from a failed-but-not-dead PS could land after the
replacement PS has taken over -- a two-PS instance of the
write race the single-writer model otherwise prevents.  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>A second PS failure on the same operation <bcp14>SHOULD</bcp14> escalate to
deployment management rather than trigger another automatic
replacement.  Recurring failures across multiple PSes
indicate an environmental issue no PS can work around -- an
unreachable source DS, a misconfiguration, or a starved
replacement pool -- that operator attention will resolve
sooner than another retry.</t>
      </section>
      <section anchor="source-ds-crash-during-proxyactive">
        <name>Source DS Crash During PROXY_ACTIVE</name>
        <t>A source DS crash reduces the PS's read parallelism but does
not block forward progress as long as the erasure code can
still reconstruct the file from the surviving source DSes.
If the source set degrades past reconstructibility, the
operation transitions to whole-file repair semantics
automatically: ranges that can still be reconstructed
succeed; ranges that cannot terminate the operation with
NFS4ERR_PAYLOAD_LOST.</t>
      </section>
      <section anchor="destination-ds-crash-during-proxyactive">
        <name>Destination DS Crash During PROXY_ACTIVE</name>
        <t>A destination DS crash is handled as a normal DS failure on
the destination side.  The PS, acting as a client to the
destination DSes, reports 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, and 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 PS's recovery extends
the standard NFSv4.1 client-recovery sequence with one
proxy-specific step -- re-registration -- and one explicit
safety rule: if the PS cannot reclaim a layout for a
migration it had in flight, the PS drops that migration
rather than continuing with stale state.</t>
      <section anchor="sec-ps-recovery">
        <name>PS Recovery Sequence</name>
        <t>The PS, after detecting MDS session loss, performs the
following steps in order:</t>
        <ol spacing="normal" type="1"><li>
            <t><strong>EXCHANGE_ID + CREATE_SESSION</strong> with the PS's prior
<tt>client_owner4</tt>.  Standard NFSv4.1 client recovery; the
PS's <tt>clientid4</tt> is restored when the MDS recognizes the
prior <tt>client_owner4</tt>.</t>
          </li>
          <li>
            <t><strong>PROXY_REGISTRATION</strong> with the PS's prior
<tt>prr_registration_id</tt>.  Re-registration is idempotent:
the PS sends the same fields it would for a first-time
registration and the MDS accepts them as re-establishing
the PS role on this session.  The MDS does not assume
that it retained any record of this PS being registered
previously; PROXY_REGISTRATION is the PS's explicit
assertion of PS-ness for this session.  Until this step
completes, the MDS treats the client as an ordinary
NFSv4 client and <bcp14>MUST NOT</bcp14> deliver proxy assignments to
it.</t>
          </li>
          <li>
            <t><strong>PROXY_PROGRESS</strong> to pull the assignment queue.  If the
MDS has retained any in-flight migrations owned by this
PS, it delivers them in the reply -- each as a fresh
<tt>proxy_assignment4</tt> carrying a fresh <tt>proxy_stateid</tt> (the
prior <tt>proxy_stateid</tt> is from a prior boot and is
permanently stale; see <xref target="sec-proxy-stateid"/>).  For each
re-delivered assignment, the PS attempts to match it to
a retained sidecar entry by <tt>(pa_file_fh,
pa_target_deviceid)</tt>.  Matched assignments proceed to step 4;
unmatched assignments are handled as fresh assignments.</t>
          </li>
          <li>
            <t><strong>Per-file layout reclaim</strong>, for each matched assignment:
<tt>OPEN_RECLAIM(CLAIM_PREVIOUS, pa_file_fh)</tt> per
<xref target="RFC8881"/> S9.11.1, followed by
<tt>LAYOUTGET(reclaim=true)</tt> per <xref target="RFC8881"/> S18.43.3 with
the PS's retained layout stateid as the reclaim key.  On
success the MDS returns a fresh layout stateid for the
resumed migration and the PS continues from where it
left off.  On <tt>NFS4ERR_NO_GRACE</tt>, <tt>NFS4ERR_RECLAIM_BAD</tt>,
or any other reclaim failure, the PS <bcp14>MUST</bcp14> drop the
migration: it issues <tt>PROXY_CANCEL</tt> with the fresh
<tt>proxy_stateid</tt> delivered in step 3 to signal the MDS
that the migration cannot be resumed, discards the
retained sidecar entry, and halts any pending I/O for
the file.</t>
          </li>
          <li>
            <t><strong>Sidecar entries the MDS did not re-deliver.</strong>  For any
migration the PS retained in its sidecar but the MDS did
not include in step 3, the PS <bcp14>MUST</bcp14> drop that migration:
discard the sidecar entry and halt any pending I/O for
the file.  No signal to the MDS is needed -- the MDS
already has no record of this migration.</t>
          </li>
          <li>
            <t><strong>RECLAIM_COMPLETE</strong> when all per-file reclaims and drops
are done.</t>
          </li>
        </ol>
        <t>Dropped migrations rejoin the MDS's normal assignment path:
a DS still DRAINING when recovery settles will, in due
course, attract a fresh <tt>proxy_assignment4</tt> -- to this PS or
another -- under the <tt>(pa_file_fh, pa_target_deviceid)</tt>
invariant of <xref target="sec-multi-ps-fanout"/>.</t>
        <t>The sidecar match in step 3 is best-effort across an MDS
reboot.  <tt>deviceid4</tt> is server-scoped and <bcp14>MAY</bcp14> change across a
restart per <xref target="RFC8881"/> S3.3.7; a target deviceid the MDS
reassigns on restart will not match the PS's retained sidecar
entry, the PS will not recognize the re-delivery as the same
migration, and the affected sidecar entries are dropped per
step 5.  The autopilot re-drives the work as a fresh
assignment.  Implementations that preserve target deviceids
across restart will resume mid-flight; those that do not will
re-drive from scratch -- both are conformant.</t>
        <section anchor="retention-requirement">
          <name>Retention Requirement</name>
          <t>A PS <bcp14>MUST</bcp14> be able to supply each in-flight migration's
layout stateid as the reclaim key after a PS-process
restart.  The natural implementation retains it in PS-local
storage (e.g., a small sidecar file or DB table keyed by
<tt>pa_file_fh</tt>) when the MDS grants the L3 layout; how it is
retained is an implementation matter.  A PS that cannot
supply the prior stateid cannot reclaim its layouts after a
restart, and the affected migrations are dropped per step 5
above.</t>
        </section>
      </section>
      <section anchor="ps-identity-continuity">
        <name>PS Identity Continuity</name>
        <t>A PS implementation <bcp14>SHOULD</bcp14> retain its <tt>client_owner4</tt> across
PS-process restart so that post-restart EXCHANGE_ID recovers
the same <tt>clientid</tt> and the in-flight migration records
remain valid.</t>
        <t>If the 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 <tt>clientid</tt>
cannot be claimed by the NEW <tt>clientid</tt>.  Those migrations
are dropped per the safety rules in <xref target="sec-ps-recovery"/>;
the autopilot re-issues fresh assignments at its
discretion.</t>
      </section>
      <section anchor="sec-lost-migration-records">
        <name>Lost Migration Records</name>
        <t>The drop rules in <xref target="sec-ps-recovery"/> cover the lost-state
case end-to-end: a migration the MDS did not retain is
dropped by the PS -- either because the MDS does not
re-deliver it in PROXY_PROGRESS, or because the per-file
reclaim returns <tt>NFS4ERR_NO_GRACE</tt> / <tt>NFS4ERR_RECLAIM_BAD</tt>
-- and the autopilot is free to re-drive the work as a
fresh assignment.  No proxy-specific signalling beyond
standard NFSv4 reclaim errors and <tt>PROXY_CANCEL</tt> is needed.</t>
      </section>
    </section>
    <section anchor="sec-security">
      <name>Security Considerations</name>
      <t>The security surface added by this document sits in two
places: the session the 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 names it; 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>Each threat the design addresses or explicitly leaves out of
scope is named below.  Credential forwarding, the most
consequential and the most easily implemented incorrectly,
is expanded in <xref target="sec-credential-forwarding"/>.</t>
      <dl>
        <dt>PS authority:</dt>
        <dd>
          <t>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 deployment-level authorization;
arbitrary hosts that present the op without prior
provisioning <bcp14>SHOULD</bcp14> be rejected.</t>
        </dd>
        <dt>Transport security across the operation:</dt>
        <dd>
          <t>The 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>
        </dd>
        <dt>Principal binding during a proxy operation:</dt>
        <dd>
          <t>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
<xref target="sec-credential-forwarding"/> for the case of
client-initiated file I/O through a translating PS,
where the credential-forwarding rule is different and
stricter.</t>
        </dd>
        <dt>PS impersonation:</dt>
        <dd>
          <t>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> apply deployment-level authorization
to the PS's transport-security credentials.</t>
        </dd>
        <dt>Registration lease expiry:</dt>
        <dd>
          <t>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>
        </dd>
      </dl>
      <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 is the core requirement;
no-squash-inversion closes the most common way pass-through
can be implemented incorrectly;
authorization-remains-with-MDS names the responsibility on
the MDS side of the same contract;
service-identity-is-for-the-control-plane 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 specifies the correct refusal behaviour rather than
letting a silent fall-through become the escape hatch.</t>
        <dl>
          <dt>Credential pass-through:</dt>
          <dd>
            <t>The 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>
          </dd>
          <dt>No squash inversion:</dt>
          <dd>
            <t>If the client arrives with a root-squashed identity (for
example, uid 0 mapped to nobody by the NFSv3 export
configuration on the client-facing side of the 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>
          </dd>
          <dt>Authorization remains with the MDS:</dt>
          <dd>
            <t>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>
          </dd>
          <dt>PS service identity is for the control plane only:</dt>
          <dd>
            <t>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>
          </dd>
          <dt>Failure mode on missing credentials:</dt>
          <dd>
            <t>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>
          </dd>
        </dl>
        <t>Deployment-level requirements:</t>
        <ul spacing="normal">
          <li>
            <t>PROXY_REGISTRATION <bcp14>MUST</bcp14> be deployment-authorized.  An
unknown host presenting PROXY_REGISTRATION <bcp14>MUST</bcp14> be
rejected.  This is the only wire-level defense against a
hostile entity registering as a 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>
        <dl>
          <dt>Grant a narrow traversal privilege:</dt>
          <dd>
            <t>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>
          </dd>
          <dt>Do not grant the privilege:</dt>
          <dd>
            <t>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>
          </dd>
        </dl>
        <t>This document does not normatively prefer one approach over
the other.  Implementations <bcp14>SHOULD</bcp14> document which they use;
deployment guidance for the common combined DS+PS case is
that granting the privilege is the expected choice,
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.), even when the privilege is granted, is
still subject to normal root_squash handling on the PS's
source-address rule at the MDS; the 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> limit
distribution to PSes that the deployment has authorized
(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 removeInRFC="true" anchor="sec-implementations">
      <name>Implementations</name>
      <t>This section records the status of known implementations of
the protocol defined by this specification at the time of
posting of this Internet-Draft, and is based on a proposal
described in <xref target="RFC7942"/>.  The description of
implementations in this section is intended to assist the
IETF in its decision processes in progressing drafts to
RFCs.  Please note that the listing of any individual
implementation here does not imply endorsement by the IETF.
Furthermore, no effort has been spent to verify the
information presented here that was supplied by IETF
contributors.  This is not intended as, and must not be
construed to be, a catalog of available implementations or
their features.  Readers are advised to note that other
implementations may exist.</t>
      <section anchor="reffs">
        <name>reffs</name>
        <t>reffs is an open-source NFSv4.2 server, 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>This document has no IANA actions.</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 removeInRFC="true" anchor="sec-open-questions">
      <name>Open Questions</name>
      <t>The design is substantially complete but still has open
points that need Working Group input or internal agreement
before the first submission.  They fall into three rough
categories: wire-level details that need to be nailed down
(richer capability advertising),
architectural choices that affect
the mechanism's shape (multiple concurrent proxies per file,
transitive proxy, capability-scoped EXCHGID flag), and
policy questions whose answers bind deployment choices more
than wire behaviour (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>
      <dl>
        <dt>Multiple concurrent proxies per file:</dt>
        <dd>
          <t>The design assumes one proxy per file per operation.
Should two proxies be allowed to pipeline a large file
(proxy A drives the first 1 TB, proxy B drives the
next)?  The motivating case is a multi-terabyte move
where a single proxy's bandwidth is the bottleneck;
parallelizing across proxies would shorten the operation
proportionally.  The cost is state-machine complexity
(two operation ids to track, partial-completion
bookkeeping, range ownership between proxies) and layout
complexity (the client sees two 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>
        </dd>
        <dt>Transitive proxy:</dt>
        <dd>
          <t>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>
        </dd>
        <dt>Migration-state retention across restart:</dt>
        <dd>
          <t>The recovery model leaves retention of in-flight
migration state across an MDS restart to the
implementation; an MDS that retains nothing is
conformant.  Should the document nonetheless add a
<bcp14>SHOULD</bcp14> recommending retention, so that a reboot does not
discard the progress of a large move?  Production
deployments would likely want it; it is a
quality-of-implementation recommendation only, with no
effect on interoperability.</t>
        </dd>
        <dt>Registration as a capability-scoped authority:</dt>
        <dd>
          <t>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>
        </dd>
        <dt>Richer capability advertising:</dt>
        <dd>
          <t>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>
        </dd>
        <dt>RPCSEC_GSSv3 for translating-proxy credential forwarding:</dt>
        <dd>
          <t>Credential forwarding under AUTH_SYS is weak (uid
spoofable, no integrity protection).  RPCSEC_GSSv3
structured privilege assertion (<xref target="RFC7861"/>
Section 2.5.2) is the natural strong-authentication
mechanism, but its deployment base in the NFSv4
community is narrow.  Should the draft REQUIRE GSSv3 for
translating proxies, RECOMMEND it, or leave it as
implementation-optional?  The answer likely depends on
how aggressively the WG wants to push GSSv3 adoption as
a side effect of standardizing this mechanism.</t>
        </dd>
        <dt>DEVICEID_REGISTRATION generalization:</dt>
        <dd>
          <t>PROXY_REGISTRATION in this document is a proxy-specific
capability-advertisement op: a DS opens a session to the
MDS and declares that it is proxy-capable, along with
codec-set membership 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 proxy-server draft
introduces a new DS-initiated session or whether the
generalized version does.</t>
        </dd>
      </dl>
    </section>
    <section removeInRFC="true" anchor="deferred">
      <name>Deferred</name>
      <t>The items below are explicit protocol extensions identified
during design that this revision does not specify.  They
overlap with Out of Scope in <xref target="sec-scope-out"/>; where Out of
Scope frames a deferral in the context of what the mechanism
does do, this list reads as a standalone punch list of
candidate follow-on work items, useful to a future revision's
planner.  A future editorial pass <bcp14>MAY</bcp14> merge this list into
Out of Scope before submission.</t>
      <ul spacing="normal">
        <li>
          <t>Partial-range PROXY_OP_MOVE assignments.</t>
        </li>
        <li>
          <t>Multi-proxy pipelines for very large files.</t>
        </li>
        <li>
          <t>Automated proxy selection with load balancing.</t>
        </li>
        <li>
          <t>Proxy-failure predicate (when should the 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>
      </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="28" 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-05"/>
        </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 2689?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>David Flynn and Trond Myklebust shaped the proxy-server
architecture, in particular the split between proxy
registration and MDS-issued directives.</t>
      <t>Brian Pawlowski and Gorry Fairhurst guided this process.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAMgIEWoAA7y961YcybUu+j+eIo/8Q9CuQtbFdjfY3psGpGYbCW2Q7OXj
4wFJVQJpFZW1KrNE4+5ez3Ke5TzZmfObl4jISkDt5e0eYy0LyIyMy4x5n98c
j8ehq7tZtV28Xzbf3433l/Xnal6cVsvP1bK4bJbF61n1fX0xq4rX9axqiz9V
y7Zu5sWLUF5cLKvP28Xr159fyNv6Wpg2k3l5Q2NOl+VlN74u7+ZVO55ftp9f
jS9puEseafz5xXiBb7Z4a/yr52FSdtVVs7zbLtpuGqb003bxw/7uh4OfwqSZ
t9W8XbXbRbdcVaFeLPGvtnvxq1998yuazrIqt4s31bxalrNw2yw/XS2b1WK7
eFd1/BPmX5zetV1146t4FT5Vd/TX6XZxOO+q5bzqaAto0iG0XTmfnpWzZk6T
uKvasKi3i792zWRUtM2yW1aXLf3r7kb+QUu+KReLen41KibNzU0179q/hVCu
uutmuR2KcSjov3pO0/+wVXyHHcGvZKM+XDc3ZZv+vllelfP6H2VH09ymP9CQ
y3ZRTir8tbop69l2MWuuru+W//OKf9qiz4Ywb5Y39M7nir5ZnLze++3Xv3ke
//ki/vOl/vPr57/92v759df27Dcvvv6G/3k43t+69/i2Q6jnl70PPv/6uQ/9
6uWv6ZnxeFyUF223LCe0re9LOp5ZNSvevT4tNhb0/zeL27q7Lrrr6l5aK2bl
XbPqQne3qIp2tVjQAbTFZFbTNo/beloVdOjtalnR3k/pDAo6umJBNDW5Xs0/
FctqUdbLcEGEUBFxy3stHiIaKwshwHaroHOoWz7LFR9gUX3fVfNpS1MrO6Kv
yXXdVZOOP4MZlwXoV18vNt7TUpYN36WSPnlVE6UtK54HXYnmEgu8qboy+SRG
LhbNbNYO/pk2F5RclG1bX81vfNqTcrmsK7x0U9DOFLTHN81nLL3g8ykulw39
ZV4F2bqia+jFhp5fjmhyfJvo8kw6eeP2uuFX/D3ays81jxba63I5JfomRkAH
OG9nJV7xrWym1aQFn7BdxZIm5Zw+Fhblsqsn9YIuMtE+lsgfedoS2TPNFNVc
D2yjnk9mK/yTSOLzy6DDbdKh7M5mxfvT8dv9U/oe3dV6jltR1PhwRYdMX6vo
OtD4ob+Fy4oObN4Wa9tYz2f13Ke1rNoFc5jA+8Rfq+d1V9O8p8X7k+P/+MsZ
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
JRtGh3NLIKFpjfJscfriBSetqRdPDQa+nctVdy1nal4ypK+ozyBzhArBJ18O
rKotXdUB7fSSVdhOyL0flmETNGDQLOsrbJzsgk0gzZ6vkrTPEBmQmPaWOgBz
X1wEu1NOTBNFlqjnEMwiBFIJy/gX9kK3d/NJm+W2lyJLIRB1l9Q1wHu+4u2U
41RVB5JcPYZa3uKpiZAIrZNBEG1QrDd2/yzT+gJzSICq/3NVrRCme3v8p4Mk
aJKRldDSnKY7lEyuywk9fflOvRkxaJH4m1PzVZ3aFr3Rm2Hz6AVtMp/folms
4FIM/TE1dBZtNw1lzu+yhCUEo0JMVIqkCN0ILvXS85v5Dc2VSkgveCRROZIe
5hN57QlxpTuwVMi3C2YxSSaUPLRDawwTmHB4YN7Mx8jq4f+7aVY23xi0ZKHc
irocJOz2Ig3rmW0d1xJfZbVHKx1U+BG54GsJD6gv46vX5VQ0NFKKIeXEqNTd
tx1Lt1+9BSzArhDnkNvyHvRqNVpHsq0fokgLu6a+Nhd/1yBozMCFSCJW+0RT
WGdTu+gvf0U3+a4NSO69qHJi50Si6/rqelxOJqTvjZdgmhgCzzPb58TNWiNZ
6jx5spncK54iu2lifYrnoYVbzTMjHW+JFGdkY1qgwl91n/yCZsbuWw/mYFk7
kYeraitcZzWXv085yaRadIVSAepaAvI87DbTBU4vTlJiA13RmZ4lOgdRg2N2
LGRY7ySnZM1OqhrR7nPQz1n8xqvznYwkaVKLhA09bWWarJUE2oDJNU3122pS
rtoqajNxczCJDc0efIbcZ/6HRD/43whasssdOxjNEzV3N+yyJwvYDL4CqRog
zppOkPU3ePOTIgbJaki20i1l9kYiSZcz7br+AsZIy6crVc2U4InBvk0Sv58V
B5rxLcSep2+6mjJdyxjf4G28FTmI0NwN0qTb5rK7BZUsSIucYuVJvrjFI0Hr
YMbB5H90TYGv0Dz97phuK9nR/rWwf1qxcXip6SQcwStJPS3US/YlMmXBKTlM
4npSxe9FLq86iVFxyKVjJ05HfynTtW7uDLljFvXkU09etLQXSbZwJqhYxMcD
sDIZeI3G7aTkefFVbuletKKbz2ZiOVyqS4lmsZrDt5dEDNeS0VjMBVGQsNpb
Y+w072tiD6p9s0I5b5FFQzp2dLyvyVGeqJQ+wCdE/ME82jGuThYgWKbpOjwp
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
f2D7iAx4S/TNfodT1ce2e9gTjNyphgZUr1Y7KbDuSLyIOBW7bZMcJmkZJ6DG
GCnpLseALOj5Iug73oCjuNFZuFZoPdcQOZXMDTODgKrbxr3hVRO/QHajSlHF
VPLpKXK2oiL5FiWOb3X9yslw2O+//uu/QsG/fuQ/Zv1F8eNjjxU/4qkxt47s
qW9j/+8P9MSGi+BEAHPuD97/Hb9vf6hYUxmn/+lXfsZcBuz2ZC7RchAZnkyC
5NdZPR2ZOBaBWfx3JuHMp7chEUmfxXsyBa7WPjv+I7G5XGTx4MVGBpKv/vAd
KElxdu4P6kOC8BOZoMQDTCGbP3dxzN8TprxZZItzeUpi1ETqZnw5yoWNo5cx
WrFZ/OFn7XLx14h7xvdzW1Fx1G/lY0kit+VBL2DERf+fPaVp0OotTJ9IvijB
YWZCNPHLcs6xwL+tzetfTiM7moW7rObVbTkb3UMtrt5t0X88EU0bSUiAOXM1
/TnHXfBYjz/15Ws+PfjfHw9ISD481vuPH15/l1HY0FOpPkS0dEaHNt1cH8vV
JHtmVBz/cbOQXTZ1a9uwbY+e81+OXqxfypwv/Xzm9OhTBThpT74xOXzh6/zf
Rte4FLFS6KPnP+vIH/3O7/wWqy4qm/FzZgm1IamU+ddOcEMbwgC/KQE+2PnS
KcLU6Cn8qBf5ore1JaEYfUJJnx997zPE8w/bxS8u66sxKQ1jUTXGAuBVd7Pq
90/e9nWKVClJcXKf/HSPJjQA83IKm4DT/ESHkf5Clmicm1O9hEtL0WPr51NN
ut/vi/XkfPUb5SlPHNarpICD7RAzeuhPiIBL/cu53rxz/nQCbuJRswyA0+Ml
OxZffiuFXBPkx5VayDuwvZzAbJ9bw0pZ+3aK5wKg1AzSZTqM6RKhJG/K5SfP
+S1RKA/Pr5XvMARjK5p00r4GQTz4/pEq3GMS7EwFfkEasltqgUOBennJ915L
MOPEJn7zPs2ZvduH7m7eS5JkQ0itR3EVCGyU2Y49VJ7bRqqH6Wx3E5k0ZES6
HxxZDfYdV23utSFzajUyuNdxMEotJWTy0huPm5viVS2tZrPmsCWDXdHLz+4D
JJLCYjgTU9OZNamnng8hPhUtNpkum0X6idQ8lrBnK9j8BvIEL8pWtrnZpsLV
xREwfrq3sVasKh2NjHjTxBluGVSqiyv/rvi+zLJ+Clz4OTBUEg+FskMtucMt
+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
6nZ7vUfBBg3FHFjbW1/BUfH/Ldv0WvnFAQA=

-->

</rfc>
