<?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.29 (Ruby 2.6.10) -->
<?rfc docmapping="yes"?>
<?rfc comments="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-nfsv4-uncacheable-directories-11" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="Uncacheable Dirent Metadata">Adding an Uncacheable Dirent Metadata Attribute to NFSv4.2</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-nfsv4-uncacheable-directories-11"/>
    <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 33?>

<t>Network File System version 4.2 (NFSv4.2) clients may cache the
file attributes returned by READDIR alongside each directory
entry.  Such a cache is not invalidated by the directory's change
attribute, which reflects changes to the directory and its entries
but not writes to the files those entries name, so it can become
stale when another client changes one of those files.  In some
deployments this produces incorrect size and timestamp values often
enough to be a problem.  This document introduces an
uncacheable dirent metadata attribute for NFSv4.2 that allows a
server to identify a directory for which an honoring client goes to
the server for each enumeration, and does not report an entry's
attributes from a value it held before that READDIR.</t>
    </abstract>
    <note>
      <name>Note to Readers</name>
      <?line 48?>

<t>Note to RFC Editor: please remove this section prior to publication.</t>
      <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/uncacheable-directories"/>.</t>
      <t>Working Group information can be found at <eref target="https://github.com/ietf-wg-nfsv4"/>.</t>
    </note>
  </front>
  <middle>
    <?line 61?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Clients of remote filesystems may cache the file attributes returned
by READDIR alongside each directory entry, to reduce the volume of
follow-on GETATTR traffic for entries the client has already seen.
This caching is inherently best-effort -- writes to the underlying
files can change those attributes at any time, and the directory's
change attribute does not track such writes.  In some deployments
the cost of that staleness is high enough to be a problem; the
conditions are described in <xref target="deployment-motivation"/>.</t>
      <t>In this document, the term directory is used to describe the
context in which directory entries are retrieved.  The uncacheable
dirent metadata attribute applies to dirent metadata -- the file
object attributes, such as size and timestamps, returned alongside each
entry -- and to what an honoring client reports of it.  It does not
prohibit caching of the directory object itself, nor does it affect
caching of file data.</t>
      <t>When this best-effort caching returns stale size and timestamp
information for concurrently modified files, it also undermines the
effectiveness of uncacheable file data semantics
(<xref target="I-D.ietf-nfsv4-uncacheable-files"/>) in the same deployment:
applications can observe inconsistent metadata and data views even
when file data caching is disabled.</t>
      <t>This document introduces the uncacheable dirent metadata attribute
to NFSv4.2 to allow servers to identify the directories for which
reporting dirent metadata a client held beforehand is unsuitable.
Using the process detailed in <xref target="RFC8178"/>, the revisions in this
document become an extension
of NFSv4.2 <xref target="RFC7862"/>.  They are built on top of the external data
representation (XDR) <xref target="RFC4506"/> generated from <xref target="RFC7863"/>.</t>
    </section>
    <section anchor="deployment-motivation">
      <name>Deployment Motivation</name>
      <t>A class of deployment uses NFSv4.2 to serve a shared directory to
many concurrent NFSv4.2 client writers, each writing files within
the directory.  Workloads of this kind are typical of
High-Performance Computing (HPC) environments, where a single
output directory may receive results from hundreds or thousands of
compute nodes simultaneously, and of large-scale data-ingest
pipelines where many producers append to a common landing
directory.  The files within such a directory have their attributes
-- size and timestamps in particular -- modified at a high rate by
clients other than the one performing READDIR.</t>
      <t><xref target="RFC8881"/> Section 10.6 permits a client to cache the file attributes
returned by READDIR on the same basis as attributes obtained by GETATTR:
cached per file, bounded by an upper time boundary, and revalidated
against that file's change attribute.  In a directory receiving writes
from thousands of compute nodes, any nonzero cache lifetime yields stale
size and time_modify for most entries most of the time, and revalidating
each entry individually costs one GETATTR per entry -- the very traffic
that requesting attributes in READDIR exists to avoid.  NFSv4.2 gives a
server no in-band way to tell a client that the file attributes it holds
for the children of a particular directory should be refreshed each time
the directory is enumerated; mount options shorten attribute cache
lifetimes out of band and per client, not per directory.</t>
      <t>The staleness has correctness consequences, not merely cosmetic ones.
An incremental backup or a directory-tree synchronization pass that
decides what to copy from the size and time_modify reported for each
entry will silently skip a file whose cached metadata predates a
concurrent write, leaving data uncopied.  This attribute lets a server mark the directories where that
outcome is likely, so that an honoring client fetches current metadata
on each enumeration.</t>
      <t>The fattr4_uncacheable_dirent_metadata attribute is the server's
