<?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-02" 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-02"/>
    <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 (proxy server) role: a registered peer
of the metadata server that polls the metadata server for
work assignments and carries them out -- moving a file from one
layout to another, reconstructing a whole file from surviving
shards, or translating between codecs for clients that cannot
participate in the file's native encoding (including NFSv3
clients).  All proxy-server-to-metadata-server coordination is fore-channel: the
metadata server returns work assignments inline in the response
to a proxy-server-initiated PROXY_PROGRESS poll, and the proxy server reports
completion via a fore-channel PROXY_DONE.  No callback
operations are required for the proxy server protocol.</t>
    </abstract>
    <note>
      <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 (proxy server) role to
address those three cases with a single mechanism: the proxy server
opens a session to the metadata server and registers its
capabilities via PROXY_REGISTRATION; the proxy server then polls the
metadata server using PROXY_PROGRESS for work assignments (move, repair),
which the metadata server returns inline in the poll response; the proxy server
carries out each assignment and signals completion via
PROXY_DONE (or abort via PROXY_CANCEL).  All of the proxy-server-to-metadata-server
coordination is fore-channel; the proxy server does not require a
back-channel callback program.  A client reaches a proxied
file either by contacting the proxy server directly, as an ordinary
NFS server, or through a pNFS layout whose data server is
the proxy server.  While a migration is in progress every client
routes its I/O through the proxy server; for 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 (proxy server, metadata server, data server).</t>
        <t>The new role is the proxy server (proxy server), distinct from
the metadata server and data server roles defined in
<xref target="I-D.haynes-nfsv4-flexfiles-v2"/>.  A proxy server registers with an
metadata server and, on receipt of a directive from that metadata server, performs
a move, a repair, or an ongoing codec translation on behalf
of a client.  The proxy server is opaque to most clients and is
visible to the metadata server through a dedicated NFSv4.1+ session that
the proxy server itself opens.  All proxy-server-to-metadata-server coordination is fore-channel:
the proxy server issues ops to the metadata server, and the metadata server returns work
assignments inline in its responses.  No callback channel is
required for the proxy server protocol.</t>
        <t>The fore-channel surface is deliberately small.
PROXY_REGISTRATION (<xref target="sec-PROXY_REGISTRATION"/>) lets the proxy server
declare the codec set it supports and its lease.
PROXY_PROGRESS
(<xref target="sec-PROXY_PROGRESS"/>) is the proxy server's poll-and-report op:
the proxy server sends it as a heartbeat (with optional progress
reports on in-flight migrations) and the metadata server replies with
zero or more new work assignments inline.  PROXY_DONE
(<xref target="sec-PROXY_DONE"/>) commits or rolls back a migration when
the proxy server finishes it; PROXY_CANCEL (<xref target="sec-PROXY_CANCEL"/>) lets
the proxy server abort early.  All four ops are fore-channel
proxy-server-to-metadata-server.</t>
        <t>Around the operation set, the document specifies the layout
conventions a client sees during a proxy operation and how
a client discovers the proxy server in the first place.</t>
        <t>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
metadata server, using the client's forwarded credentials.  Getting
this boundary wrong turns the proxy server into a privilege-elevation
vehicle, so the rules are stated normatively and enforced
at the metadata server rather than policed on the wire.</t>
        <t>Finally, the document defines recovery semantics for the
three actor failures that matter during a proxy operation
-- proxy server failure, metadata server failure, and data server failure -- each with its
own fencing and re-registration rules so that a
mid-operation crash does not leave a file in an
unrecoverable state.</t>
      </section>
      <section anchor="sec-scope-out">
        <name>Out of Scope</name>
        <t>The items below are deliberately deferred.  They split
into three groups: features whose absence was an explicit
design decision (delta journaling, partial-range moves),
orchestration that belongs to a layer above a single
proxy (multi-proxy pipelines, automated load balancing),
and proxy-internal behaviour that does not surface on the
wire and therefore needs no standardisation.  Nothing on
this list is precluded by the current design; each is a
reasonable future extension.</t>
        <dl>
          <dt>Journaling and partial moves:</dt>
          <dd>
            <t>Move assignments in this revision are always whole-file.
The proxy server performs a CSM-style write to all mirrors (source
D, destination G, and any other mirrors in the file's
mirror set) while reading source bytes from any mirror
in the source set; the two-layout state on the metadata server keeps
client traffic on L1 throughout, with an atomic swap to
L2 at PROXY_DONE time (<xref target="sec-two-layout-state"/>).
Delta-journaling mechanisms -- capturing writes against
an otherwise-offline source, replaying them on
completion, or maintaining reference integrity across
detached clones -- are a future extension, as is a
partial-range move that would move a byte range while
the rest of the file stays on the source.  The
whole-file two-layout commit covers every motivating
scenario the design currently has.</t>
          </dd>
          <dt>Orchestration beyond a single proxy:</dt>
          <dd>
            <t>Multi-proxy pipelines (staged moves for very large
files) and automated load balancing or predictive
selection across registered proxies are out of scope.
A metadata server in this revision selects a single proxy server per
operation; load distribution across many proxies, when
it matters, is expected to be handled by the metadata server's
selection policy and does not surface as new wire
protocol.</t>
          </dd>
          <dt>Server-side copy as an alternative path:</dt>
          <dd>
            <t>Integration with server-side copy (<xref target="RFC7862"/> Section 4)
as an alternative to proxy-server-driven moves for single-file
moves within one namespace is adjacent work.  The two
mechanisms are complementary (server-side copy is a
client-directed intra-server operation; the proxy-server-driven
move is an metadata-server-directed inter-server operation), and
their intersection -- for example, using server-side
copy under the hood of a proxy server move assignment -- is better
specified in its own extension rather than bolted into
this document.</t>
          </dd>
          <dt>Proxy-internal features that do not surface on the wire:</dt>
          <dd>
            <t>A proxy <bcp14>MAY</bcp14> implement content-integrity and
error-correction layers, encryption and compression
pass-through, log-structured write staging, and
sector-alignment normalisation.  These are useful
motivating scenarios for the move/repair vocabulary but
do not require new protocol surface beyond what the
PROXY_PROGRESS / PROXY_DONE / PROXY_CANCEL fore-channel
set already provides, and so they are left to
implementation rather than standardised here.</t>
          </dd>
        </dl>
      </section>
    </section>
    <section anchor="use-cases">
      <name>Use Cases</name>
      <t>Seven motivating scenarios converge on the same mechanism.
Six of them are transient transitions on the file itself: the
file is changing state (being ingested, re-coded, evacuated,
reconstructed, migrated between transport-security profiles,
or migrated between filehandle backends), and the transition
is what the proxy server drives to completion.  The seventh is
qualitatively different: the file is not changing, but
specific clients -- those that cannot participate in the
file's native codec -- are routed through a proxy server persistently,
for as long as they are active.</t>
      <t>The distinction matters for how the metadata server schedules work.
Transient transitions have a terminal state; the metadata server expects
each one to complete (via 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 proxy server stays in
the layouts of codec-ignorant clients as long as those
clients are open.</t>
      <t>In every case, a registered proxy server becomes the source of truth
for a file's data during the operation, and clients are
redirected to route I/O through that proxy server rather than directly
to the original layout's data servers.  The individual
scenarios are described below.</t>
      <section anchor="administrative-ingest">
        <name>Administrative Ingest</name>
        <t>An administrator rsyncs a file from an external source into the
cluster as a single-copy file.  Server policy requires the file
to be mirrored or erasure coded.  The metadata server queues a MOVE
assignment for the file; the next PROXY_PROGRESS poll from a
registered proxy whose 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="data-server-maintenance-evacuation">
        <name>Data Server Maintenance / Evacuation</name>
        <t>A data server is scheduled for maintenance (hardware
replacement, software upgrade, decommission).  All files whose
layouts reference that data server must be evacuated to replacement
data servers before it is taken offline.  The metadata server queues a MOVE
assignment per file (source = the outgoing data server, target = a
replacement); registered proxies pick the assignments up via
PROXY_PROGRESS polls.  Evacuation can be large-scale (thousands
or millions of files); running per-client per-chunk repair over
every file would be prohibitively expensive, but a single
registered proxy can drive many concurrent migrations subject
to the per-proxy server in-flight cap (<xref target="sec-multi-ps-fanout"/>).</t>
      </section>
      <section anchor="whole-file-repair">
        <name>Whole-File Repair</name>
        <t>Multiple data servers have failed such that per-chunk repair cannot
reconstruct the file in place.  The metadata server constructs a new layout
backed by replacement data servers and queues a REPAIR assignment.  The
next registered-proxy server PROXY_PROGRESS poll receives the assignment;
the proxy drives reconstruction from whatever surviving shards
remain.  If fewer than k shards survive across the mirror set,
the proxy reports terminal failure via PROXY_DONE with
<tt>pd_status</tt> set to <tt>NFS4ERR_PAYLOAD_LOST</tt>, matching the
per-chunk repair semantics in the Repair Client Selection
section of <xref target="I-D.haynes-nfsv4-flexfiles-v2"/>.</t>
      </section>
      <section anchor="tls-coverage-transition">
        <name>TLS Coverage Transition</name>
        <t>A file whose layout currently points at non-TLS-capable data servers
needs to be migrated to TLS-capable data servers, or vice versa (an
inventory change, a policy change mandating transport security,
onboarding a new storage class whose data servers are TLS-only).
A <tt>PROXY_OP_MOVE</tt> assignment applies: the destination data servers
have the required transport security profile, the source data servers
are retired.  A
client that arrives mid-transition is routed through the proxy
and does not directly see the heterogeneous data server set.</t>
        <t>The proxy establishes its own RPC connections to source and
destination data servers, potentially with different transport security
profiles (non-TLS to source, mutual TLS <xref target="RFC9289"/> to
destination, or any other combination).  The proxy's per-data server
security is independent of the client's security to the proxy.</t>
      </section>
      <section anchor="filehandle-storage-backend-transition">
        <name>Filehandle / Storage-Backend Transition</name>
        <t>A data server changes the filehandles it issues for a file; this
happens when the data server's underlying storage is migrated (e.g.,
from one backend object store to another) and the old
filehandles become unresolvable on the new backend.  Without a
proxy, every client holding a layout has to be individually
recalled and re-issued.  With a proxy, the metadata server points all
clients at the proxy (keeping their existing stateids and FHs
intact), the proxy reconciles old-to-new FHs internally, and
clients are recalled only at the end.</t>
        <t>This same mechanism covers several related situations: an
NFSv3-to-NFSv4.2 data server protocol upgrade where the data server FHs change
as a side effect of migrating from <xref target="RFC1813"/> to
<xref target="RFC8881"/> semantics; a data-server-side format change that
invalidates existing FHs (for example, a transition from a
local POSIX store to an object store); and backend-opaque FH
migration where the data server's FH structure is internally
versioned and old clients hold stale versions.</t>
      </section>
      <section anchor="sec-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 metadata-server-terminated I/O, or (this case) is
routed through a proxy that translates on its behalf.</t>
        <t>Unlike the move / repair / evacuation / transition use cases
above, codec translation is persistent per client.  The
file itself is not changing state.  What changes is the layout
the metadata server hands to a codec-ignorant client: that client gets a
single-data server layout naming a translating proxy server, with a coding_type
the client does support (typically FFV2_ENCODING_MIRRORED, or
for NFSv3 clients just a flat NFSv3 data surface).  The proxy
encodes and decodes on the fly against the real data servers; the
client sees a flat file.</t>
        <t>The same file may be accessed directly by codec-aware clients
(with a normal layout naming the real data servers) and through the
proxy by codec-ignorant clients (with a proxy layout)
simultaneously.  The metadata server issues a different layout per
request; only the codec-ignorant case routes through the proxy server.</t>
        <section anchor="mechanism">
          <name>Mechanism</name>
          <t>A translating proxy runs two sides that meet internally.  On
its client-facing side it speaks the protocol the
codec-ignorant client can speak: for an NFSv3 <xref target="RFC1813"/>
client that is an NFSv3 server that re-exports the metadata server's
namespace; for a legacy NFSv4.2 client that understands only
some codecs, it is an NFSv4.2 data-server surface presenting
FFV2_ENCODING_MIRRORED (or an equivalent codec the client
supports).  On its metadata-server-facing side it is an NFSv4.2
client to the metadata server plus whatever data server protocol the metadata server's real
data servers speak.  The proxy translates each client-facing op into
the corresponding metadata server or data server op, applies the 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 metadata server with the client's forwarded
credentials (see Security Considerations).</t>
            </li>
            <li>
              <t>Proxy: issues <tt>CHUNK_READ</tt> (or v3 <tt>READ</tt> if the data server is
NFSv3) against the real data servers, decodes the shards back to
plaintext.</t>
            </li>
            <li>
              <t>Proxy: returns the plaintext bytes in the NFSv3 READ
reply.</t>
            </li>
          </ul>
          <t>A write flows:</t>
          <ul spacing="normal">
            <li>
              <t>Client: NFSv3 <tt>WRITE</tt> with stable_how and a byte range.</t>
            </li>
            <li>
              <t>Proxy: encodes the bytes per the file's codec, issues
<tt>CHUNK_WRITE</tt> / <tt>CHUNK_FINALIZE</tt> / <tt>CHUNK_COMMIT</tt> against
the real data servers.</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 data server'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-proxy server mechanism gives the metadata server the information it
needs for translation-proxy selection: <tt>prr_codecs</tt> enumerates
the codecs the proxy server can translate between, the metadata server &lt;-&gt; proxy server
session carries the fore-channel control-plane traffic, and
the lease bounds the relationship.  No new op is required for
the translation case -- the existing <tt>PROXY_REGISTRATION</tt>
covers it.  <tt>PROXY_OP_MOVE</tt> and <tt>PROXY_OP_REPAIR</tt> assignments
are not used for pure translation (the file is not moving or
being repaired); the proxy server simply serves the 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 (metadata server) and data server (data server):</t>
        <dl>
          <dt>Proxy server (proxy server):</dt>
          <dd>
            <t>A persistent, registered peer of the metadata server that carries out
whole-file operations on the metadata server's behalf -- moving file
content between layouts, reconstructing files whose source
layout has been damaged, and translating codecs on behalf of
clients that cannot participate in the file's native
encoding.  A proxy server is a distinct role from a data server; a given server
<bcp14>MAY</bcp14> implement both, and typically does, but the protocol
does not require that.  The metadata server sees the proxy server through a
dedicated session whose direction is defined in
<xref target="sec-design-session"/>.</t>
          </dd>
        </dl>
        <t>The existing roles are unchanged:</t>
        <dl>
          <dt>Metadata server (metadata server):</dt>
          <dd>
            <t>As defined in <xref target="I-D.haynes-nfsv4-flexfiles-v2"/>: the
coordinator for each file, and the authority that issues
layouts, manages stateids, and selects repair participants.</t>
          </dd>
          <dt>Data server (data server):</dt>
          <dd>
            <t>As defined in <xref target="I-D.haynes-nfsv4-flexfiles-v2"/>: serves the
CHUNK data path to pNFS clients.</t>
          </dd>
        </dl>
        <t>Only one of the three pairs carries new ops in this document.