mechanism to identify a directory for which this risk is high
enough that client-side caching is not safe.  When the server sets
the attribute on a directory, an honoring client retrieves
dirent metadata from the server on each READDIR rather
than from a local cache.</t>
    </section>
    <section anchor="definitions">
      <name>Definitions</name>
      <dl>
        <dt>readdir</dt>
        <dd>
          <t>A directory-read request made by an application, however the client's
interface batches entries.  Written in lower case throughout this
document to distinguish it from READDIR, the NFSv4.2 operation
(<xref target="RFC8881"/> Section 18.23).</t>
        </dd>
        <dt>enumeration</dt>
        <dd>
          <t>One pass over a directory: the readdirs of that pass and the READDIRs
the client issues to satisfy them.  A READDIR ordinarily supplies enough
entries for many readdirs, so a requirement scoped to an enumeration
does not imply a READDIR per readdir.</t>
        </dd>
        <dt>dirent</dt>
        <dd>
          <t>A directory entry -- the (name, fileid) pair that names a file or
subdirectory within a directory.  This is what a client maintains for
an entry, whatever a given READDIR response carries on the wire; it is
the pair POSIX exposes as d_name and d_ino.  A dirent itself does not
include the file attributes returned alongside it.</t>
        </dd>
        <dt>dirent metadata</dt>
        <dd>
          <t>The file attributes (size, time_modify, time_metadata,
time_access, mode, owner, etc.) that a READDIR response can return
alongside each dirent, whether or not a particular response carried
them.  These attributes belong to the underlying file
object, not to the directory; they change when the underlying file is
written, which is independent of the directory's change attribute.
The term "dirent metadata" in this document is a naming convenience
for "the file attributes a READDIR response carries alongside an
entry"; it names that class of attributes, not the subset a given
response happened to return, and it does not assert that those
attributes inherit the directory's cache-coherence semantics.</t>
        </dd>
        <dt>dirent caching</dt>
        <dd>
          <t>A client-side cache of the dirents themselves -- the (name, fileid)
pairs -- used to avoid repeated READDIR traffic.  Whether such a cache
remains valid is governed by the directory's change attribute: the
directory changes when an entry is created, removed, or renamed, and a
fileid is stable for as long as its entry names the same object.  A
fileid is therefore cached with the name rather than with the file
attributes: writes to a file change its size and timestamps without
touching either the name or the fileid.  This document does not change
what a client may hold in this cache or how it validates it; for a
directory on which the attribute is set, however, each enumeration is
satisfied by a READDIR, so for that directory the cache no longer
avoids that traffic.</t>
        </dd>
        <dt>dirent metadata caching</dt>
        <dd>
          <t>A client-side cache of the dirent metadata returned alongside those
entries, used to avoid repeated GETATTR traffic.  Because those file
attributes are not invalidated by the directory's change attribute
(only by writes to the underlying files), this caching is inherently
best-effort and subject to staleness whenever the underlying files are
modified.  This is the caching whose results the attribute defined in
this document constrains: for a directory on which the attribute is
set, <xref target="sec_dirents"/> limits what an honoring client may report for an
entry, however the client structures the cache the value comes from.</t>
        </dd>
        <dt>uncacheable dirent metadata attribute</dt>
        <dd>
          <t>An NFSv4.2 file attribute that advises clients not to report dirent
metadata, such as size and timestamps, from a value held before the
READDIR that most recently returned the entry it describes.</t>
        </dd>
        <dt>honoring client</dt>
        <dd>
          <t>A client that implements this attribute and enforces the
always-refetch behavior it defines for a directory on which the
attribute is set.  The attribute is advisory: a client that does not
implement it, or that declines to enforce it, is non-honoring and may
continue to report dirent metadata it held beforehand.</t>
        </dd>
      </dl>
      <t>This document assumes familiarity with NFSv4.2 operations, attributes,
and error handling as defined in <xref target="RFC8881"/> and <xref target="RFC7862"/>.</t>
    </section>
    <section anchor="requirements-language">
      <name>Requirements Language</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

</section>
    <section anchor="caching-of-dirent-metadata">
      <name>Caching of Dirent Metadata</name>
      <t>The uncacheable dirent metadata attribute constrains what an honoring
client may report for the entries of a particular directory.  If both
the client and the server support this attribute, and the attribute is
set on a directory, an honoring client goes to the server for each
enumeration and does not report an entry's attributes from a value it
held before that READDIR.  <xref target="sec_dirents"/> states the requirement
normatively.</t>
      <t>It adds no constraint on the objects the entries name: an honoring
client may continue to hold the dirents themselves, validated by the
directory's change attribute as it would be for any other directory.
Clients typically hold a single cache of a file object's attributes,
populated by whichever operation last returned them; the requirement is
on what the client reports, not on how it structures that cache.</t>
      <t>A server sets it on the directories where it knows the staleness of
cached READDIR attributes is particularly likely and particularly
damaging.  It is a <bcp14>RECOMMENDED</bcp14> attribute for NFSv4.2, in the
attribute-category sense of <xref target="RFC8881"/> Section 5.2 and <xref target="RFC7862"/>
Section 12 rather than the BCP 14 sense; a server is not required to
support it.</t>
      <t>Because the attribute governs what an honoring client reports for the
entries of one directory, rather than the objects those entries name,
it makes no claim about those objects.  A file reached
through a directory on which the attribute is not set is unaffected,
including where the same file is linked into both a directory on which
it is set and one on which it is not.</t>
      <t>This document specifies the required observable behavior rather
than mandating a particular internal implementation strategy.
Clients <bcp14>MAY</bcp14> employ more sophisticated mechanisms, such as
time-limited caches that revalidate against the server on each
READDIR, provided that the externally visible behavior satisfies
<xref target="sec_dirents"/>.</t>
      <t>A client can determine whether the uncacheable dirent metadata attribute
is supported for a given directory by examining the supported_attrs
attribute for that directory's filesystem or by probing support using
the procedures described in <xref target="RFC8178"/>.</t>
      <t>A change to the attribute while a directory is in use may not be
reflected in client behavior immediately.  A client that has cached the
directory's attributes <bcp14>MAY</bcp14> continue to behave as it did before the
change and is not required to act on a value it has not yet observed.
Two ordinary mechanisms bound that delay: the client's cached
attributes for the directory expire under the upper time boundary
described in <xref target="RFC8881"/> Section 10.6, and a client revalidating a
cached directory inspects the directory's change attribute
(<xref target="RFC8881"/> Section 10.8.2), which moves when a server sets or clears
this one.  Clients are expected to observe the change through those
mechanisms and to apply the rule in <xref target="sec_dirents"/> to subsequent
enumerations.</t>
      <t>The uncacheable dirent metadata attribute governs what an honoring
client may report for a directory's entries.  It does NOT govern:</t>
      <ul spacing="normal">
        <li>
          <t>How long a value remains reportable between enumerations.  Attributes
a client obtains for an individual entry at other times, by a direct
GETATTR following a LOOKUP for example, remain governed between
enumerations by the attribute-cache mechanisms already defined by
NFSv4.2 and are subject to the same staleness from concurrent writes.
The rule in <xref target="sec_dirents"/> applies at each enumeration and is
indifferent to which operation last supplied a value.</t>
        </li>
        <li>
          <t>The directory's own attribute cache.  The directory object's own
attributes (mode, owner, etc.) can be cached normally and
revalidated via the directory's change attribute as usual.</t>
        </li>
        <li>
          <t>Operations that do not return file attributes in their response
(for example, LOOKUP without a following GETATTR, ACCESS).  These
are unaffected.</t>
        </li>
      </ul>
      <t>The uncacheable dirent metadata attribute addresses a different
aspect of client-side caching than fattr4_uncacheable_file_data
(<xref target="I-D.ietf-nfsv4-uncacheable-files"/>).  The file data attribute
governs caching of file contents, while the dirent metadata
attribute governs what a client reports for the entries of a
directory it enumerates.
The attributes are independent and may be used separately.</t>
      <t>This attribute follows the same pattern as
fattr4_uncacheable_file_data (<xref target="I-D.ietf-nfsv4-uncacheable-files"/>)
applied at the file-data layer.  In both cases:</t>
      <ul spacing="normal">
        <li>
          <t>The underlying NFSv4.2 protocol permits client-side caching that
can become stale.</t>
        </li>
        <li>
          <t>Client caching of the relevant data is widely implemented in
practice and reduces network traffic for stable objects.</t>
        </li>
        <li>
          <t>For specific objects where the deployment knows the caching will
produce incorrect results, the server requires a mechanism to
instruct an honoring client not to rely on it for those specific
objects.</t>
        </li>
        <li>
          <t>The attribute does not redefine the legality of caching in the
general case.  It is a per-object server-side signal that the
caching is known to be unsuitable for that object.</t>
        </li>
      </ul>
      <t>The attribute does NOT make dirent metadata caching reliable for