The metadata server &lt;-&gt; proxy server pair gains the new proxy-server-to-metadata-server regular ops for
registration, progress, and terminal reporting
(<xref target="sec-new-ops"/>).  No new callback ops are introduced; the
metadata server pulls work assignments to the proxy server in the PROXY_PROGRESS
reply on the fore-channel, and the proxy server reports completion or
cancellation back via PROXY_DONE / PROXY_CANCEL on the same
session, so no callback program is required for this protocol.
The Client &lt;-&gt; proxy server pair gains no new ops: clients reach a proxy server
through the normal pNFS data path, seeing it as the data server named
in a single-data server layout (<xref target="sec-layout-shape"/>).  The metadata server &lt;-&gt; data server pair is also
unchanged; the tight-coupling control session in
<xref target="I-D.haynes-nfsv4-flexfiles-v2"/> carries over as defined
there.</t>
      </section>
      <section anchor="layout-model">
        <name>Layout Model</name>
        <section anchor="single-layout-model">
          <name>Single-Layout Model</name>
          <t>This design uses a single layout naming the proxy server as the sole
data server rather than two linked layouts.  Three considerations drive
that choice.  pNFS clients already handle single layouts
cleanly, so no new layout-linkage mechanism needs to be
invented or implemented on the client.  The client's view of
the file -- "the file's data server is the proxy server" -- is the truth during
the operation, so exposing the source and destination data servers
directly would invite confusion about which entry to address
rather than clarify.  And late-arriving clients see the proxy
layout from the start, without any separate setup path to
join an operation already in progress.  The alternative -- a
source layout plus a destination layout linked by a
redirector record -- was considered and rejected on those
three grounds.</t>
          <t>Routing all client I/O through the proxy server has a cost deployments
<bcp14>MUST</bcp14> weigh.  For the duration of a migration the proxy server is a
data-path single point of failure for the file: the client
sees one data server, the proxy server, and the usual Flex Files
mitigation -- client-side mirroring across several data servers -- is
unavailable to it.  A file under migration therefore has
lower availability than a normally-mirrored file until
PROXY_DONE.  The proxy server is also a throughput funnel: all client
read and write traffic for the file, plus the proxy server's own copy
traffic, passes through one proxy server, adding a latency hop and a
bandwidth bottleneck.  These costs are inherent to the
single-layout choice; they argue against migrating very
large files in a single proxy operation, and motivate the
multi-proxy server and partial-range extensions listed as out of scope
(<xref target="sec-scope-out"/>).</t>
        </section>
        <section anchor="sec-two-layout-state">
          <name>Two-Layout State on the Metadata Server Side</name>
          <t>For each file F whose mirror on a draining data server D is being
migrated, the metadata server keeps three logical layout records.  Only
L3 backs a client-facing layout; L1 and L2 are metadata-server-internal
bookkeeping for the duration of the migration.</t>
          <dl>
            <dt>L1:</dt>
            <dd>
              <t>the pre-migration mirror set, including D.  This record
is metadata-server-internal: it preserves what the file's layout was
before the migration and is handed to no client while the
migration is active.</t>
            </dd>
            <dt>L2:</dt>
            <dd>
              <t>the post-migration mirror set: L1 with D replaced by the
target G.  Also metadata-server-internal; it becomes the file's
layout after the PROXY_DONE swap.</t>
            </dd>
            <dt>L3:</dt>
            <dd>
              <t>the composite the proxy server works from.  It backs the layout
every client is served during the migration: that
client-facing layout names the proxy server as its data server, and
the proxy server does the real I/O against L3's two mirror entries:
</t>
              <ul spacing="normal">
                <li>
                  <t><tt>M1</tt> (read source): the L1 mirror set.  The proxy server reads
source bytes from any mirror in M1.</t>
                </li>
                <li>
                  <t><tt>M2</tt> (write target): the L1 mirror set PLUS G.  The proxy server
writes via CSM to every mirror in M2.</t>
                </li>
              </ul>
            </dd>
          </dl>
          <t>During the migration every client of F -- whichever front
door it used -- is served a layout naming the proxy server; the proxy server is
the sole writer to M1 and M2.  No client addresses D, E, or G
directly.  Because the proxy server 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 proxy server 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 proxy server keeps
D a current mirror until the PROXY_DONE swap, so a cancelled
migration can fall back to L1 with no data loss.  The proxy server
writes both D and G, and because the proxy server is the only writer
they converge to the same byte image with no inter-writer
race.</t>
          <t>A source mirror <bcp14>MAY</bcp14> be an NFSv3 data server.  When it is, the proxy server