directories where it is not set.  Clients <bcp14>MUST NOT</bcp14> interpret the
absence of fattr4_uncacheable_dirent_metadata, or its value being
false, as a guarantee that cached READDIR attributes are
authoritative.  As stated in <xref target="RFC8881"/> Section 10.6, all
client-cached attributes are subject to staleness; the attribute
defined in this document only identifies directories for which
staleness is particularly likely and particularly damaging.  The base
specification separates the two concerns this attribute is often accused
of conflating: <xref target="RFC8881"/> Section 10.8.2 governs caching of the
directory entries themselves, while Section 10.6 governs caching of the
file attributes that arrive alongside them.  This attribute leaves what
a client may hold under either unchanged; it requires a READDIR for each
enumeration and constrains what may be reported for an entry, as
<xref target="sec_dirents"/> states.</t>
      <t>This attribute does not define behavior for positive or negative
name caching, nor for LOOKUP results other than the file attributes
it constrains an honoring client from reporting for an entry.</t>
      <t>A directory delegation (<xref target="RFC8881"/> Section 10.9) lets a client cache a
directory's entries and the directory's own attributes until the server
recalls the delegation.  It is not recalled when the attributes of an
entry within the directory change (<xref target="RFC8881"/> Sections 10.9.2 and
10.9.4), so a directory delegation does not, by itself, keep the file
attributes returned by READDIR fresh.  NOTIFY4_CHANGE_CHILD_ATTRS,
requested through GET_DIR_DELEGATION, can deliver changed child
attributes to a delegated client, but it is not a substitute for this
attribute in the deployments of <xref target="deployment-motivation"/>:
GET_DIR_DELEGATION is <bcp14>OPTIONAL</bcp14> and is not implemented by the clients and
servers those deployments use; notification cost scales with the number
of delegated clients times the number of changes, which a directory
written by thousands of clients makes prohibitive (and <xref target="RFC8881"/>
Section 10.9.4 permits a server that finds a directory is causing too
many notifications to decline to delegate it); and the
dirent_notif_delay attribute lets a server bound or refuse
child-attribute notification, so a client cannot rely on notification
for freshness.</t>
      <section anchor="sec_dirents">
        <name>Uncacheable Dirent Metadata</name>
        <t>The fattr4_uncacheable_dirent_metadata attribute is a read-write boolean
attribute that applies to directory objects.
Authorization to query or modify this attribute is governed by
existing NFSv4.2 authorization mechanisms.</t>
        <t>The attribute applies only to directory objects.  A server that
receives a GETATTR requesting fattr4_uncacheable_dirent_metadata on an
object that is not a directory <bcp14>MUST</bcp14> return FALSE: support for an
attribute is advertised per file system (<xref target="RFC8881"/> Section 5.8.1.1),
so a server that supports this attribute supports it for every object
in that file system and owes a value for each (<xref target="RFC8881"/> Section
18.7.3).  As with rawdev (<xref target="RFC8881"/> Section 5.8.2.31), the value
<bcp14>SHOULD NOT</bcp14> be considered useful for an object the attribute does not
describe.  A server that receives a SETATTR requesting
fattr4_uncacheable_dirent_metadata on an object that is not a directory
<bcp14>MUST</bcp14> return NFS4ERR_WRONG_TYPE (<xref target="RFC8881"/> Section 15.1.2.9).</t>
        <t>This attribute is set per directory.  This document does not define
propagation of the attribute to subdirectories created within a
directory on which it is set; any such inheritance is a matter of
local server policy.</t>
        <t>If a directory object has the uncacheable dirent metadata attribute
set, an honoring client <bcp14>MUST NOT</bcp14> satisfy a readdir of that directory
from READDIR results obtained during a different enumeration, and <bcp14>MUST
NOT</bcp14> report, for an entry, a value of a dirent metadata attribute that
it received before the READDIR that most recently returned that entry,
whatever operation supplied that value.</t>
        <t>A client holding an OPEN_DELEGATE_WRITE delegation on a file the
directory names may hold a size or change value more current than the
server's, which the server obtains from it by CB_GETATTR (<xref target="RFC8881"/>
Section 10.4.3).  The requirement above is directed at values older
than what the server would return, and does not require such a client
to replace its own values with older ones.</t>
        <t>An honoring client therefore either names the attributes it will report
in that READDIR's attr_request, or obtains them afterwards; a value it
held beforehand is not usable for that entry.  An honoring client <bcp14>SHOULD</bcp14>
name them in attr_request: obtaining them afterwards costs one GETATTR
per entry, which is the traffic the deployments of
<xref target="deployment-motivation"/> use this attribute to avoid.</t>
        <t>Entries carried by the READDIRs of a single enumeration <bcp14>MAY</bcp14> be
retained until that enumeration completes, and their metadata <bcp14>MAY</bcp14> be
retained after it: what bounds the reporting of that metadata is the
next enumeration, under the rule above, and the attribute-cache
mechanisms of <xref target="RFC8881"/> Section 10.6 until then.  <xref target="RFC8881"/> Section
10.8.2 requires such a cache to be a consistent snapshot of directory
contents, validated by the directory's change attribute; because that
attribute does not move when a file the directory names is written, it
provides no corresponding guarantee for the entries' file attributes,
which are as of the READDIR that carried them.</t>
        <t>The uncacheable dirent metadata attribute does not modify the
semantics of the NFSv4.2 change attribute.  Clients <bcp14>MUST</bcp14> continue to
use the change attribute to detect directory modifications and to
determine when directory contents may have changed, even for a
directory on which this attribute is set.  Constraining what an
honoring client may report for an entry does not remove the need for
change-based validation.</t>
        <t>This attribute is advisory, so servers <bcp14>SHOULD NOT</bcp14> rely on it for
correctness: a client that does not implement it, or that declines to
enforce it, may continue to report dirent metadata from a value it
held before the READDIR that most recently returned the entry.  A
server cannot distinguish those clients from honoring ones.  Observing
a GETATTR or a SETATTR of the attribute shows only that a client knows
the attribute exists, not that it enforces the rule of
<xref target="sec_dirents"/>, so such a request is not a basis for assuming it
does.</t>
        <t>A directory delegation would let a client serve dirent
metadata from its cache without refetching, which is incompatible with
the always-refetch rule this attribute defines.  Accordingly, if a
directory has the uncacheable dirent metadata attribute set and an
outstanding directory delegation, the server <bcp14>MUST</bcp14> recall the
delegation, after which the client follows the always-refetch rule on
each subsequent readdir.  A server <bcp14>MUST NOT</bcp14> grant a new directory
delegation on a directory while the uncacheable dirent metadata
attribute is set on that directory.</t>
      </section>
    </section>
    <section anchor="example-directory-enumeration-with-and-without-dirent-metadata-caching">
      <name>Example: Directory Enumeration With and Without Dirent Metadata Caching</name>
      <t>This example illustrates the difference in client-visible behavior when
dirent metadata caching is enabled versus when the uncacheable
dirent metadata attribute is set on a directory.  In both scenarios
each readdir("/dir") is a separate enumeration -- the application opens
the directory, reads it to end-of-file and closes it, and opens it
again for the second.  The set of entries does not change between the
two; an attribute value of one entry is updated at the server between
them.  The difference is whether the stat after the second readdir
observes the updated value.</t>
      <section anchor="classic-directory-enumeration-dirent-metadata-cached">
        <name>Classic Directory Enumeration (Dirent Metadata Cached)</name>
        <t>In this scenario, the client caches dirent metadata obtained from the
server and reuses it after a second readdir.</t>
        <figure anchor="fig-cached-dirents">
          <name>Dirent Metadata Cached</name>
          <artwork><![CDATA[
Application             NFSv4.2 Client        NFSv4.2 Server
-----------             --------------        --------------
readdir("/dir")
   |
   |                     READDIR, size and
   |                     time_modify requested
   |-------------------->------------------------>
   |                     entries:
   |                       a (size=100)
   |                       b (size=200)
   |<--------------------<------------------------
   |<-- names a, b
                        (attributes retained per
                         entry, bounded by the
                         attribute cache lifetime)

                                        (concurrent writer extends
                                         a from size=100 to
                                         size=500)

readdir("/dir")
   |                     (served from the cached
   |                      READDIR result; no
   |                      network traffic)
   |<-- names a, b

stat("/dir/a")
   |                     (served from the retained
   |                      READDIR attributes)
   |<-- size=100
]]></artwork>
        </figure>
        <t>In this case, <xref target="fig-cached-dirents"/> shows a second readdir satisfied
from the cached result of the first.  No READDIR reaches the server, so
nothing refreshes what the client holds for entry a, and the stat that
follows reports the size as it was at the time of the first READDIR --
not the update the server took between the two.  This behavior
maximizes performance and is what <xref target="RFC8881"/> Sections 10.6 and 10.8.2
permit, but for the duration of the cache lifetime it can result in
applications observing dirent attribute values that do not reflect the
current state of the files the entries name.</t>
      </section>
      <section anchor="directory-enumeration-with-uncacheable-dirent-metadata">
        <name>Directory Enumeration With Uncacheable Dirent Metadata</name>
        <t>In this scenario, the directory has the uncacheable dirent metadata