reads from it using NFSv3 semantics and writes the NFSv4.2
destination using CHUNK semantics; the asymmetric-protocol
bridging is the proxy server's responsibility and is not visible to
the client.</t>
        </section>
        <section anchor="pinned-definitions">
          <name>Pinned definitions</name>
          <ul spacing="normal">
            <li>
              <t>L1.mirrors = the file's pre-migration mirror set, includes D</t>
            </li>
            <li>
              <t>L2.mirrors = (L1.mirrors \ {D}) union {G}</t>
            </li>
            <li>
              <t>L3.M1 = L1.mirrors  (proxy server's read-source set)</t>
            </li>
            <li>
              <t>L3.M2 = L1.mirrors union {G}  (proxy server's CSM write-target set)</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="sec-design-session">
        <name>Session Between Metadata Server and Proxy Server</name>
        <t>The proxy server opens an NFSv4.1+ session to the metadata server as a normal
client.  All proxy-server-to-metadata-server coordination flows on the fore-channel of
that session: PROXY_REGISTRATION establishes the relationship,
PROXY_PROGRESS heartbeats and pulls work assignments,
PROXY_DONE / PROXY_CANCEL report terminal state.  No callback
program is required for the proxy server protocol -- the session's
back-channel is unused by this draft (the proxy server may still
establish one for unrelated NFSv4.1 callbacks if it wishes,
but no proxy-server-protocol op rides on it).</t>
        <t>The session direction is intentionally opposite to the
metadata server -&gt; data server tight-coupling control session in
<xref target="I-D.haynes-nfsv4-flexfiles-v2"/>: that session is opened by
the metadata server to carry metadata-server-originated stateid management to a data server.
The metadata server &lt;-&gt; proxy server session is opened by the proxy server because registration
is a proxy-server-initiated act -- the proxy server is saying "here I am, with
these capabilities."  Without a proxy-server-to-metadata-server direction the
capability-advertisement would have to be inferred from
session-setup flags alone, which is inadequate for the range
of capabilities a proxy server can usefully advertise (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 data server and proxy server roles toward the same metadata server runs
two sessions between the same pair of hosts: the metadata server opens
the data server tight-coupling session toward the box, and the box's
proxy server opens the proxy server session toward the metadata server.  That is two
EXCHANGE_ID exchanges, two CREATE_SESSION exchanges, and two
TCP connections.  In deployments that use RPCSEC_GSS
(<xref target="RFC7861"/>) or RPC-over-TLS (<xref target="RFC9289"/>) on the proxy server
session -- which the credential-forwarding rules in
<xref target="sec-security"/> recommend for any proxy server that translates on
behalf of clients -- reserved-port trust is not in use and
the doubled connection has no security cost.  In a strict
AUTH_SYS-only deployment the second outbound reserved port
is a real but typically negligible cost, because a storage
box's outbound NFS traffic is usually limited to one
connection per metadata server it is registered with.</t>
      </section>
      <section anchor="flow-summary">
        <name>Flow Summary</name>
        <t>The proxy server opens a session to the metadata server and issues
PROXY_REGISTRATION, declaring its supported codecs; the metadata server
records the registration and returns a registration id with
a granted lease.  The proxy server then polls
the metadata server via PROXY_PROGRESS at lease/2 cadence (or as the
metadata server's <tt>ppr_lease_remaining_sec</tt> hint directs).  When the metadata server
decides to move or repair a file, it selects a registered proxy server
whose capabilities match the operation and queues an
assignment for that proxy server; the next PROXY_PROGRESS reply
delivers the assignment in its <tt>ppr_assignments&lt;&gt;</tt> array.
The proxy server picks the work up by issuing OPEN + LAYOUTGET on the
assignment's <tt>pa_file_fh</tt>, drives the byte-shoveling phase
to completion, and reports terminal status by issuing
LAYOUTRETURN + PROXY_DONE in a single fore-channel compound
on the same session.  The metadata server may at any time retract an
assignment that the proxy server has not yet acknowledged via
OPEN+LAYOUTGET by including a <tt>PROXY_OP_CANCEL_PRIOR</tt>
assignment for the same <tt>(pa_file_fh, pa_target_deviceid)</tt>
pair in a subsequent PROXY_PROGRESS reply; the proxy server may cancel
work it has already started via the fore-channel
PROXY_CANCEL (<xref target="sec-PROXY_CANCEL"/>).</t>
        <t>Clients interact with the proxy server through the normal layout path.
During a proxy operation the metadata server hands out a single-data server
layout naming the proxy server; clients route CHUNK I/O to that data server.  Clients that arrive
mid-operation see the proxy layout from the start and need
no additional signalling; clients that held an older
(non-proxy) layout are recalled via CB_LAYOUTRECALL and
reacquire.</t>
      </section>
      <section anchor="message-sequence-policy-driven-move">
        <name>Message Sequence: Policy-Driven Move</name>
        <t>The simplest flow -- a quiesced whole-file move for a policy
transition.  Shown as a wire-level message sequence between
the three protocol actors; clients are elided because in the
quiesced case they are recalled before the proxy server work starts.</t>
        <figure anchor="fig-seq-policy-move">
          <name>Message sequence for a policy-driven move</name>
          <artwork><![CDATA[
  proxy server                                metadata server
  |                                 |
  | ---- CREATE_SESSION ----------> | (PS opens session to MDS)
  | <--- session est. ------------- |
  |                                 |
  | ---- PROXY_REGISTRATION ------> | (advertise 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 proxy server reconstructed the file;
the metadata server proceeds as in <xref target="fig-seq-policy-move"/>.</t>
          </li>
          <li>
            <t><tt>NFS4ERR_PAYLOAD_LOST</tt> in <tt>pd_status</tt>: fewer than k
shards survived across the mirror set; the metadata server marks the
affected byte ranges lost and rolls back to L1.  No
CB_LAYOUTRECALL is issued because there is no valid
destination layout to issue.</t>
          </li>
        </ul>
      </section>
      <section anchor="message-sequence-metadata-server-initiated-cancellation">
        <name>Message Sequence: metadata-server-initiated Cancellation</name>
        <t>The metadata server may decide to retract an assignment.  Two cases:</t>
        <dl>
          <dt>Assignment not yet acknowledged by the proxy server:</dt>
          <dd>
            <t>The metadata server includes a <tt>PROXY_OP_CANCEL_PRIOR</tt> assignment in
the next PROXY_PROGRESS reply, naming the same
<tt>(pa_file_fh, pa_target_deviceid)</tt> pair as the prior MOVE
/ REPAIR assignment.  The proxy server, which has not yet OPEN'd
the file, simply drops the prior assignment from its
in-flight queue.</t>
          </dd>
          <dt>Assignment acknowledged and in flight:</dt>
          <dd>
            <t>The metadata server internally aborts the migration and discards the
in-flight record; the proxy server's eventual PROXY_DONE returns
NFS4ERR_BAD_STATEID (the L3 layout stateid no longer
resolves to a record), and the proxy server abandons the work and
releases its OPEN.  The metadata server may also let the proxy server's
registration lease expire as a coarser cancellation.</t>
          </dd>
        </dl>
        <t>The proxy-server-initiated cancellation case uses the fore-channel
PROXY_CANCEL (<xref target="sec-PROXY_CANCEL"/>).</t>
        <figure anchor="fig-seq-cancel">
          <name>Message sequence for metadata-server-initiated cancellation (assignment not yet acknowledged)</name>
          <artwork><![CDATA[
  proxy server                                metadata server
  |                                 |
  |  [MOVE assignment delivered in  |
  |   prior PROXY_PROGRESS reply,   |
  |   not yet acknowledged]         |
  |                                 |
  |                                 | <-- (cancel decision)
  |                                 |
  | ---- PROXY_PROGRESS ----------> | (next heartbeat poll)
  | <--- NFS4_OK, ppr_assignments   | (CANCEL_PRIOR for the
  |       includes CANCEL_PRIOR     |  same pa_file_fh/target)
  |                                 |
  |  [PS drops the prior assignment |
  |   from its in-flight queue;     |
  |   no PROXY_DONE / PROXY_CANCEL  |
  |   is issued for this work]      |
  v                                 v
]]></artwork>
        </figure>
      </section>
    </section>
    <section anchor="sec-new-ops">
      <name>New NFSv4.2 Operations</name>
      <t>This document defines two new NFSv4.2 operations that a proxy server (proxy server) issues to the metadata server (metadata server) on the
fore-channel of the proxy server -&gt; metadata server session defined in
<xref target="sec-design-session"/>.  PROXY_REGISTRATION (92) is issued
once at session setup and on renewal.  PROXY_PROGRESS (93) is
issued by the proxy server as a heartbeat-with-poll: the proxy server reports
periodic and terminal progress for in-flight migrations and
optionally requests new work; the metadata server replies inline with
zero or more new work assignments.  PROXY_DONE (94) commits
or rolls back an individual migration when the proxy server finishes
it; PROXY_CANCEL (95) lets the proxy server abort early.  None of
these operations is sent by pNFS clients.</t>
      <figure anchor="fig-proxy-server-opnums">
        <name>Proxy server operation numbers</name>
        <sourcecode type="xdr"><![CDATA[
/// /* New operations for the proxy server (proxy server -> metadata server) */
///
/// OP_PROXY_REGISTRATION   = 92;
/// OP_PROXY_PROGRESS       = 93;
/// OP_PROXY_DONE           = 94;
/// OP_PROXY_CANCEL         = 95;
]]></sourcecode>
      </figure>
      <t>Opcodes 92 through 95 continue the metadata-server-to-data-server control-plane
range that <xref target="I-D.haynes-nfsv4-flexfiles-v2"/> opens at 89
(TRUST_STATEID through BULK_REVOKE_STATEID at 89-91).</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="metadata-server-minting">
          <name>Metadata Server Minting</name>
          <t>The metadata server mints a fresh proxy_stateid each time it accepts a
work assignment for delivery to a proxy server, and includes it as the
<tt>pa_stateid</tt> field of the <tt>proxy_assignment4</tt> carried in the
next PROXY_PROGRESS reply (<xref target="sec-PROXY_PROGRESS"/>).</t>
          <t>The metadata server guarantees that no two proxy_stateids in the same
(server_state, boot_seq) are equal.  An implementation <bcp14>MAY</bcp14>
embed the metadata server <tt>boot_seq</tt> in the high-order bytes of
<tt>other[12]</tt> to enable cheap NFS4ERR_STALE_STATEID detection
across reboots; this is informative implementation guidance,
not a wire requirement.  One known implementation uses the
layout
<tt>{ uint16_t boot_seq | uint16_t reserved | uint64_t opaque }</tt>
where the opaque tail is <tt>getrandom(2)</tt> output.  The
<tt>reserved</tt> field is zero in this revision; implementations
<bcp14>MUST</bcp14> emit zero and <bcp14>MUST NOT</bcp14> reject non-zero on receipt (left
as a forward-compat slot for widening <tt>boot_seq</tt>).</t>
        </section>
        <section anchor="lifetime">
          <name>Lifetime</name>
          <t>A proxy_stateid is valid from the instant the metadata server mints it
until either:</t>
          <ul spacing="normal">
            <li>
              <t>The proxy server issues <tt>PROXY_DONE(proxy_stateid, ...)</tt> or
<tt>PROXY_CANCEL(proxy_stateid)</tt> and the metadata server acknowledges it.
On acknowledgment the proxy_stateid is retired; subsequent
references return <tt>NFS4ERR_BAD_STATEID</tt>.</t>
            </li>
            <li>
              <t>The proxy server's registration lease expires
(<xref target="sec-PROXY_REGISTRATION"/>), at which point all
proxy_stateids minted for that proxy server are abandoned.  Subsequent
references return <tt>NFS4ERR_BAD_STATEID</tt> (or
<tt>NFS4ERR_STALE_CLIENTID</tt> if the registration itself has been
purged).</t>
            </li>
            <li>
              <t>The metadata server reboots.  Subsequent references to a proxy_stateid
minted in a prior boot return <tt>NFS4ERR_STALE_STATEID</tt>.</t>
            </li>
          </ul>
        </section>
        <section anchor="renewal-semantics">
          <name>Renewal Semantics</name>
          <t>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 metadata server bumps <tt>seqid</tt> on each issuance, including renewal
acknowledgments.</t>
            </li>
            <li>
              <t>The proxy server 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 metadata server additionally validates that the calling session's
registered-proxy server identity owns that migration (see the
"Authorization" subsection of <xref target="sec-PROXY_DONE"/> for the
full normative rule).  Without
this check, a proxy server that learned another proxy server's proxy_stateid
(through a packet capture, a leaked log, or any other channel)
could drive its PROXY_DONE / PROXY_CANCEL on a migration it
does not own.</t>
        </section>
      </section>
      <section anchor="sec-PROXY_REGISTRATION">
        <name>Operation 92: PROXY_REGISTRATION - Register as Proxy Server</name>
        <section anchor="arguments">
          <name>ARGUMENTS</name>
          <figure anchor="fig-PROXY_REGISTRATION4args">
            <name>XDR for PROXY_REGISTRATION4args</name>
            <sourcecode type="xdr"><![CDATA[
/// struct PROXY_REGISTRATION4args {
///     ffv2_coding_type4  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 (proxy server) calls PROXY_REGISTRATION on the
fore-channel of its session to the metadata server
(<xref target="sec-design-session"/>) to declare its capabilities.  The
metadata server records the registration and <bcp14>MAY</bcp14> select that proxy server for
subsequent MOVE / REPAIR work assignments delivered inline in
the response to PROXY_PROGRESS.</t>
          <t>The prr_codecs field lists the ffv2_coding_type4 values the
proxy server supports.  The proxy server <bcp14>MUST</bcp14> be able to encode, decode, and
transcode between any pair of values in this list.  Because
the transformation class of a <tt>PROXY_OP_MOVE</tt> assignment is
inherent in the (source, destination) layout pair, this
codec-set membership is all the capability information the
metadata server needs to match.  An empty list results in NFS4ERR_INVAL
in this revision.</t>
          <t>The prr_lease field is the lease duration the proxy server requests in
seconds.  The metadata server <bcp14>MAY</bcp14> grant a shorter one, returned in
prr_granted_lease.  The proxy server <bcp14>MUST</bcp14> renew before the granted
lease expires; on expiry the metadata server drops the registration and
any in-flight migration record owned by this proxy server is abandoned
(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 proxy server <bcp14>MUST</bcp14> set prr_flags to 0, and a metadata server 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 proxy server that sets a future capability bit
against a metadata server that pre-dates the bit could not tell whether
the metadata server honored the capability or simply dropped it.</t>
          <t>A future revision of this specification (or a successor
document that updates it) <bcp14>MAY</bcp14> define new bit values in
prr_flags, following the extension rules of Section 4.2 of
<xref target="RFC8178"/>.  A proxy server that understands a newly defined bit <bcp14>MAY</bcp14>
set it when registering with a metadata server that supports it; on
NFS4ERR_INVAL the proxy server <bcp14>MAY</bcp14> retry with the bit cleared,
treating the response as the <xref target="RFC8178"/> Section 4.4.3
signal that the metadata server does not recognize the bit.</t>
          <t>On success, the metadata server returns a prr_registration_id that
identifies this registration.  The proxy server uses it to renew the
registration before the granted lease expires (by re-issuing
PROXY_REGISTRATION with the same prr_registration_id) and
to identify itself across reconnects (see the squat-guard
text below).</t>
          <t>Registration conveys capabilities only; the proxy server's network
endpoint is conveyed through the same deviceinfo channel as
any other data server's address.  When the metadata server selects a proxy server for an
operation, the layout issued to clients includes a
ffv2_data_server4 entry pointing at the proxy server's existing
deviceinfo.</t>
          <t>PROXY_REGISTRATION is issued on the fore-channel of the
metadata server &lt;-&gt; proxy server session.  That session is opened by the proxy server, not by
the metadata server; it is distinct from the metadata server -&gt; data server tight-coupling
control session defined by <xref target="I-D.haynes-nfsv4-flexfiles-v2"/>
even when the same host acts as both data server and proxy server.  The proxy server <bcp14>MUST</bcp14>
present EXCHGID4_FLAG_USE_NON_PNFS on the session so that
the metadata server can distinguish it from a regular pNFS client.  A metadata server
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 metadata server <bcp14>MUST</bcp14> authorize
the caller as a registered proxy server for this metadata server.  How that
authorization is established -- a deployment allowlist, a
per-metadata server provisioning step, integration with a directory
service, or any other mechanism -- is implementation.  The
metadata server <bcp14>MUST</bcp14> reject an unauthorized PROXY_REGISTRATION with
NFS4ERR_PERM.</t>
          <t>The authorization <bcp14>MUST</bcp14> be applied to a cryptographically
authenticated identity, per the metadata server &lt;-&gt; proxy server transport-
security requirements in <xref target="sec-credential-forwarding"/>.
AUTH_SYS is never sufficient for PROXY_REGISTRATION; the
metadata server <bcp14>MUST</bcp14> reject it.</t>
          <t>Because one proxy server proxies one metadata server, a successful rogue registration
displaces the legit proxy server and returns NFS4ERR_STALE to every
client holding cached filehandles against the previous proxy server.  To
guard against registration squatting, the metadata server <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 metadata server returns NFS4ERR_DELAY and <bcp14>SHOULD</bcp14> log the
conflict.  A renewal -- distinguished by the proxy server re-presenting
the same prr_registration_id it received on the prior
registration -- is not squatting and the metadata server <bcp14>MUST</bcp14> accept it
(refreshing the granted lease).</t>
          <t>Registration revocation before lease expiry is not a dedicated
operation in this revision.  A metadata server that needs to revoke a proxy server
before its lease expires <bcp14>MUST</bcp14> cease delivering work
assignments to that proxy server in PROXY_PROGRESS replies; <bcp14>MUST</bcp14> return
NFS4ERR_STALE_CLIENTID on subsequent PROXY_PROGRESS or
PROXY_REGISTRATION-renewal from the revoked proxy server; and <bcp14>MUST</bcp14>
handle the proxy server's in-flight migration records as if the lease
had expired (see the lease-expiry paragraph above): the
records are abandoned and the affected layouts revert to the
pre-migration state.  The revoked proxy server, on its next
PROXY_PROGRESS, sees NFS4ERR_STALE_CLIENTID and may either
re-register (if the deployment policy allows) or shut down.
A future revision <bcp14>MAY</bcp14> define a dedicated PROXY_REVOKE
operation if operational experience shows lease revocation
through silence is insufficient.</t>
        </section>
      </section>
      <section anchor="sec-PROXY_PROGRESS">
        <name>Operation 93: PROXY_PROGRESS - Heartbeat and Receive Work Assignments</name>
        <section anchor="arguments-1">
          <name>ARGUMENTS</name>
          <figure anchor="fig-PROXY_PROGRESS4args">
            <name>XDR for PROXY_PROGRESS4args</name>
            <sourcecode type="xdr"><![CDATA[
/// struct PROXY_PROGRESS4args {
///     uint32_t  ppa_flags;
/// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="results-1">
          <name>RESULTS</name>
          <figure anchor="fig-PROXY_PROGRESS4res">
            <name>XDR for PROXY_PROGRESS4res</name>
            <sourcecode type="xdr"><![CDATA[
/// enum proxy_op_kind4 {
///     PROXY_OP_MOVE         = 0,
///     PROXY_OP_REPAIR       = 1,
///     PROXY_OP_CANCEL_PRIOR = 2
/// };
///
/// struct proxy_assignment4 {
///     proxy_op_kind4    pa_kind;
///     proxy_stateid4    pa_stateid;
///     nfs_fh4           pa_file_fh;
///     deviceid4         pa_source_deviceid;
///     deviceid4         pa_target_deviceid;
///     opaque            pa_descriptor<>;
/// };
///
/// struct PROXY_PROGRESS4resok {
///     uint32_t              ppr_lease_remaining_sec;
///     proxy_assignment4     ppr_assignments<>;
/// };
///
/// union PROXY_PROGRESS4res switch (nfsstat4 ppr_status) {
/// case NFS4_OK:
///     PROXY_PROGRESS4resok ppr_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 metadata server for two purposes:</t>
          <ol spacing="normal" type="1"><li>
              <t><strong>Heartbeat</strong>: extend the proxy server's registration lease.  The metadata server
responds with <tt>ppr_lease_remaining_sec</tt> so the proxy server can size
its next poll interval.</t>
            </li>
            <li>
              <t><strong>Receive work assignments</strong>: pick up zero or more units of
work the metadata server has queued for this proxy server.  Each assignment is a
<tt>proxy_assignment4</tt> describing one migration or repair the
metadata server wants this proxy server to drive.</t>
            </li>
          </ol>
          <t>Per <xref target="RFC8178"/> S4.4.3, <tt>ppa_flags</tt> is a reserved-for-future-use
flag word; the metadata server <bcp14>MUST</bcp14> reject any non-zero bit with
<tt>NFS4ERR_INVAL</tt>.  The slot allows future revisions to add
proxy-server-side appetite signaling (e.g., "do not give me more
assignments right now") without an XDR break.</t>
          <t>The metadata server returns work assignments inline in
<tt>ppr_assignments&lt;&gt;</tt>.  A proxy server that does not want new work simply
ignores the assignments past its in-flight cap; the metadata server does
not retract assignments once delivered.  Each assignment names
a single file (<tt>pa_file_fh</tt>), the source and target data servers
the migration moves data between
(<tt>pa_source_deviceid</tt> / <tt>pa_target_deviceid</tt>), and a
kind-specific opaque descriptor (<tt>pa_descriptor&lt;&gt;</tt>) for future
extensions (for example, a precomputed source-layout
descriptor so the proxy server can dial source data servers without a second
LAYOUTGET).  The <tt>pa_stateid</tt> field carries the
<tt>proxy_stateid4</tt> (<xref target="sec-proxy-stateid"/>) the metadata server has minted
for this migration; the proxy server presents it in the
<tt>OPEN(CLAIM_PROXY)</tt> that binds it to the file
(<xref target="sec-claim-proxy"/>) and references it as the handle in the
eventual PROXY_DONE / PROXY_CANCEL.</t>
          <t>The <tt>pa_kind</tt> discriminates the work type:</t>
          <dl>
            <dt><tt>PROXY_OP_MOVE</tt>:</dt>
            <dd>
              <t>drain or migrate the file's data between the named data servers.
<tt>pa_stateid</tt> is the proxy_stateid the proxy server will reference
in PROXY_DONE / PROXY_CANCEL.</t>
            </dd>
            <dt><tt>PROXY_OP_REPAIR</tt>:</dt>
            <dd>
              <t>reconstruct a missing or corrupt mirror on
<tt>pa_target_deviceid</tt> from the surviving mirrors.
<tt>pa_stateid</tt> is the proxy_stateid the proxy server will reference
in PROXY_DONE / PROXY_CANCEL.</t>
            </dd>
            <dt><tt>PROXY_OP_CANCEL_PRIOR</tt>:</dt>
            <dd>
              <t>the metadata server rescinds an assignment it delivered in a prior
PROXY_PROGRESS reply, before the proxy server acknowledged it via
OPEN+LAYOUTGET.  <tt>pa_stateid</tt> is the proxy_stateid of the
assignment being rescinded; the proxy server <bcp14>MUST</bcp14> drop any
in-progress work tagged with this proxy_stateid and <bcp14>MUST
NOT</bcp14> issue PROXY_DONE / PROXY_CANCEL for it (the metadata server has
already cleaned up the in-flight migration record on its
side and retired the proxy_stateid).</t>
            </dd>
          </dl>
          <t>For each MOVE / REPAIR assignment, the proxy server picks the work up
by issuing a normal NFSv4 OPEN+LAYOUTGET against <tt>pa_file_fh</tt>
(the L3 composite layout), shovels bytes per the kind-specific
protocol, and reports terminal status via
PROXY_DONE(pa_stateid, ...) (<xref target="sec-PROXY_DONE"/>) or
PROXY_CANCEL(pa_stateid) (<xref target="sec-PROXY_CANCEL"/>).</t>
          <t><tt>pa_file_fh</tt> is an <tt>nfs_fh4</tt> minted by the metadata server and presented to
the proxy server for use against the same metadata server.  Per <xref target="RFC8881"/> Section
4.2.3, NFSv4 filehandles are server-private opaque tokens; the
receiving server treats the byte string as opaque, validates it
only by attempting the lookup, and returns NFS4ERR_STALE or
NFS4ERR_BADHANDLE if the bytes do not resolve.  The proxy server <bcp14>MUST NOT</bcp14>
inspect, mutate, or shape-check <tt>pa_file_fh</tt>; it forwards the
filehandle verbatim in PUTFH on the same metadata server that issued it,
and the existing PUTFH semantics apply unchanged.</t>
          <t>The <tt>ppr_lease_remaining_sec</tt> field is the metadata server's
acknowledgment of this PROXY_PROGRESS as a registration lease
renewal.  It is the number of seconds remaining until the proxy server's
registration would expire absent further PROXY_PROGRESS.  A
well-behaved proxy server treats it as a lower bound on its next poll
deadline; the metadata server <bcp14>MAY</bcp14> return a smaller value than the standard
NFSv4 lease period to drive a busy proxy server to poll more often or
to encourage a quiet one to back off.</t>
          <t>Polling cadence: lease/2 in steady state.  Adaptive backoff to
lease and then 2*lease after K consecutive empty replies;
reset on any non-empty reply.  The metadata server may override the
cadence via <tt>ppr_lease_remaining_sec</tt>.</t>
          <t>The metadata-server-initiated cancellation case (the metadata server abandons an
in-flight assignment before the proxy server has driven it to terminal
state) is signaled via the <tt>PROXY_OP_CANCEL_PRIOR</tt> assignment
kind described above.  There is no separate cancel callback;
the proxy-server-initiated cancel is handled by the fore-channel
PROXY_CANCEL (<xref target="sec-PROXY_CANCEL"/>).</t>
        </section>
      </section>
    </section>
    <section anchor="sec-new-fore-channel">
      <name>New Fore-Channel Operations: PROXY_DONE and PROXY_CANCEL</name>
      <t>The proxy-server-to-metadata-server protocol uses two new fore-channel operations
in addition to the extended PROXY_PROGRESS:</t>
      <dl>
        <dt><tt>PROXY_DONE</tt> (op 94):</dt>
        <dd>
          <t>proxy server reports terminal success or failure on a specific
in-flight migration.  The metadata server uses the 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 95):</dt>
        <dd>
          <t>proxy server aborts a work item it was assigned but cannot complete
(e.g., source data server becomes unreachable, proxy server resource
exhaustion).  The metadata server treats this as PROXY_DONE with a
fail-equivalent status: rolls back to L1, drops L2/G,
frees the assignment for re-assignment by a later
PROXY_PROGRESS poll.</t>
        </dd>
      </dl>
      <t>Both operations identify the affected migration by layout
stateid.  The proxy server acquired this stateid earlier when it issued
LAYOUTGET against the migration layout (L3) for this file; the
metadata server 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 94: PROXY_DONE - Commit or Roll Back a Proxy Operation</name>
        <section anchor="arguments-2">
          <name>ARGUMENTS</name>
          <figure anchor="fig-PROXY_DONE-args">
            <name>PROXY_DONE arguments</name>
            <sourcecode type="xdr"><![CDATA[
/// struct PROXY_DONE4args {
///     proxy_stateid4  pd_stateid;
///     nfsstat4        pd_status;
/// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="results-2">
          <name>RESULTS</name>
          <figure anchor="fig-PROXY_DONE-res">
            <name>PROXY_DONE results</name>
            <sourcecode type="xdr"><![CDATA[
/// struct PROXY_DONE4res {
///     nfsstat4    pdr_status;
/// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="description-2">
          <name>DESCRIPTION</name>
          <t>PROXY_DONE signals the terminal outcome of a migration the proxy server
was assigned via PROXY_PROGRESS.  <tt>pd_stateid</tt> is the
proxy_stateid the metadata server minted when it delivered the
corresponding <tt>proxy_assignment4</tt>
(<xref target="sec-proxy-stateid"/>).  A <tt>pd_status</tt> of <tt>NFS4_OK</tt> directs the
metadata server to commit the migration (swap the file's active layout
from the pre-migration shape L1 to the post-migration shape
L2); any other value directs the metadata server to roll back (keep L1,
discard L2 and the proxy-server-only composite L3).</t>
          <t>The proxy server compounds PROXY_DONE after the byte-shoveling phase
completes (or fails):</t>
          <t><tt>
SEQUENCE PUTFH(pa_file_fh) LAYOUTRETURN(L3_stateid) PROXY_DONE(pd_stateid, status)
</tt></t>
          <t>LAYOUTRETURN runs FIRST per <xref target="RFC8881"/> S18.51, releasing the
proxy server's reference to the L3 layout cleanly via the standard
mechanism.  PROXY_DONE then operates on the in-flight
migration record keyed by the proxy_stateid; the
record is the single source of truth for migration state, so
PROXY_DONE remains valid even though L3 has just been
returned.  The proxy server <bcp14>MAY</bcp14> issue PROXY_DONE in a subsequent
compound, but the single-compound shape is <bcp14>RECOMMENDED</bcp14> to
keep the recovery window short.</t>
          <section anchor="authorization-1">
            <name>Authorization</name>
            <t>The metadata server <bcp14>MUST</bcp14> validate, in this priority order, returning the
first failure encountered:</t>
            <ol spacing="normal" type="1"><li>
                <t>The calling session belongs to a registered proxy server (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 metadata server.  Otherwise: <tt>NFS4ERR_BAD_STATEID</tt>.</t>
              </li>
              <li>
                <t>The proxy operation identified by <tt>pd_stateid</tt> is owned by
the calling session's registered-proxy server identity.  The
identity captured at PROXY_REGISTRATION time -- the
<tt>prr_registration_id</tt> if non-empty, or the matched GSS
principal / mTLS fingerprint otherwise -- is the
authorization principal, not the per-EXCHANGE_ID
<tt>clientid4</tt>.  This makes PROXY_DONE / PROXY_CANCEL
tolerant of proxy server reconnect: a proxy server that drops its session and
reconnects with a fresh EXCHANGE_ID but the same
<tt>prr_registration_id</tt> retains authority over its in-flight
migrations.  Mismatch returns <tt>NFS4ERR_PERM</tt>.</t>
              </li>
              <li>
                <t>The current filehandle (set by the preceding PUTFH) is the
<tt>pa_file_fh</tt> of the proxy operation identified by
<tt>pd_stateid</tt>.  Otherwise: <tt>NFS4ERR_BAD_STATEID</tt>.</t>
              </li>
              <li>
                <t><tt>pd_stateid.seqid</tt> matches the 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 metadata server atomically:</t>
            <ul spacing="normal">
              <li>
                <t>For a <tt>pd_status</tt> of <tt>NFS4_OK</tt>: commits the migration --
promotes L2 to be the file's layout (D dropped, G promoted),
drops L1 and L3, issues CB_LAYOUTRECALL on the prior layout
to external clients still holding cached L1 references, and
defers final removal of the decommissioned mirror D until
all L1 holders return their layouts.  See
<xref target="sec-atomic-commit"/> for the full mechanics.</t>
              </li>
              <li>
                <t>For any other <tt>pd_status</tt>: leaves the file's layout
unchanged -- L1 stays in force; L2 and L3 are discarded.
No CB_LAYOUTRECALL is needed (external clients never saw
the post-image).  The proxy server owns cleanup of any half-written
data it placed on the target G.</t>
              </li>
            </ul>
            <t>In both cases the metadata server retires the proxy operation; <tt>pd_stateid</tt>
is thereafter invalid.</t>
            <t>Atomicity is critical: external client traffic must transition
cleanly across this op; either the per-instance deltas commit
fully or they do not commit at all.</t>
          </section>
        </section>
      </section>
      <section anchor="sec-PROXY_CANCEL">
        <name>Operation 95: PROXY_CANCEL - Abort a Proxy Operation</name>
        <section anchor="arguments-3">
          <name>ARGUMENTS</name>
          <figure anchor="fig-PROXY_CANCEL-args">
            <name>PROXY_CANCEL arguments</name>
            <sourcecode type="xdr"><![CDATA[
/// struct PROXY_CANCEL4args {
///     proxy_stateid4  pc_stateid;
/// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="results-3">
          <name>RESULTS</name>
          <figure anchor="fig-PROXY_CANCEL-res">
            <name>PROXY_CANCEL results</name>
            <sourcecode type="xdr"><![CDATA[
/// struct PROXY_CANCEL4res {
///     nfsstat4    pcr_status;
/// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="description-3">
          <name>DESCRIPTION</name>
          <t>PROXY_CANCEL discards an assigned-but-unfinished migration.
The proxy server uses it when it knows it cannot complete the
assignment (the proxy server is being shut down gracefully, the source
data server is unreachable, the destination data server rejected the writes,
etc.) and wants to release the work item back to the metadata server
without computing a specific failure status.</t>
          <t><tt>pc_stateid</tt> is the proxy_stateid the metadata server minted when it
delivered the corresponding <tt>proxy_assignment4</tt>.</t>
          <t>Compound shape:</t>
          <t><tt>
SEQUENCE PUTFH(pa_file_fh) LAYOUTRETURN(L3_stateid) PROXY_CANCEL(pc_stateid)
</tt></t>
          <t>LAYOUTRETURN runs first (standard <xref target="RFC8881"/> S18.51 release
of the L3 layout); PROXY_CANCEL then operates on the
in-flight migration record only.</t>
          <section anchor="authorization-2">
            <name>Authorization</name>
            <t>The same priority-ordered validation as PROXY_DONE
(<xref target="sec-PROXY_DONE"/>) applies, with <tt>pc_stateid</tt> substituted
for <tt>pd_stateid</tt>.  In particular, the registered-proxy server identity
that owns the proxy operation identified by <tt>pc_stateid</tt> <bcp14>MUST</bcp14>
match the caller's, or the metadata server returns <tt>NFS4ERR_PERM</tt>; a proxy server
cannot cancel another proxy server's migration.</t>
          </section>
          <section anchor="side-effects">
            <name>Side effects</name>
            <t>If validation succeeds, layout-side effects mirror PROXY_DONE
with a failing <tt>pd_status</tt> -- L1 stays in force; L2 and L3 are
discarded; the half-filled target G is the proxy server's to clean up.
The metadata server retires the proxy operation, invalidates <tt>pc_stateid</tt>,
and (informatively) updates its operator-facing telemetry to
record the cancellation.  No CB_LAYOUTRECALL is needed.</t>
            <t>The distinction between PROXY_DONE(FAIL) and PROXY_CANCEL is
purely intent / accounting: PROXY_DONE(FAIL) records that the
proxy server attempted the migration and ran into a recoverable error;
PROXY_CANCEL records that the proxy server abandoned the assignment
without attempting it (or while attempting, decided not to
report a specific failure cause).  A metadata server implementation <bcp14>MAY</bcp14>
surface the distinction in operator telemetry but <bcp14>MUST NOT</bcp14>
make any behavioral distinction on the wire.</t>
          </section>
        </section>
      </section>
    </section>
    <section anchor="sec-multi-ps-fanout">
      <name>Multi-Proxy Server Assignment Fan-out</name>
      <t>When multiple proxy servers are registered against the same metadata server, the
metadata server coordinates assignment fan-out under one hard invariant:
at any time, at most one migration <bcp14>MUST</bcp14> be in flight for a
given <tt>(pa_file_fh, pa_target_deviceid)</tt> pair.  The metadata server <bcp14>MUST NOT</bcp14>
assign a migration whose <tt>(pa_file_fh, pa_target_deviceid)</tt> matches
that of an in-flight migration.</t>
      <t>How the metadata server chooses among eligible proxy servers -- by load, locality,
fault domain, capability match, or any combination -- is an
implementation matter.  The protocol constrains only the
outcome: the proxy server that receives the assignment is registered at
delivery time, and the <tt>(pa_file_fh, pa_target_deviceid)</tt> invariant
holds.</t>
      <t>When a registered proxy server loses its session -- its lease expires,
or a competing proxy server takes its registration slot in a squat --
the metadata server <bcp14>MUST</bcp14> treat each migration the proxy server had in flight as if
PROXY_DONE(FAIL) had been issued: L1 stays in force, L2 and
L3 are discarded.  The metadata server <bcp14>MAY</bcp14> then reassign the work to
another eligible proxy server; the <tt>(pa_file_fh, pa_target_deviceid)</tt>
invariant continues to hold across reassignment.</t>
      <t>A proxy server that reconnects with the same <tt>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 proxy server reclaims its layouts via the metadata-server-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 proxy server falls back to per-chunk CB_CHUNK_REPAIR for
single-shard repair, to admin-coordinated offline procedures
for policy transitions and data server evacuation, and to blocking data server
maintenance -- the data server cannot drain through a proxy server, so it must
remain reachable to clients throughout its service life.</t>
      <t>Deployments <bcp14>SHOULD</bcp14> ensure at least one registered proxy server exists
per failure domain to avoid a single point of failure on
move operations.</t>
    </section>
    <section anchor="sec-layout-shape">
      <name>Layout Shape During a Proxy Operation</name>
      <t>The layout the metadata server hands out to clients while a proxy
operation is active is the mechanism's sole client-facing
surface.  Everything else in this document -- the session,
the ops, the credential-forwarding rules -- is between the
metadata server and the proxy server.  The layout shape is therefore what a client
implementer needs to read to know how its code interacts with
a proxied file.</t>
      <t>On a LAYOUTGET, the metadata server chooses one of three outcomes:</t>
      <ul spacing="normal">
        <li>
          <t>A direct-data server layout, when no proxy operation is in flight
for the file and the client's coding-type support set
includes the file's coding.  This is the unchanged FFv2
path.</t>
        </li>
        <li>
          <t>A single-data server layout naming the proxy server, when a MOVE or REPAIR
migration is in flight for the file, or when the client's
coding-type support set does not include the file's coding
and a registered proxy server can translate.  The client uses this
layout as it would any FFv2 layout, sending CHUNK ops to
the named data server; the proxy server internally dispatches reads and
writes to the source and destination data servers.</t>
        </li>
        <li>
          <t><tt>NFS4ERR_CODING_NOT_SUPPORTED</tt> (see
<xref target="I-D.haynes-nfsv4-flexfiles-v2"/>), when the client's
coding-type support set does not include the file's coding
and no registered proxy server can translate.</t>
        </li>
      </ul>
      <t>A client that supports FFv2 -- which is the precondition for
any of this -- needs no proxy-specific code: the proxy case
arrives as a single-data server layout, indistinguishable from any
other FFv2 layout.</t>
      <section anchor="sec-atomic-commit">
        <name>Atomic commit on PROXY_DONE</name>
        <t>When the proxy server issues <tt>PROXY_DONE(pd_stateid, pd_status=NFS4_OK)</tt>,
the metadata server atomically (in one transaction):</t>
        <ol spacing="normal" type="1"><li>
            <t>Promotes L2 to be the file's layout (D dropped, G promoted)</t>
          </li>
          <li>
            <t>Drops L1 and L3 from the file's layout records</t>
          </li>
          <li>
            <t>Retires the in-flight migration record</t>
          </li>
          <li>
            <t>Issues CB_LAYOUTRECALL for the file's outstanding
client-facing (proxy-server-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 data servers, with no proxy server.</t>
        <t>When PROXY_DONE indicates failure (or PROXY_CANCEL is issued):</t>
        <ol spacing="normal" type="1"><li>
            <t>L1 is promoted unchanged -- the file falls back to its
pre-migration mirror set</t>
          </li>
          <li>
            <t>L2 is dropped; the half-filled G instance is internally
unlinked</t>
          </li>
          <li>
            <t>L3 is dropped and the migration record retired</t>
          </li>
          <li>
            <t>CB_LAYOUTRECALL is issued for the proxy-server-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 proxy server, no client ever
addressed D directly, and there are no client writes in flight
to D when the swap occurs.  The deferred <tt>REMOVE_MIRROR(D)</tt>
covers only the proxy server's own trailing writes: by the time it
issues PROXY_DONE the proxy server, as the sole writer, has quiesced its
M2 fan-out, so the deferral window is short and contains no
client-visible activity.</t>
        <t>A client holding a proxy-server-naming layout when CB_LAYOUTRECALL
arrives returns it and re-LAYOUTGETs in the usual way.
In-flight client I/O to the proxy server across that boundary is handled
by the in-flight-I/O rules for a proxy server change (see "In-Flight I/O
When the proxy server Changes").</t>
      </section>
      <section anchor="sec-claim-proxy">
        <name>The CLAIM_PROXY open claim</name>
        <t>The proxy server opens the file with a new OPEN claim, <tt>CLAIM_PROXY</tt>.
A bare <tt>OPEN(CLAIM_NULL)</tt> cannot serve here: it would be
indistinguishable from an ordinary or racing OPEN on the
registered-proxy server session, leaving the metadata server to infer proxy intent
from session state -- which it cannot do reliably.
<tt>CLAIM_PROXY</tt> makes the proxy OPEN explicit and carries, in
one step, what the metadata server needs to bind the proxy server to the file.</t>
        <t><tt>open_claim_type4</tt> gains one enumerant and <tt>open_claim4</tt> one
union arm:</t>
        <figure anchor="fig-claim-proxy">
          <name>The CLAIM_PROXY open claim</name>
          <sourcecode type="xdr"><![CDATA[
/// /* New OPEN claim for a proxy server; extends the
///    open_claim_type4 enumeration of [RFC8881]. */
///
/// const CLAIM_PROXY = 7;
///
/// struct open_claim_proxy4 {
///         proxy_stateid4  ocp_proxy_stateid;
///         nfs_fh4         ocp_ps_fh;
/// };
///
/// /* open_claim4 gains the arm:
///         case CLAIM_PROXY:
///                 open_claim_proxy4       ocp_proxy;
///  */
]]></sourcecode>
        </figure>
        <t><tt>CLAIM_PROXY</tt> is filehandle-based and opens an existing file:
the proxy server issues <tt>PUTFH</tt> of the assignment's <tt>pa_file_fh</tt>
followed by <tt>OPEN(CLAIM_PROXY)</tt>, with no directory filehandle
and no component name, in the manner of <tt>CLAIM_FH</tt>.
<tt>CLAIM_PROXY</tt> <bcp14>MUST NOT</bcp14> be combined with <tt>OPEN4_CREATE</tt>.</t>
        <t>The operand carries two values:</t>
        <dl>
          <dt><tt>ocp_proxy_stateid</tt>:</dt>
          <dd>
            <t>the <tt>proxy_stateid4</tt> the metadata server minted for this assignment
and returned in the PROXY_PROGRESS work assignment
(<xref target="sec-PROXY_PROGRESS"/>).  It is the correlator that
identifies this OPEN as the proxy OPEN for a specific
assignment; the metadata server does not infer proxy intent from the
session.</t>
          </dd>
          <dt><tt>ocp_ps_fh</tt>:</dt>
          <dd>
            <t>the filehandle under which the proxy server will serve the file to
clients: the data-server filehandle that appears in the
layout the metadata server hands a codec-incapable client, and the
filehandle a non-pNFS client obtains by LOOKUP against
the proxy server.  Only the proxy server can mint this filehandle; it is
opaque to the metadata server, which records it and copies it
verbatim into the layouts it issues.  Carrying it in the
OPEN binds it atomically with the proxy OPEN.</t>
          </dd>
        </dl>
        <t>The metadata server <bcp14>MUST</bcp14> verify that <tt>ocp_proxy_stateid</tt> is valid, that
it names an outstanding assignment, that the assignment was
made to the calling clientid, and that the current
filehandle is that assignment's file.  An invalid or stale
stateid draws <tt>NFS4ERR_BAD_STATEID</tt>.</t>
        <t>A proxy server <bcp14>MUST NOT</bcp14> issue <tt>OPEN(CLAIM_PROXY)</tt> unless it holds a
successful PROXY_REGISTRATION (<xref target="sec-PROXY_REGISTRATION"/>);
successful registration is what establishes that the metadata server
implements this extension.</t>
        <t><tt>OPEN(CLAIM_PROXY)</tt> returns the ordinary OPEN result: an open
stateid, and an <tt>open_delegation4</tt> which the metadata server <bcp14>MUST</bcp14> set to
<tt>OPEN_DELEGATE_NONE</tt> -- a delegation to the proxy server would conflict
with the migration the proxy server is itself driving.  The proxy server opens
with <tt>OPEN4_SHARE_ACCESS_BOTH</tt> and <tt>OPEN4_SHARE_DENY_NONE</tt>.
A retransmitted or re-issued <tt>OPEN(CLAIM_PROXY)</tt> is handled
exactly as for any other claim: the session replay cache
absorbs retransmits, and a genuine repeated OPEN by the same
open-owner is an ordinary share-state operation.</t>
        <t>The proxy server then obtains the L3 composite layout with an ordinary
LAYOUTGET; the metadata server serves L3 because the calling clientid
holds an in-flight migration record for the file.  The L3
layout stateid is a normal NFSv4 layout stateid, used for
CHUNK / WRITE / READ I/O against the source and target data servers
in the standard way.  It is distinct from <tt>proxy_stateid4</tt>
(<xref target="sec-proxy-stateid"/>), which is a control-plane handle for
the migration as a whole and is never presented to LAYOUTGET;
the metadata server keys its in-flight migration record on the
proxy_stateid.  Separating the two -- one for I/O on a
layout, one for the migration -- keeps the migration record's
lifetime independent of any LAYOUTGET / LAYOUTRETURN cycle
the proxy server performs during the byte-shoveling phase.</t>
      </section>
      <section anchor="drain-interaction">
        <name>Drain interaction</name>
        <t>The DRAINING state on D is observable to external
clients only through the absence of new layouts naming D:
while D is DRAINING, the metadata server does not place D in any new
mirror set.  Before the migration becomes active for an
existing file whose layout names D, the metadata server issues
CB_LAYOUTRECALL on every outstanding layout for the file
whose mirror set includes D.  Once those layouts have been
returned -- or administratively revoked when a client's CB
back-channel fails to ack within the recall window -- the
migration is in flight.</t>
        <t>From that point until the assigned proxy server completes its
<tt>OPEN(CLAIM_PROXY)</tt> (<xref target="sec-claim-proxy"/>) and registers the
filehandle under which it will serve the file, the metadata server cannot
yet build a client-facing layout, and answers every LAYOUTGET
for the file with <tt>NFS4ERR_DELAY</tt>; clients retry.  This window
<bcp14>MUST</bcp14> be bounded: if the assigned proxy server does not complete its
<tt>OPEN(CLAIM_PROXY)</tt> within a deadline tied to its registration
lease, the metadata server reassigns or abandons the assignment and stops
returning <tt>NFS4ERR_DELAY</tt>.  Once the proxy server has opened, subsequent
LAYOUTGETs for the file return a layout naming the proxy server.</t>
        <t>This omit-and-replace ordering guarantees that no client write
hits D after the migration has started.  The alternative --
keep-and-shadow, in which the layout view continues to include
D and the proxy server shadows client writes from D to G as they happen
-- requires the proxy server to expose itself as a flex-files data server
(an <tt>INTERPOSED</tt> instance taking the place of D in the visible
layout, with the proxy server funneling writes to both D and G).  This
shape is defined in the per-instance delta model below
(informative) but is not exercised by the wire ops in this
revision.</t>
      </section>
      <section anchor="per-instance-migration-deltas-informative">
        <name>Per-instance migration deltas (informative)</name>
        <t>The L1/L2/L3 framing above describes one valid implementation
approach -- whole-layout swap -- that captures the simplest
case (single mirror replacement under a Client Side Mirroring
codec).  A metadata server implementation that supports more general
migrations (e.g., a single shard add to an erasure-coded
file, or a partial mirror-set rotation under FFv2 RS) <bcp14>MAY</bcp14>
record migration state as per-instance deltas on the file's
existing layout records, rather than as a complete L2/L3 pair.</t>
        <t>In this informative model, each migration record carries an
array of per-instance deltas, each delta describing a
transformation on one position within one segment of
<tt>layout_segments</tt>.  Four instance states are useful:</t>
        <dl>
          <dt><tt>STABLE</tt>:</dt>
          <dd>
            <t>unchanged; client writes go here directly.</t>
          </dd>
          <dt><tt>DRAINING</tt>:</dt>
          <dd>
            <t>a slot being decommissioned; under omit-and-replace, the
LAYOUTGET view-build path omits this slot and replaces
it with the matching INCOMING.</t>
          </dd>
          <dt><tt>INCOMING</tt>:</dt>
          <dd>
            <t>a new slot the proxy server is filling; under omit-and-replace, the
LAYOUTGET view-build path emits this slot in place of the
matching DRAINING.</t>
          </dd>
          <dt><tt>INTERPOSED</tt>:</dt>
          <dd>
            <t>a slot whose visible endpoint is the proxy server, with the proxy server
internally fanning writes out to one or more target data servers.
Used by keep-and-shadow (forward-compat; not produced by
the wire ops in this revision).</t>
          </dd>
        </dl>
        <t>The current published layout (<tt>layout_segments</tt>) is built
through the deltas: when LAYOUTGET runs while a migration
is active, the layout-build path consults the migration
record and emits the during-migration view by applying the
deltas to the base segments.  <tt>layout_segments</tt> itself is
never mutated until <tt>PROXY_DONE(NFS4_OK)</tt> collapses the
deltas into the base records permanently.</t>
        <t>This per-instance model and the L1/L2/L3 swap model agree on
the wire-visible behavior in the simplest case (single mirror
replacement, omit-and-replace).  The wire ops in this draft
do not require either implementation; a metadata server chooses whichever
matches its layout-record machinery.</t>
        <t>The wire ops in this draft do not constrain the choice; the
per-instance delta model is one known implementation strategy
that has been used to track the four record-builder invariants
and a lease-aware reaper for the migration record /
proxy_stateid tables across the lifecycle described above.</t>
      </section>
    </section>
    <section anchor="client-behavior">
      <name>Client Behavior</name>
      <t>During a proxy operation the layout the metadata server hands a client is
a single-data server FFv2 layout naming the proxy server.  The client treats it
as any other FFv2 layout, sending CHUNK ops to the named data server
under its existing layout stateid.  Nothing in the client's
path distinguishes "the data server is a proxy server" from "the data server is a real
data server"; that distinction lives entirely on the metadata server
side.</t>
      <t>The proxy server accepts those CHUNK ops under the client's existing
layout stateid because the metadata server has registered the stateid via
TRUST_STATEID on the proxy server, per the tight-coupling semantics in
<xref target="I-D.haynes-nfsv4-flexfiles-v2"/>.</t>
      <t>The client handles proxy-server-side errors (NFS4ERR_DELAY, connection
loss, NFS4ERR_BAD_STATEID) exactly as it would any other data server
error: report LAYOUTERROR to the metadata server and expect either a new
layout or a proxy server reassignment in return.</t>
      <section anchor="when-the-layout-is-recalled">
        <name>When the Layout Is Recalled</name>
        <t>If the metadata server recalls the layout mid-operation (the proxy server failed
and is being replaced, or the operation completed and normal
data server layouts are being reissued), the client LAYOUTRETURNs as
usual and reacquires via LAYOUTGET.  The new layout may name
a different proxy server, a different mirror set, or -- if the proxy
operation has completed -- the real data servers directly.</t>
      </section>
      <section anchor="in-flight-io-when-the-proxy-server-changes">
        <name>In-Flight I/O When the Proxy Server Changes</name>
        <t>In-flight I/O to the old proxy server when the metadata server recalls the layout
<bcp14>MAY</bcp14> complete at the old proxy server; results remain valid under the
old proxy server's authority.  New I/O issued after LAYOUTRETURN <bcp14>MUST</bcp14>
go through the data server(es) the new layout names: a replacement
proxy server, or the real data servers 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
metadata server has queued an assignment for a proxy server but the proxy server has not
acknowledged it via OPEN+LAYOUTGET), PROXY_ACTIVE (the proxy server
is driving a move or repair), COMMITTING (the proxy server has issued
PROXY_DONE(OK) and the metadata server is recalling the old layout from
external clients), and DONE (clients are on the post-move
layout, source data servers retired).  The state is metadata-server-local:
clients never observe these state names directly, but a
client's behaviour is shaped by which layout the metadata server is
currently handing out.  A given file spends most of its
lifetime in READY; a proxy operation is a relatively short
excursion through the other four states, after which the
file returns to READY with a new layout in place (or, on
cancellation or failure, with the old layout preserved).</t>
      <t>The diagram below shows the states and the principal
transitions, including the failure exits from ASSIGNED and
PROXY_ACTIVE back to READY.  The Transitions table that
follows enumerates each transition with its trigger and
effect.</t>
      <figure anchor="fig-state-machine">
        <name>File state during a proxy operation</name>
        <artwork><![CDATA[
            (admin, policy, repair, or maintenance trigger)
                               |
                               v
                         +------------+
                         |   READY    |
                         | source     |
                         | layout     |
                         | only       |
                         +-----+------+
                               |
                               | MDS selects registered PS;
                               | queues a proxy_assignment4
                               | for delivery in next
                               | PROXY_PROGRESS reply
                               v
                         +--------------+
                         |   ASSIGNED   |---> back to READY on
                         | MDS has the  |     cancellation
                         | in-flight    |     (MDS-initiated, or
                         | record; PS   |     lease expires before
                         | has not yet  |     the PS picks up)
                         | OPEN'd file  |
                         +-----+--------+
                               |
                               | PS picks up the assignment:
                               | OPEN(pa_file_fh) + LAYOUTGET
                               | (L3 composite layout)
                               v
                         +--------------+
                         | PROXY_ACTIVE |---> back to READY on
                         | clients see  |     PROXY_DONE(FAIL),
                         | single-DS    |     PROXY_CANCEL, or
                         | layout       |     PS lease expiry;
                         | naming PS;   |     layout reverts to L1
                         | PS drives    |
                         | source->dest |
                         +-----+--------+
                               |
                               | PS issues SEQUENCE
                               | PUTFH LAYOUTRETURN
                               | PROXY_DONE(stid, OK)
                               v
                         +------------+
                         | COMMITTING |
                         | MDS issues |
                         | CB_LAYOUT- |
                         | RECALL for |
                         | old layout |
                         +-----+------+
                               |
                               | all clients have
                               | LAYOUTRETURNed
                               v
                         +------------+
                         |   DONE     |
                         | new layout |
                         | live;      |
                         | source     |
                         | DSes       |
                         | retired    |
                         +------------+
]]></artwork>
      </figure>
      <section anchor="transitions">
        <name>Transitions</name>
        <table>
          <thead>
            <tr>
              <th align="left">From</th>
              <th align="left">To</th>
              <th align="left">Trigger</th>
              <th align="left">Actions</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">READY</td>
              <td align="left">ASSIGNED</td>
              <td align="left">metadata server decides to move or repair</td>
              <td align="left">metadata server queues a <tt>proxy_assignment4</tt> (kind=MOVE or REPAIR) for delivery in the next PROXY_PROGRESS reply to the selected proxy server; creates the in-flight migration record</td>
            </tr>
            <tr>
              <td align="left">ASSIGNED</td>
              <td align="left">PROXY_ACTIVE</td>
              <td align="left">proxy server picks up the assignment</td>
              <td align="left">proxy server issues <tt>OPEN(CLAIM_PROXY)</tt> + LAYOUTGET against <tt>pa_file_fh</tt>; metadata server begins serving clients a layout naming the proxy server</td>
            </tr>
            <tr>
              <td align="left">PROXY_ACTIVE</td>
              <td align="left">COMMITTING</td>
              <td align="left">proxy server issues PROXY_DONE with <tt>pd_status=NFS4_OK</tt></td>
              <td align="left">metadata server begins CB_LAYOUTRECALL fan-out to clients still on the old layout</td>
            </tr>
            <tr>
              <td align="left">COMMITTING</td>
              <td align="left">DONE</td>
              <td align="left">All clients have LAYOUTRETURNed</td>
              <td align="left">metadata server issues post-move layouts (L2); source DSes retired</td>
            </tr>
            <tr>
              <td align="left">ASSIGNED</td>
              <td align="left">READY</td>
              <td align="left">metadata-server-initiated cancellation: metadata server includes a <tt>PROXY_OP_CANCEL_PRIOR</tt> assignment in the next PROXY_PROGRESS reply</td>
              <td align="left">metadata server drops the in-flight record; proxy server drops the assignment from its in-flight queue</td>
            </tr>
            <tr>
              <td align="left">PROXY_ACTIVE</td>
              <td align="left">READY</td>
              <td align="left">proxy server failed and no replacement available; or proxy-server-initiated cancellation via PROXY_CANCEL; or PROXY_DONE with a failing <tt>pd_status</tt></td>
              <td align="left">metadata server reverts layouts to pre-move source set (L1)</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
    <section anchor="proxy-server-failure-and-recovery">
      <name>Proxy Server Failure and Recovery</name>
      <section anchor="proxy-server-crash-during-proxyactive">
        <name>Proxy Server Crash During PROXY_ACTIVE</name>
        <t>When a proxy server crashes mid-operation, client I/O routed through
it receives NFS4ERR_DELAY (if the proxy server is reachable but
unhealthy) or connection errors (if unreachable), and the
affected clients report LAYOUTERROR to the metadata server.  The metadata server <bcp14>MAY</bcp14>
select a replacement proxy server from the registered pool and queue a
fresh <tt>proxy_assignment4</tt> (kind MOVE or REPAIR) for that proxy server
in its next PROXY_PROGRESS reply, with the source layout
updated to reflect current reality -- destination data servers that
the failed proxy server populated are now part of the source set -- and
the destination layout unchanged; the replacement proxy server resumes
from wherever the failed proxy server left off.</t>
        <t>Before the replacement proxy server's layout becomes live, the metadata server
<bcp14>MUST</bcp14> fence the failed proxy server: it revokes the failed proxy server's L3
layout stateid (REVOKE_STATEID) and, where the data server protocol
supports it, fences the failed proxy server at the source and target
data servers.  Fencing closes the window in which a delayed write
from a failed-but-not-dead proxy server could land after the
replacement proxy server has taken over -- a two-proxy server instance of the
write race the single-writer model otherwise prevents.  The
metadata server then issues CB_LAYOUTRECALL on the old layout and the
replacement proxy server's layout becomes live for new LAYOUTGETs.</t>
        <t>If the metadata server cannot find a replacement within a policy timeout,
it <bcp14>MUST</bcp14> cancel the operation: revert to the pre-move source
layout, do not issue a destination layout, and mark the
destination data servers for cleanup or retry.</t>
      </section>
      <section anchor="cascading-proxy-server-failure">
        <name>Cascading Proxy Server Failure</name>
        <t>A second proxy server failure on the same operation <bcp14>SHOULD</bcp14> escalate to
deployment management rather than trigger another automatic
replacement.  Recurring failures across multiple proxy servers
indicate an environmental issue no proxy server can work around -- an
unreachable source data server, a misconfiguration, or a starved
replacement pool -- that operator attention will resolve
sooner than another retry.</t>
      </section>
      <section anchor="source-data-server-crash-during-proxyactive">
        <name>Source Data Server Crash During PROXY_ACTIVE</name>
        <t>A source data server crash reduces the proxy server's read parallelism but does
not block forward progress as long as the erasure code can
still reconstruct the file from the surviving source data servers.
If the source set degrades past reconstructibility, the
operation transitions to whole-file repair semantics
automatically: ranges that can still be reconstructed
succeed; ranges that cannot terminate the operation with
NFS4ERR_PAYLOAD_LOST.</t>
      </section>
      <section anchor="destination-data-server-crash-during-proxyactive">
        <name>Destination Data Server Crash During PROXY_ACTIVE</name>
        <t>A destination data server crash is handled as a normal data server failure on
the destination side.  The proxy server, acting as a client to the
destination data servers, reports LAYOUTERROR to the metadata server, which <bcp14>MAY</bcp14>
substitute a spare or mark the destination
FFV2_DS_FLAGS_REPAIR.  The proxy server continues pushing to the
remaining destinations, and clients are unaffected.</t>
      </section>
    </section>
    <section anchor="sec-mds-recovery">
      <name>Metadata Server Crash Recovery</name>
      <t>Clients and the proxy server detect metadata server session loss and enter RECLAIM
per <xref target="RFC8881"/> S8.4 / S10.2.1.  The proxy server's recovery extends
the standard NFSv4.1 client-recovery sequence with one
proxy-specific step -- re-registration -- and one explicit
safety rule: if the proxy server cannot reclaim a layout for a
migration it had in flight, the proxy server drops that migration
rather than continuing with stale state.</t>
      <section anchor="sec-ps-recovery">
        <name>Proxy Server Recovery Sequence</name>
        <t>The proxy server, after detecting metadata server session loss, performs the
following steps in order:</t>
        <ol spacing="normal" type="1"><li>
            <t><strong>EXCHANGE_ID + CREATE_SESSION</strong> with the proxy server's prior
<tt>client_owner4</tt>.  Standard NFSv4.1 client recovery; the
proxy server's <tt>clientid4</tt> is restored when the metadata server recognizes the
prior <tt>client_owner4</tt>.</t>
          </li>
          <li>
            <t><strong>PROXY_REGISTRATION</strong> with the proxy server's prior
<tt>prr_registration_id</tt>.  Re-registration is idempotent:
the proxy server sends the same fields it would for a first-time
registration and the metadata server accepts them as re-establishing
the proxy server role on this session.  The metadata server does not assume
that it retained any record of this proxy server being registered
previously; PROXY_REGISTRATION is the proxy server's explicit
assertion of proxy-server role for this session.  Until this step
completes, the metadata server treats the client as an ordinary
NFSv4 client and <bcp14>MUST NOT</bcp14> deliver proxy assignments to
it.</t>
          </li>
          <li>
            <t><strong>PROXY_PROGRESS</strong> to pull the assignment queue.  If the
metadata server has retained any in-flight migrations owned by this
proxy server, it delivers them in the reply -- each as a fresh
<tt>proxy_assignment4</tt> carrying a fresh <tt>proxy_stateid</tt> (the
prior <tt>proxy_stateid</tt> is from a prior boot and is
permanently stale; see <xref target="sec-proxy-stateid"/>).  For each
re-delivered assignment, the proxy server attempts to match it to
a retained sidecar entry by <tt>(pa_file_fh,
pa_target_deviceid)</tt>.  Matched assignments proceed to step 4;
unmatched assignments are handled as fresh assignments.</t>
          </li>
          <li>
            <t><strong>Per-file layout reclaim</strong>, for each matched assignment:
<tt>OPEN_RECLAIM(CLAIM_PREVIOUS, pa_file_fh)</tt> per
<xref target="RFC8881"/> S9.11.1, followed by
<tt>LAYOUTGET(reclaim=true)</tt> per <xref target="RFC8881"/> S18.43.3 with
the proxy server's retained layout stateid as the reclaim key.  On
success the metadata server returns a fresh layout stateid for the
resumed migration and the proxy server continues from where it
left off.  On <tt>NFS4ERR_NO_GRACE</tt>, <tt>NFS4ERR_RECLAIM_BAD</tt>,
or any other reclaim failure, the proxy server <bcp14>MUST</bcp14> drop the
migration: it issues <tt>PROXY_CANCEL</tt> with the fresh
<tt>proxy_stateid</tt> delivered in step 3 to signal the metadata server
that the migration cannot be resumed, discards the
retained sidecar entry, and halts any pending I/O for
the file.</t>
          </li>
          <li>
            <t><strong>Sidecar entries the metadata server did not re-deliver.</strong>  For any
migration the proxy server retained in its sidecar but the metadata server did
not include in step 3, the proxy server <bcp14>MUST</bcp14> drop that migration:
discard the sidecar entry and halt any pending I/O for
the file.  No signal to the metadata server is needed -- the metadata server
already has no record of this migration.</t>
          </li>
          <li>
            <t><strong>RECLAIM_COMPLETE</strong> when all per-file reclaims and drops
are done.</t>
          </li>
        </ol>
        <t>Dropped migrations rejoin the metadata server's normal assignment path:
a data server still DRAINING when recovery settles will, in due
course, attract a fresh <tt>proxy_assignment4</tt> -- to this proxy server or
another -- under the <tt>(pa_file_fh, pa_target_deviceid)</tt>
invariant of <xref target="sec-multi-ps-fanout"/>.</t>
        <t>The sidecar match in step 3 is best-effort across a metadata server
reboot.  <tt>deviceid4</tt> is server-scoped and <bcp14>MAY</bcp14> change across a
restart per <xref target="RFC8881"/> S3.3.7; a target deviceid the metadata server
reassigns on restart will not match the proxy server's retained sidecar
entry, the proxy server will not recognize the re-delivery as the same
migration, and the affected sidecar entries are dropped per
step 5.  The autopilot re-drives the work as a fresh
assignment.  Implementations that preserve target deviceids
across restart will resume mid-flight; those that do not will
re-drive from scratch -- both are conformant.</t>
        <section anchor="retention-requirement">
          <name>Retention Requirement</name>
          <t>A proxy server <bcp14>MUST</bcp14> be able to supply each in-flight migration's
layout stateid as the reclaim key after a proxy-server-process
restart.  The natural implementation retains it in proxy-server-local
storage (e.g., a small sidecar file or DB table keyed by
<tt>pa_file_fh</tt>) when the metadata server grants the L3 layout; how it is
retained is an implementation matter.  A proxy server that cannot
supply the prior stateid cannot reclaim its layouts after a
restart, and the affected migrations are dropped per step 5
above.</t>
        </section>
      </section>
      <section anchor="proxy-server-identity-continuity">
        <name>Proxy Server Identity Continuity</name>
        <t>A proxy server implementation <bcp14>SHOULD</bcp14> retain its <tt>client_owner4</tt> across
proxy-server-process restart so that post-restart EXCHANGE_ID recovers
the same <tt>clientid</tt> and the in-flight migration records
remain valid.</t>
        <t>If the proxy server's <tt>client_owner4</tt> rotates (e.g., because proxy server
process state was lost), the new EXCHANGE_ID gets a fresh
<tt>clientid4</tt>.  The proxy server's <tt>prr_registration_id</tt> (if matching
the prior registration) identifies it as the same
operator-meaningful proxy server 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 metadata server did not retain is
dropped by the proxy server -- either because the metadata server does not
re-deliver it in PROXY_PROGRESS, or because the per-file
reclaim returns <tt>NFS4ERR_NO_GRACE</tt> / <tt>NFS4ERR_RECLAIM_BAD</tt>
-- and the autopilot is free to re-drive the work as a
fresh assignment.  No proxy-specific signalling beyond
standard NFSv4 reclaim errors and <tt>PROXY_CANCEL</tt> is needed.</t>
      </section>
    </section>
    <section anchor="sec-security">
      <name>Security Considerations</name>
      <t>The security surface added by this document sits in two
places: the session the proxy server establishes with the metadata server, and the
data path clients take through the proxy server during a proxy
operation.  The session is narrower than the data path --
only the metadata server talks to the proxy server over it, and the metadata server has long
been a trusted coordinator in the pNFS model -- but it
carries operations that affect every client whose layouts
reach a proxy server.  The data path is broader, because it exposes
the proxy server to every client whose layout names it; a compromised
proxy server on that path has the same observational
and modification reach as a compromised data server, and in the
translating-proxy server case a larger reach because of the elevated
identity the proxy server typically runs with.</t>
      <t>Each threat the design addresses or explicitly leaves out of
scope is named below.  Credential forwarding, the most
consequential and the most easily implemented incorrectly,
is expanded in <xref target="sec-credential-forwarding"/>.</t>
      <dl>
        <dt>proxy server authority:</dt>
        <dd>
          <t>A proxy server in PROXY_ACTIVE sees all client I/O for the proxied
file.  A compromised proxy server can observe or modify file data.
Deployments <bcp14>MUST</bcp14> treat proxy-server-capable hosts as at least as
trusted as the data servers they proxy for.  PROXY_REGISTRATION
<bcp14>SHOULD</bcp14> be gated by deployment-level authorization;
arbitrary hosts that present the op without prior
provisioning <bcp14>SHOULD</bcp14> be rejected.</t>
        </dd>
        <dt>Transport security across the operation:</dt>
        <dd>
          <t>The proxy server's connections to source and destination data servers are
independent of the client's connection to the proxy server.  A proxy server
<bcp14>MAY</bcp14> read from an AUTH_SYS source and write to a TLS
destination (or any other combination).  The proxy server is
responsible for enforcing the effective security policy
(e.g., do not downgrade encrypted data to a plaintext
data server).</t>
        </dd>
        <dt>Principal binding during a proxy operation:</dt>
        <dd>
          <t>For proxy-server-to-data-server traffic (the proxy server reading source data servers and
writing destination data servers to carry out a MOVE or REPAIR
assignment), the proxy server presents a principal to those data servers
that they will accept; this is the proxy server's own service
identity unless constrained delegation or equivalent is
arranged.  Forwarding the client's identity to the peer
data servers for proxy-server-driven data movement is NOT required and is
typically NOT practical (the client is not in the
conversation at that point).  See
<xref target="sec-credential-forwarding"/> for the case of
client-initiated file I/O through a translating proxy server,
where the credential-forwarding rule is different and
stricter.</t>
        </dd>
        <dt>proxy server impersonation:</dt>
        <dd>
          <t>A malicious metadata server could register a hostile entity as a proxy server.
The existing metadata server trust model already grants the metadata server this
capability via CB_LAYOUTRECALL and the ability to issue
any layout it chooses; PROXY_REGISTRATION does not
weaken it.  Clients that require stronger proxy server identity
verification <bcp14>SHOULD</bcp14> apply deployment-level authorization
to the proxy server's transport-security credentials.</t>
        </dd>
        <dt>Registration lease expiry:</dt>
        <dd>
          <t>If a proxy server's lease expires mid-operation, the metadata server <bcp14>MUST</bcp14>
abandon the operation: discard the in-flight migration
record, revert the affected layouts to the pre-operation
state, and arrange cleanup of any half-populated
destination data servers.  The metadata server <bcp14>MUST NOT</bcp14> continue to route
client I/O to a proxy server whose registration has lapsed.</t>
        </dd>
      </dl>
      <section anchor="sec-credential-forwarding">
        <name>Credential Forwarding and the Privilege Boundary</name>
        <t>A translating proxy server (see <xref target="sec-codec-translation"/>) has
structurally elevated privilege by design.  To perform its
management tasks -- moves, repairs, evacuations,
cross-tenant re-exports -- the deployment grants the proxy server's
service identity broad access: typically not-root-squashed,
often read/write to every file in the namespace, and session
authority to every data server.  That privilege is intentional.</t>
        <t>A codec-ignorant client that reaches the proxy server, however, arrives
with its own RPC credentials that the proxy server does not itself need
in order to function.  An NFSv3 client's uid/gid, an
AUTH_SYS-squashed identity, an RPCSEC_GSS principal -- none of
these are the proxy server's own.  If the proxy server ignores the client's
credentials and issues metadata server or data server operations under its own
service identity when translating client I/O, every client
that reaches the proxy server silently inherits the proxy server's privilege.
This is a protocol-level privilege-escalation vector, and
this document calls it out rather than hiding it.</t>
        <t>The normative requirements below apply whenever a proxy server is
translating client-initiated file I/O (as distinct from
proxy-server-driven move / repair work, which runs under the proxy server's own
authority on directives from the metadata server).  They form a cohesive
set: credential pass-through is the core requirement;
no-squash-inversion closes the most common way pass-through
can be implemented incorrectly;
authorization-remains-with-metadata server names the responsibility on
the metadata server side of the same contract;
service-identity-is-for-the-control-plane draws the line
between the op paths where the proxy server uses its own credentials
and the op paths where it does not; and the failure-mode
rule specifies the correct refusal behaviour rather than
letting a silent fall-through become the escape hatch.</t>
        <dl>
          <dt>Credential pass-through:</dt>
          <dd>
            <t>The proxy server <bcp14>MUST</bcp14> present the client's credentials (RPC auth
flavor and principal) on every metadata server or data server operation it
issues as a consequence of a client-initiated request.
Specifically, a client <tt>READ</tt> that the proxy server expands into
<tt>LAYOUTGET</tt> + <tt>CHUNK_READ</tt> <bcp14>MUST</bcp14> carry the client's
credentials on both the <tt>LAYOUTGET</tt> against the metadata server and
the <tt>CHUNK_READ</tt> against the data servers.  The proxy server <bcp14>MUST NOT</bcp14>
substitute its own service identity for client-initiated
operations.</t>
          </dd>
          <dt>No squash inversion:</dt>
          <dd>
            <t>If the client arrives with a root-squashed identity (for
example, uid 0 mapped to nobody by the NFSv3 export
configuration on the client-facing side of the proxy server), the
proxy server <bcp14>MUST</bcp14> preserve the squashed identity when forwarding.
The proxy server <bcp14>MUST NOT</bcp14> translate a client's squashed
credentials back into unsquashed root, even though the
proxy server's own identity is typically unsquashed.</t>
          </dd>
          <dt>Authorization remains with the metadata server:</dt>
          <dd>
            <t>When a client-initiated operation reaches the metadata server over a
proxy server &lt;-&gt; metadata server session, the metadata server <bcp14>MUST</bcp14> use the RPC credentials
carried on that compound for authorization and <bcp14>MUST NOT</bcp14>
substitute the proxy server's session-level identity.
Equivalently: the metadata server performs access-control checks
against the forwarded client credentials, not against
the proxy server's service identity, for any client-initiated file
operation.  The proxy server is a translator, not an authority.
This is what prevents proxy server deployment from becoming a
blanket ACL override.</t>
          </dd>
          <dt>proxy server service identity is for the control plane only:</dt>
          <dd>
            <t>The proxy server <bcp14>MAY</bcp14>, and typically <bcp14>MUST</bcp14>, use its own service
identity for:
</t>
            <ul spacing="normal">
              <li>
                <t>The metadata server &lt;-&gt; proxy server session (the session the proxy server opens to
the metadata server, on which PROXY_REGISTRATION, PROXY_PROGRESS,
PROXY_DONE, and PROXY_CANCEL all flow on the
fore-channel; the session's back-channel is not used
by this draft).</t>
              </li>
              <li>
                <t>Peer-data server session setup for proxy-server-driven data movement
(reading source data servers, writing destination data servers under
a MOVE assignment the metadata server has delivered via
PROXY_PROGRESS).</t>
              </li>
              <li>
                <t>proxy server housekeeping.</t>
              </li>
            </ul>
            <t>The proxy server's service identity <bcp14>MUST NOT</bcp14> be used for
client-initiated file data operations.</t>
          </dd>
          <dt>Failure mode on missing credentials:</dt>
          <dd>
            <t>If the proxy server cannot forward a client's credentials for some
reason (e.g., the client presented AUTH_NONE, or the
client-facing side used a security flavor the proxy server cannot
propagate), the proxy server <bcp14>MUST</bcp14> reject the client operation with
the equivalent of NFS4ERR_ACCESS (or NFS3ERR_ACCES for
NFSv3 clients).  The proxy server <bcp14>MUST NOT</bcp14> fall back to serving
the operation under its own identity.</t>
          </dd>
        </dl>
        <t>Deployment-level requirements:</t>
        <ul spacing="normal">
          <li>
            <t>PROXY_REGISTRATION <bcp14>MUST</bcp14> be deployment-authorized.  An
unknown host presenting PROXY_REGISTRATION <bcp14>MUST</bcp14> be
rejected.  This is the only wire-level defense against a
hostile entity registering as a proxy server and then receiving
client-forwarded credentials.</t>
          </li>
          <li>
            <t>The metadata server &lt;-&gt; proxy server session <bcp14>MUST</bcp14> use RPCSEC_GSS <xref target="RFC7861"/> or
RPC-over-TLS <xref target="RFC9289"/> with mutual authentication.
AUTH_SYS on the metadata server &lt;-&gt; proxy server session is forbidden.</t>
          </li>
          <li>
            <t>Deployments <bcp14>SHOULD</bcp14> audit both the proxy server's
credential-forwarding behavior (the proxy server logs what it
forwards) and
the metadata server's authorization checks (the metadata server logs what
principal authorized each operation).  Divergence between
the two indicates a credential-forwarding bug or
compromise.</t>
          </li>
        </ul>
        <t>What the protocol cannot defend against:</t>
        <ul spacing="normal">
          <li>
            <t>A compromised proxy server has direct access to whatever credentials
pass through it.  Credential confidentiality collapses the
moment the proxy server is under adversary control.  Mitigation is
operational: restrict which hosts can register as a proxy server,
audit PROXY_REGISTRATION events, rotate deployment-level
keys.</t>
          </li>
          <li>
            <t>A deployment that configures a proxy server to run as root while
the client is root-squashed has already violated rule 2
above; no wire mechanism detects a proxy server deliberately
mis-implementing credential forwarding.  Deployments
<bcp14>SHOULD</bcp14> verify their proxy server implementation's
credential-forwarding behavior through conformance
testing before
production use.</t>
          </li>
        </ul>
        <t>Future work (noted as an Open Question below): RPCSEC_GSSv3
structured privilege assertion per <xref target="RFC7861"/> Section 2.5.2
is the natural strong-authentication mechanism for
proxy-server-forwarded credentials.  This revision does not require
GSSv3 because the broader NFSv4 deployment base does not yet
support it; deployments that can use GSSv3 <bcp14>SHOULD</bcp14> prefer it
over AUTH_SYS passthrough for the credential-forwarding
channel.</t>
      </section>
      <section anchor="sec-namespace-traversal-privilege">
        <name>Namespace Traversal Privilege</name>
        <t>A proxy server that translates client I/O has to know how the metadata server's
namespace is shaped: which paths are exported, what filehandle
each path resolves to, how the exports mount within one another.
The proxy server acquires this information by traversing the metadata server's
namespace -- LOOKUP, LOOKUPP, PUTFH, PUTROOTFH, GETFH on the
proxy server &lt;-&gt; metadata server session.</t>
        <t>This traversal cannot always run under forwarded client
credentials: at the point the proxy server needs to discover a new export
(a client has not yet asked for it, or the proxy server has just restarted
and has no FH cache) there is no client whose credentials the proxy server
could forward.  Deployments have two choices for how the proxy server
acquires namespace shape:</t>
        <dl>
          <dt>Grant a narrow traversal privilege:</dt>
          <dd>
            <t>The metadata server <bcp14>MAY</bcp14> treat a registered proxy server's service identity as
authorized for LOOKUP, LOOKUPP, PUTFH, PUTROOTFH, GETFH,
and SEQUENCE on the proxy server &lt;-&gt; metadata server session without applying
the metadata server's export-rule filtering that would normally gate
those names.  This is strictly a structural privilege:
it permits the proxy server to see that paths exist and to obtain
their filehandles, but grants no data access.  All
operations that carry or require data authorization
(OPEN, READ, WRITE, LAYOUTGET, GETATTR of privileged
attributes, etc.) <bcp14>MUST</bcp14> still run under the rules of
<xref target="sec-credential-forwarding"/>: forwarded client
credentials for client-initiated operations, and proxy server
service identity only for control-plane operations.
</t>
            <t>A deployment that grants this privilege discloses the
metadata server's namespace shape to the proxy server's service identity --
specifically, names that the proxy server's source address would
not be able to see through the metadata server's normal export
filtering.  Deployments <bcp14>SHOULD</bcp14> audit traversal compounds
on registered-proxy server sessions so the disclosure is
reviewable; the metadata server <bcp14>SHOULD</bcp14> log each LOOKUP / GETFH that
benefits from the bypass.</t>
          </dd>
          <dt>Do not grant the privilege:</dt>
          <dd>
            <t>The proxy server is required to translate every client-originated
LOOKUP into a separate LOOKUP against the metadata server under the
forwarding client's credentials, caching only what the
client's credentials authorized the metadata server to return.  This
eliminates the namespace-shape disclosure but costs an
extra metadata server round-trip per client LOOKUP-miss and leaves
the proxy server unable to pre-discover exports.</t>
          </dd>
        </dl>
        <t>This document does not normatively prefer one approach over
the other.  Implementations <bcp14>SHOULD</bcp14> document which they use;
deployment guidance for the common combined data server+proxy server case is
that granting the privilege is the expected choice,
acceptable given the proxy server is already a trusted control-plane
peer of the metadata server.</t>
        <t>The traversal privilege is distinct from and narrower than
root_squash bypass.  A forwarded-uid-0 client operation
(OPEN, READ, etc.), even when the privilege is granted, is
still subject to normal root_squash handling on the proxy server's
source-address rule at the metadata server; the privilege applies only
to the six ops enumerated above.</t>
      </section>
      <section anchor="sec-ps-side-policy-enforcement">
        <name>Proxy-server-side Policy Enforcement (informative)</name>
        <t>A proxy server implementation <bcp14>MAY</bcp14> perform per-client export-rule
enforcement locally, rejecting operations the metadata server would also
reject before forwarding them.  This is a performance
optimization: it keeps bad requests off the proxy server &lt;-&gt; metadata server wire and
lets the proxy server return NFS4ERR_WRONGSEC / NFS4ERR_ACCESS without
paying a round-trip.</t>
        <t>Local enforcement is not a security boundary.  Rule 3 of
<xref target="sec-credential-forwarding"/> names the metadata server as the authority
for every client-initiated file operation.  A proxy server that performs
local enforcement is checking its own cached copy of the metadata server's
per-client rules; if the copy is stale, wrong, or absent, the
proxy server <bcp14>MUST</bcp14> forward the operation and let the metadata server decide.  A proxy server
implementation that declines to perform local enforcement is
conformant with this specification.</t>
        <t>Deployments that want local enforcement need a mechanism for
the proxy server to acquire the metadata server's per-export client-rule list.  This
document does not standardise such a mechanism;
implementation-specific options include a control-plane
probe-protocol
extension, out-of-band admin distribution, or a future revision
of this specification.  Any such mechanism <bcp14>MUST</bcp14> limit
distribution to proxy servers that the deployment has authorized
(the rules are sensitive deployment policy) and <bcp14>MUST</bcp14>
support a refresh path so proxy servers see rule changes within a
bounded time.</t>
      </section>
    </section>
    <section removeInRFC="true" anchor="sec-implementations">
      <name>Implementations</name>
      <t>This section records the status of known implementations of
the protocol defined by this specification at the time of
posting of this Internet-Draft, and is based on a proposal
described in <xref target="RFC7942"/>.  The description of
implementations in this section is intended to assist the
IETF in its decision processes in progressing drafts to
RFCs.  Please note that the listing of any individual
implementation here does not imply endorsement by the IETF.
Furthermore, no effort has been spent to verify the
information presented here that was supplied by IETF
contributors.  This is not intended as, and must not be
construed to be, a catalog of available implementations or
their features.  Readers are advised to note that other
implementations may exist.</t>
      <section anchor="reffs">
        <name>reffs</name>
        <t>reffs is an open-source NFSv4.2 server, metadata server, and erasure-coding
client.  The reffs source ships a metadata server, a Proxy Server, and a
multi-codec client harness used as the working implementation
for this draft.  reffs is licensed AGPL-3.0-or-later.</t>
        <t>The proxy server surface implemented in reffs covers, at the time of writing:</t>
        <ul spacing="normal">
          <li>
            <t>The proxy listener model (one process serving its native NFS
port and a per-<tt>[[proxy_mds]]</tt> proxy server port from independent SB
namespaces, see <xref target="sec-design-session"/>).</t>
          </li>
          <li>
            <t><tt>PROXY_REGISTRATION</tt> over RPCSEC_GSS-class auth, presently
exercised via mutually-authenticated RPC-over-TLS (<xref target="RFC9289"/>)
with a client-cert SHA-256 fingerprint allowlist.  AUTH_SYS
over plain TCP is rejected with <tt>NFS4ERR_PERM</tt> per
<xref target="sec-security"/>.</t>
          </li>
          <li>
            <t><tt>PROXY_PROGRESS</tt> lease renewal and the empty-assignment idle
path used by every steady-state proxy server poll.</t>
          </li>
          <li>
            <t>Forwarding of LOOKUP, OPEN, READ, WRITE, GETATTR, CLOSE,
LAYOUTGET, GETDEVICEINFO, LAYOUTRETURN, LAYOUTERROR through
the proxy server to the upstream metadata server using the end-client's credentials.</t>
          </li>
        </ul>
        <t>Forward-channel ops not yet exercised end-to-end in the public
implementation include <tt>PROXY_DONE</tt> / <tt>PROXY_CANCEL</tt>, which are
issued only after a <tt>PROXY_PROGRESS</tt> reply that delivers a
<tt>proxy_assignment4</tt>.  The metadata-server-driven assignment model (move,
repair) is wire-implemented but the only assignment kind
exercised by the published demo is the implicit no-assignment
heartbeat that every PROXY_PROGRESS produces.</t>
      </section>
      <section anchor="demonstration">
        <name>Demonstration</name>
        <t>A reproducible demonstration of cross-proxy server proxying, exercising
the layout-passthrough data path through proxy server A and proxy server B against a
shared metadata server + 6 data servers, lives in the reffs source under
<tt>deploy/sanity/</tt>.  The demo does not exercise migration,
repair, or any <tt>proxy_assignment4</tt>; its purpose is to show that
a client's codec-encoded write through one proxy server is recoverable
byte-for-byte through a peer proxy server that shares the same metadata server.</t>
        <t>The matrix:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Path</th>
              <th align="left">Layout</th>
              <th align="left">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 proxy server A proxy listener,
performs a codec-encoded write of a 96 KiB random payload, then
opens the same filehandle through the proxy server B proxy listener and
reads it back.  The client's <tt>cmp(1)</tt> of the original payload
and the proxy server B-served payload returns no differences in all 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 proxy server is active on a file.  Two of the four
(chunk_guard4, CHUNK_LOCK) describe what the proxy server does on the
data server side of the mechanism; the other two (CB_CHUNK_REPAIR,
TRUST_STATEID) describe how metadata-server-side bookkeeping composes
with a live proxy operation.</t>
      <section anchor="chunkguard4">
        <name>chunk_guard4</name>
        <t>The proxy server enforces chunk_guard4 CAS on the destination mirror
set on behalf of clients.  The proxy server <bcp14>MAY</bcp14> use the same guard
values client writes carry through it, or generate fresh
guard values on the destination side, provided uniqueness on
the destination is preserved.</t>
      </section>
      <section anchor="chunklock">
        <name>CHUNK_LOCK</name>
        <t>If a client holds a chunk lock on a file when a proxy
operation activates, the lock follows the file: the proxy server takes
ownership of the lock on the destination mirror set, and the
metadata-server-escrow semantics (the Reserved cg_client_id Value
subsection of <xref target="I-D.haynes-nfsv4-flexfiles-v2"/>) apply if the
original holder becomes unreachable during the operation.</t>
      </section>
      <section anchor="cbchunkrepair">
        <name>CB_CHUNK_REPAIR</name>
        <t>Per-chunk CB_CHUNK_REPAIR and an in-flight proxy MOVE or
REPAIR migration on the same file are mutually exclusive at
any given time.  The metadata server <bcp14>MUST NOT</bcp14> issue CB_CHUNK_REPAIR for a
file currently in PROXY_ACTIVE; the proxy server handles any mid-move
repair internally.  If the metadata server decides a proxied file also
needs per-chunk repair after the proxy operation completes,
it issues CB_CHUNK_REPAIR against the post-move layout.</t>
      </section>
      <section anchor="truststateid-revokestateid">
        <name>TRUST_STATEID / REVOKE_STATEID</name>
        <t>When the metadata server selects a proxy server for a proxy operation, it issues
TRUST_STATEID on the proxy server for every client layout stateid that
will route through the proxy server during PROXY_ACTIVE.  On proxy server
retirement the metadata server issues REVOKE_STATEID on the retired proxy server.
This is the same mechanism <xref target="I-D.haynes-nfsv4-flexfiles-v2"/>
defines for any data server in a tightly coupled deployment.</t>
      </section>
    </section>
    <section removeInRFC="true" anchor="sec-open-questions">
      <name>Open Questions</name>
      <t>The design is substantially complete but still has open
points that need Working Group input or internal agreement
before the first submission.  They fall into three rough
categories: wire-level details that need to be nailed down
(richer capability advertising),
architectural choices that affect
the mechanism's shape (multiple concurrent proxies per file,
transitive proxy, capability-scoped EXCHGID flag), and
policy questions whose answers bind deployment choices more
than wire behaviour (metadata server operation-state persistence,
RPCSEC_GSSv3 requirement level, DEVICEID_REGISTRATION
generalization).  Each item below briefly states the
question and the candidate resolutions; none of them block
this document's core mechanism but each may reshape a detail
of it.</t>
      <dl>
        <dt>Multiple concurrent proxies per file:</dt>
        <dd>
          <t>The design assumes one proxy per file per operation.
Should two proxies be allowed to pipeline a large file
(proxy A drives the first 1 TB, proxy B drives the
next)?  The motivating case is a multi-terabyte move
where a single proxy's bandwidth is the bottleneck;
parallelizing across proxies would shorten the operation
proportionally.  The cost is state-machine complexity
(two operation ids to track, partial-completion
bookkeeping, range ownership between proxies) and layout
complexity (the client sees two proxy server entries in
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
data server maintenance window opens while a repair is already
running), what happens?  Queueing the second move
postpones the maintenance, which may not be acceptable
if the maintenance window is hard.  Aborting the first
move wastes the repair work already done and puts the
file back into a degraded state.  Allowing a proxy to
act as the source for another proxy (a "chained" proxy
setup) preserves the repair progress but doubles the
state-machine work and introduces failure-mode compounds
that the current design does not cover.  The right
answer probably depends on operator priorities and may
need to be a configurable metadata server policy rather than a
protocol rule.</t>
        </dd>
        <dt>Migration-state retention across restart:</dt>
        <dd>
          <t>The recovery model leaves retention of in-flight
migration state across a metadata server restart to the
implementation; a metadata server that retains nothing is
conformant.  Should the document nonetheless add a
<bcp14>SHOULD</bcp14> recommending retention, so that a reboot does not
discard the progress of a large move?  Production
deployments would likely want it; it is a
quality-of-implementation recommendation only, with no
effect on interoperability.</t>
        </dd>
        <dt>Registration as a capability-scoped authority:</dt>
        <dd>
          <t>Should PROXY_REGISTRATION require a separate EXCHGID4
flag (e.g., EXCHGID4_FLAG_USE_PROXY_DS) to distinguish
proxy-capable data servers from generic data servers, 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 data server opens a session to the
metadata server 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 data server -&gt; metadata server capability advertisement -- a
DEVICEID_REGISTRATION op whose payload can carry:</t>
          <ul spacing="normal">
            <li>
              <t>Fault-zone coordinates (building, floor, room, rack,
power domain, network domain, cooling domain).  An
admin who needs to power down a rack can drive the
metadata server to recall all layouts referencing data servers in that
zone and evacuate files via PROXY_OP_MOVE assignments
before the outage.</t>
            </li>
            <li>
              <t>Storage media type (SSD / HDD / tape / cloud tier),
for layout-policy decisions.</t>
            </li>
            <li>
              <t>Geographic location, for data-locality policy.</t>
            </li>
            <li>
              <t>Transport security profile (TLS-capable, required
mutual-TLS cert fingerprint).</t>
            </li>
            <li>
              <t>Performance tier labels, for admin-assigned QoS.</t>
            </li>
            <li>
              <t>Encryption-at-rest and compression-at-rest flags.</t>
            </li>
            <li>
              <t>Scheduled maintenance windows, so the metadata server can
preemptively drain a data server before a planned outage.</t>
            </li>
          </ul>
          <t>Under this framing, PROXY_REGISTRATION is one arm of a
generic DEVICEID_REGISTRATION op: the proxy-capability
arm.  If the WG prefers the generalization, the op in
this document re-homes as a specialization of
DEVICEID_REGISTRATION, keeping its wire shape for the
proxy arm and adding typed entries for the other
capability classes.  The broader op may land in the main
draft, in a dedicated draft, or as an extension of this
document; settlement of that scoping question is the
open item.</t>
          <t>The op direction (data server -&gt; metadata server) is the same for both
specialized PROXY_REGISTRATION and generalized
DEVICEID_REGISTRATION; that direction does not today
exist as a session in the main draft's tight-coupling
control plane (which runs metadata server -&gt; data server).  A resolution of
this item also settles whether the proxy-server draft
introduces a new data-server-initiated session or whether the
generalized version does.</t>
        </dd>
      </dl>
    </section>
    <section removeInRFC="true" anchor="deferred">
      <name>Deferred</name>
      <t>The items below are explicit protocol extensions identified
during design that this revision does not specify.  They
overlap with Out of Scope in <xref target="sec-scope-out"/>; where Out of
Scope frames a deferral in the context of what the mechanism
does do, this list reads as a standalone punch list of
candidate follow-on work items, useful to a future revision's
planner.  A future editorial pass <bcp14>MAY</bcp14> merge this list into
Out of Scope before submission.</t>
      <ul spacing="normal">
        <li>
          <t>Partial-range PROXY_OP_MOVE assignments.</t>
        </li>
        <li>
          <t>Multi-proxy pipelines for very large files.</t>
        </li>
        <li>
          <t>Automated proxy selection with load balancing.</t>
        </li>
        <li>
          <t>Proxy-failure predicate (when should the metadata server pre-emptively
replace a slow proxy?).</t>
        </li>
        <li>
          <t>Integration with server-side copy (<xref target="RFC7862"/> Section 4)
as an alternative for single-file moves within one
namespace.</t>
        </li>
        <li>
          <t>Delta-journaling during a move for online moves without
dual-writes.</t>
        </li>
      </ul>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC7861">
          <front>
            <title>Remote Procedure Call (RPC) Security Version 3</title>
            <author fullname="A. Adamson" initials="A." surname="Adamson"/>
            <author fullname="N. Williams" initials="N." surname="Williams"/>
            <date month="November" year="2016"/>
            <abstract>
              <t>This document specifies version 3 of the Remote Procedure Call (RPC) security protocol (RPCSEC_GSS). This protocol provides support for multi-principal authentication of client hosts and user principals to a server (constructed by generic composition), security label assertions for multi-level security and type enforcement, structured privilege assertions, and channel bindings. This document updates RFC 5403.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7861"/>
          <seriesInfo name="DOI" value="10.17487/RFC7861"/>
        </reference>
        <reference anchor="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 2688?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>David Flynn and Trond Myklebust shaped the proxy-server
architecture, in particular the split between proxy
registration and metadata-server-issued directives.</t>
      <t>Brian Pawlowski and Gorry Fairhurst guided this process.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIANMDFWoAA8S961Yc2bUu+H89RbT8Q1DORNbFdhXYPocCpOIYCR2Q7O12
e0CQGQlhJRm5MyJF4araz9LP0k/W85uXdYlYCSpvt7vG2NsCIlasy1zzPr85
Ho9dV3fzard4v2q+vx8frurP1aI4r1afq1Uxa1bF63n1fX01r4rX9bxqiz9V
q7ZuFsULV15drarPu8Xr159fyNv6mps2k0V5S2NOV+WsG9+U94uqHS9m7edX
4xkNN8NI488vxkv+ZstvjX/1wk3KrrpuVve7RdtN3ZR+2i1+ONz/cPSTmzSL
tlq063a36FbrytXLFf+r7V786lff0Lvlqip3izfVolqVc3fXrD5dr5r1crd4
V3X4iedfnN+3XXXrV/HKfaru6a/T3eJ40VWrRdXRFtCknWu7cjG9KOfNgiZx
X7VuWe8Wf+2ayahom1W3qmYt/ev+Vv5BS74tl8t6cT0qJs3tbbXo2r85V667
m2a164qxK+i/ekHT/7BTfMc7wr+Sjfpw09yWbfz7ZnVdLup/lB1Nc5f+QEOu
2mU5qfiv1W1Zz3eLeXN9c7/6n9f4aYc+69yiWd3SO58r+mZx9vrgt1//5nn4
54vwz5f6z6+f//Zr++fXX9uz37z4+hv883h8uLPx+Hadqxez3geff/3cD/3q
5a/pmfF4XJRXbbcqJ7St70s6nnk1L969Pi+2lvT/t4u7urspuptqI60V8/K+
WXeuu19WRbteLukA2mIyr2mbx209rQo69Ha9qmjvp3QGBR1dsSSamtysF5+K
VbUs65W7IkKoiLjlvZYfIhorCyHAdqegc6hbnOUaB1hU33fVYtrS1MqO6Gty
U3fVpMNneMZlwfSrr9Niop+2i1WDW1XSx69rorlVhRnR5WhmvNTbqiujj/M3
imUzn7fZP9M2M00XZdvW14tbv4BJuVrVFb90W9AeFbTbt81n3oQCJ1XMVg39
ZVE52cSia+jFhp5fjWhyuFd0jSadvHF30+AV/x5t6ucao7n2plxNidKJJdBR
Ltp5ya/4TW2m1aRljmH7y0ualAv6mFuWq66e1Eu60nQLeIn4yNOWLgCop6gW
enRb9WIyX/M/iTg+v3Q63DYdz/58XiQ8o2vGtlP6K5oIXed6wRenqHlGFdEB
TaOiG0Mfdv29XVV0pou2GOxvvZjXCz/fVdUuwYQcNjCdRr2ou5qWNi3en53+
x18u6P+/OTs6P+cDHfE5YYSEXIgoQcXE2G6X84pn+7kucWjRhHW8w9N3R7T8
dw1t53x+VU4+uYbIm9dIZLDC5P5zXYPGcACDb9EPxLia+Y7cRjqQ6uId/l/X
XJxV5ZSI37nDup2sW75wTKO4CWCFRVd+IgJbzon5EB3x6DiZV7xhOCdmtA5M
CD/NidyLLWYX/7OuutkOsbLtEVFWPbnBgfBF+kxTpUv1179t3XTdst199gyv
65927LVn+MWztuL/+R/M9C4w/O959O0dd96sVxO+9RXvct22a5orT0F2wq+C
CJGIlX67XvQ/fU23eX0FBvoMXx7fXQu3e7ZRWNGn3Z919W+w+sJzQtqhf+JT
23o0t/V0Oq+c+wXk0aqZ4mI2C+c+PM4dC3BHt/XDDw8y7Z9+2qa5ytBVwkNd
j4di/8CfeWPLATv1ROW2Dr69OPju47s/Xpwdvd8/PtuWm09EnedlUyLUSUfD
OpIIuPsyCTCmiB/RLKfEeabrck5c+ra8Jorh7wufpm29rXBL6vYWVNWuZzNi
MBgHE5c5tuBnLYmMCV0Xpr2C3pjO1nMicSej4Xorp+Rp35Ac5tmXREPENomY
/BR3cBCrCj8Sn6Dto4siXIO2jY6ARRHfvv5m3RKF0vX7wHxvRSPXrfDaMX9Z
nmL2RNTTMs+RC1MtmvX1jYvlFE2RZjSjy1BNVW5EnwsMnWjjrlnPp06ZA/GX
tmamXdEw97KbzND91xZNvFyapCs/416C6uh4ptAOlRnysujbxJD4QGiX8W3c
QS+uISdqZlK7tse3pLFBQAW5ZOR7XTVEKTSvrnEqoIQGm3k9uacvli243dZt
fb0S2cOMeFHdGcXiAmA9tODxbb1aNSv6LbEejEK8gxS8RbmYVGGo6nM5WZcq
+rDFTkm0vCGuiNMloUbaXM1scZv3CoNVi8/1qmEpQdSpw7ktlbsmEnn5YPLE
NCbrVd3d487wRcRA+pjDL0CVtDng7NA4tnVHiX2teENZuga5C5WwdHZtgpgt
HhWzMhBp/UHKCjGwrNVzF4lVLu7pFlyXtPfYP5Jxt+VcOH/y6WlD68HHawiy
W/m9/66X66y70YfbriYpvqgqKFa48eWUP3dHG1T5N/mmxbpYu6wm9QyazuNq
F1PQdEoCGwwIDKCTW1vizqru1tKkQI/GRHYHYhMyFuKVfhSxSNPN8TPM3rQ8
YieQ6eWyvCJp2GG+kOoixs+O3hyffzjb/3B8+m5vKKXpF4ugAg7UlDVm3Fcw
QI0DvQWEWI30jm6PnNzt3NRN9Uk1HczBqzvDiTrTOXFrq5KGDh/nzcAP5RxU
G6s2LugyxRZNu7yiqxHtzsH+u4OjE1PzVE1+RNtzD2l7mS32tGossXS4c17d
MvUKbxGXucVkjBmusFRPf3U15ZtbVDVzqivipw2xA1Gkhx9mmTe/p6sFvb2Q
Wa/uHQSsPCOq9c0K/B4fwV+UNYoUiw+OOHP/GzTXP99gRmWhLFK2hA6VV4Pb
oIyfF+ToS13FBFscPzv1n+6PuydKfZ8D0XQX83tXFhk2xJc+XGbedrrRUGBU
efn8HN8g8c7nUbCxTfZF/Q8SaUGuM+M2du9K4yl+V0Ro60dW0A+ZlumqVNgN
Ohk8164nN265qm9rsEAyYZLtmVczVj089+K/jJXfTEitJZ10gW0Tc4sXeMUi
HhofzbctZ9Wc/jxZNW3r0nGCUVnhVrCkmom9RtvlVzqiXWxwv+mulqwcdM20
vOfFKaO6qq+vKygO8FM0y+K6XHpJY2oazCy2rlmraMXXgVtIl7BrVvrVcg6m
e0/m7RJk5Xcj2qMdaKBnckeEp5yUi+s1KWGiin6q7sF2iIU/efvx/MOTkfxv
8e6U/3129L8/Hp8dHeLf59/tn5z4fzh94vy7048nh+Ff4c2D07dvj94dysv0
2yL5lXvydv8vT0RAPTl9D066f/JEGFcsLqCQ0aFeVbJfS2J0sDhaR+cwWdVX
9AO98+3B+//n/37+qvjhh//j7PXBi+fPv/npJ/3h6+e/fUU/3BFPlq+B2vVH
OhUi/OWS7BLWHudgHMuadIGW73d709wtCuIKEGNf/RU787fd4ndXk+XzV3/Q
X2DByS9tz5Jf8p4NfzN4WTYx86vMZ/xuJr/v7XQ63/2/JD/bvke//N3/YAEy
fv71//iDI+IB9QifMKn5li5nob61R20Uui4zGq8teqYFE/kDCnbfg1OLBYIr
QPeMSDzSub2PSPiXv4s0yHs/Omsm/p2+1X277sg8meMqkTbVQsECyyqLa/ai
ymc6+9l19S2J00lDZhzdTNZE12CGGIo254cfmFZLVt1/+onv4DksF9WFSIvk
DSV79k7WdQULk6RIUDlv4JsiETgnTj+PLCTZzykTpfdH3BJjJGa6uiaBwr5F
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
8NG06gEA

-->

</rfc>