attribute set.  The client retrieves dirent metadata from
the server on each READDIR.</t>
        <figure anchor="fig-uncached-dirents">
          <name>Dirent Metadata Not Cached</name>
          <artwork><![CDATA[
Application             NFSv4.2 Client        NFSv4.2 Server
-----------             --------------        --------------
readdir("/dir")
   |
   |                     READDIR, size and
   |                     time_modify requested
   |-------------------->------------------------>
   |                     entries:
   |                       a (size=100)
   |                       b (size=200)
   |<--------------------<------------------------
   |<-- names a, b

                                        (concurrent writer extends
                                         a from size=100 to
                                         size=500)

readdir("/dir")
   |
   |                     READDIR, size and
   |                     time_modify requested
   |                     (cached result not used)
   |-------------------->------------------------>
   |                     entries:
   |                       a (size=500)
   |                       b (size=200)
   |<--------------------<------------------------
   |<-- names a, b

stat("/dir/a")
   |<-- size=500
]]></artwork>
        </figure>
        <t>In this case, <xref target="fig-uncached-dirents"/> shows the second readdir going
to the server, and the stat that follows reporting what that READDIR
returned.  The set of entries is unchanged between the two calls; only
the attribute value differs.  The client may still cache other
information, provided it reports no value for these entries that it
received before the READDIR that most recently returned them.</t>
      </section>
      <section anchor="discussion">
        <name>Discussion</name>
        <t>This example demonstrates that the uncacheable dirent metadata
attribute does not mandate a particular client implementation, but
it does require the always-refetch behavior specified in
<xref target="sec_dirents"/>.  The attribute ensures that an honoring client's report
of an entry's attributes reflects the server's state as of the
enumeration that returned it, in deployments where staleness of
READDIR-returned attributes is known to be a recurring problem.</t>
      </section>
    </section>
    <section anchor="implementation-status">
      <name>Implementation Status</name>
      <t>Note to RFC Editor: please remove this section prior to publication.</t>
      <t>There is a prototype Hammerspace server which implements the
uncacheable dirent metadata attribute and a prototype Linux client
which treats the attribute as an indication to retrieve directory-
entry metadata from the server on each READDIR rather than from a
local cache.</t>
      <t>In the prototype, directories whose contents change at the server
at a rate exceeding typical client cache lifetimes are marked with
the fattr4_uncacheable_dirent_metadata attribute.</t>
      <t>The Linux client decodes the attribute in fs/nfs/nfs4xdr.c into a
per-inode flag (nfsi-&gt;uncacheable_dirent_metadata, declared in
include/linux/nfs_fs.h).  The readdir path in fs/nfs/dir.c consults
this flag to skip the readdir cache and refetch from the
server on each readdir call that is not already at end of directory.
It also forces the client onto its attribute-returning READDIR path for
such a directory, where the server has been found capable of it: a
READDIR that returns only names would refresh the
entries but leave their attributes to the client's attribute caches, and
the
cache-bypassing path above never accrues the cache usage that would
otherwise select that path for the continuation READDIRs of a large
directory.  Clients may employ more sophisticated
mechanisms, such as time-limited caches that revalidate against the
server on each READDIR, provided that the externally observable
behavior satisfies <xref target="sec_dirents"/>.</t>
      <t>The Linux client implementation encodes this attribute as a flag
distinct from the companion file-data attribute defined in
<xref target="I-D.ietf-nfsv4-uncacheable-files"/>; the two attributes are separated
as the two documents specify.  That implementation is posted to
linux-nfs (patches 4-6 of
<eref target="https://lore.kernel.org/linux-nfs/cover.1785140181.git.snitzer@kernel.org/">https://lore.kernel.org/linux-nfs/cover.1785140181.git.snitzer@kernel.org/</eref>).</t>
      <t>Experience with the prototype indicates that the attribute enables
servers to identify directories whose contents change faster than
typical NFSv4.2 client cache lifetimes can track, while remaining
compatible with existing NFSv4.2 semantics.</t>
    </section>
    <section anchor="xdr-for-the-uncacheable-dirent-metadata-attribute">
      <name>XDR for the Uncacheable Dirent Metadata Attribute</name>
      <sourcecode type="xdr"><![CDATA[
///
/// typedef bool            fattr4_uncacheable_dirent_metadata;
///
/// const FATTR4_UNCACHEABLE_DIRENT_METADATA   = 88;
///
]]></sourcecode>
    </section>
    <section anchor="extraction-of-xdr">
      <name>Extraction of XDR</name>
      <t>This document contains the external data representation (XDR)
<xref target="RFC4506"/> description of the uncacheable dirent metadata attribute.  The XDR
description is presented in a manner that facilitates easy extraction
into a ready-to-compile format. To extract the machine-readable XDR
description, use the following shell script:</t>
      <sourcecode type="shell"><![CDATA[
#!/bin/sh
grep '^ *///' $* | sed 's?^ */// ??' | sed 's?^ *///$??'
]]></sourcecode>
      <t>For example, if the script is named 'extract.sh' and this document is
named 'spec.txt', execute the following command:</t>
      <sourcecode type="shell"><![CDATA[
sh extract.sh < spec.txt > uncacheable_prot.x
]]></sourcecode>
      <t>This script removes leading blank spaces and the sentinel sequence '///'
from each line. XDR descriptions with the sentinel sequence are embedded
throughout the document.</t>
      <t>Note that the XDR code contained in this document depends on types from
the NFSv4.2 nfs4_prot.x file (generated from <xref target="RFC7863"/>).  This includes
both nfs types that end with a 4, such as offset4, length4, etc., as
well as more generic types such as uint32_t and uint64_t.</t>
      <t>While the XDR can be appended to that from <xref target="RFC7863"/>, the code snippets
should be placed in their appropriate sections within the existing XDR.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>This attribute is not a security mechanism.  It addresses correctness
of client-side caching when client-cached dirent metadata
can become stale relative to the current state of the directory at
the server.  It does not change NFSv4.2 authentication or authorization
semantics, and it does not impose access controls on the entries it
describes.</t>
      <t>Authorization to set or modify the fattr4_uncacheable_dirent_metadata
attribute is governed by existing NFSv4.2 authorization mechanisms.
Servers <bcp14>MAY</bcp14> restrict modification of this attribute based on local
policy, file ownership, or access control rules.  This document does
not define a new authorization model.</t>
      <t>Because the attribute is visible to and affects the caching behavior
of all honoring clients, servers should consider the implications of
allowing unprivileged users to set or clear it.  Setting the attribute
on a directory forces honoring clients to abandon READDIR caching and
refetch dirent metadata on every enumeration, which can
increase load on the server and on other clients.  A server <bcp14>MAY</bcp14>
restrict modification of the attribute based on administrative
configuration, export policy, or ownership.</t>
      <t>This attribute does not change the semantics of sec_label or the
enforcement of MAC security policies.  A client's obligations under
Labeled NFS (see <xref target="RFC7204"/> for background, and <xref target="RFC7862"/> Section 9
for the NFSv4.2 mechanism) are the same whether dirent metadata is
refetched or served from a cache.</t>
      <t>The uncacheable dirent metadata attribute allows servers to indicate
that dirent metadata should not be assumed to remain valid across
enumerations of the directory.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
      <t>NFSv4.2 attribute numbers are assigned by working group coordination
rather than through an IANA registry.  This document uses attribute
number 88, chosen alongside attribute number 87 in
<xref target="I-D.ietf-nfsv4-uncacheable-files"/>.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC4506">
          <front>
            <title>XDR: External Data Representation Standard</title>
            <author fullname="M. Eisler" initials="M." role="editor" surname="Eisler"/>
            <date month="May" year="2006"/>
            <abstract>
              <t>This document describes the External Data Representation Standard (XDR) protocol as it is currently deployed and accepted. This document obsoletes RFC 1832. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="67"/>
          <seriesInfo name="RFC" value="4506"/>
          <seriesInfo name="DOI" value="10.17487/RFC4506"/>
        </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="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="I-D.ietf-nfsv4-uncacheable-files">
          <front>
            <title>Adding an Uncacheable File Data Attribute to NFSv4.2</title>
            <author fullname="Thomas Haynes" initials="T." surname="Haynes">
              <organization>Hammerspace</organization>
            </author>
            <date day="1" month="September" year="2026"/>
            <abstract>
              <t>   Network File System version 4.2 (NFSv4.2) clients commonly perform
   client-side caching of file data in order to improve performance.  On
   some systems, applications may influence client data caching
   behavior, but there is no standardized mechanism for a server or
   administrator to indicate that particular file data should not be
   cached by clients for reasons of performance or correctness.  This
   document introduces a new file data caching attribute for NFSv4.2.
   Files marked with this attribute are intended to be accessed with
   client-side caching of file data suppressed, in order to support
   workloads that require predictable data visibility.  This document
   extends NFSv4.2.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-nfsv4-uncacheable-files-12"/>
        </reference>
        <reference anchor="RFC7204">
          <front>
            <title>Requirements for Labeled NFS</title>
            <author fullname="T. Haynes" initials="T." surname="Haynes"/>
            <date month="April" year="2014"/>
            <abstract>
              <t>This memo outlines high-level requirements for the integration of flexible Mandatory Access Control (MAC) functionality into the Network File System (NFS) version 4.2 (NFSv4.2). It describes the level of protections that should be provided over protocol components and the basic structure of the proposed system. The intent here is not to present the protocol changes but to describe the environment in which they reside.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7204"/>
          <seriesInfo name="DOI" value="10.17487/RFC7204"/>
        </reference>
      </references>
    </references>
    <?line 714?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>Trond Myklebust, Mike Snitzer, Jon Flynn, Keith Mannthey, and Thomas
Haynes all worked on the prototype at Hammerspace.</t>
      <t>Rick Macklem, Chuck Lever, Dave Noveck, Sorin Faibish, Christoph
Hellwig, Jeff Layton, and Jamie Koehl reviewed the document.</t>
      <t>Chris Inacio, Brian Pawlowski, Chuck Lever, Zahed Sarker, and
Gorry Fairhurst helped guide this process.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
foiRwXbf7TGwRE5ua1+NBbh8rnrkF+J6/3dua4fBzpsqob7H9HtLgV6rwpOx
GRHDx2453W/nobO8wvG3G9yC0GPWZOwoK+9jeegb/UrKi3NRdEYc52bsynSm
GWYI8u1Pq2Bbk1q1pqquUyOJ4A6f3/YeiVplH+wKnur8qXiUcpZMFa1rV9H6
G7qKcxKKC4lc1g1g8bbu5Ml7J8PJ0eOyC7bsnhVa+bDFW7WeZe9jOwm5T9rH
aweCTESyFWa7XY1N8h1+4V3vHNhhkr/Iu1cd715cj/7pU4MRZnreeO/0qf+3
3P9nLff/FTP5P8wNg5fvddU+Z+HRt9b/S/zz9f8C/wy4AcFKf92z0qK3Pmun
3wAl77bV/ZGCtd4OoPSioq6vqmN1t6yn7lrPkJhMSzbhLNbhcJJaHj1sqWcm
NQHCnlESrJfw4riSw0PX1diYIHSNLQrfT4wxY3psd9LqZyPmvawSEEBDh3xF
OCRl1NTfX8SkfDcZOf8ih14iIzcrTu8G4OT9bVbMjlPzpem2Xvqz+DqNl+Qi
KH9Uli/3DeSZYr+j9IMS/Lzf8tg/5ANf2hPapbdL2Y88wyjC7A311YfXrkT+
eyQI4Vhd6AA8BQEhJKeDQcpODY0R0p3ua9m8cTx2qNN/nSK5MT+KqhxX4V+H
Qm+D6Da0XsB/2/+2935cMqjb8SsKmqrZrE36XqBQyuVMaXrMi7nn61i46y+O
/sqW7Qdf8ZWMJKIn+icIZc43hs0CJMr7SsnZmYLH/MIjO3VyZKfqHtn5krVD
mPCo125PmXhfegllneSRinLpnFz7MDOGsrf+wPAOtDWevJvR0dv1tUBISBd9
CQRNil0pbbG+QSeCd8mKSTj3uOT/HX7I68mM27szdO7HFo961vMiW9BrXOz4
hzsB+1hDoaPYQWblDMfHBU4CR7+au8ky4glY76+B/skkMAM1o2ImAki4CZOe
jhgbPHu3Se4VQDBZEdYe/YyX3+14RyElZV90kEY+KjLnnYrphM7CKPicMl/W
8O2KSCFCUIaaL4t0crg4L21OB3R2EZ2jpPdFJopBw9RQlQ4RkLNszU00c6pd
Z6qj9f0rI6hWw2beYysoNBVVxbYEQzMCu0upvIvRjWtK1aFkFskAKwqu6IjC
6QZPYCWFhEtjGAifGZbNZnXbOS2rddlCgI40OUVm8dZiT40pAt7LE4nv5DIb
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
CQ0UKtGbLyfqvwBRBQ3mP4AAAA==

-->

</rfc>
