Кратко

  • Для помеченного каталога соблюдающий расширение клиент не вправе обслужить новый обход результатами READDIR из другого обхода или сообщить об элементе значение, полученное до последнего READDIR, вернувшего этот элемент.
  • Требование относится к видимому ответу, а не к устройству кэша. Оно ограничено путём и возвращённым элементом и не заставляет владельца делегирования записи заменить своё более новое значение старым серверным.
  • Механизм способен убрать пропуски в резервном копировании и синхронизации, но увеличивает нагрузку метаданных, требует узких прав изменения и не даёт серверу доказательства соблюдения со стороны каждого клиента.

Родительский каталог не замечает запись в ребёнка

Пара «имя, fileid» может оставаться корректной, пока описание файла уже устарело. Создание, удаление или переименование элемента меняет атрибут change каталога. Дописывание данных в существующий файл другим клиентом меняет size, time_modify и другие файловые атрибуты, не затрагивая имя, fileid и состав родителя.

READDIR умеет вернуть файловые атрибуты рядом с элементами. Клиент сохраняет их, чтобы последующий stat не требовал GETATTR на каждый файл. RFC 8881 допускает такой ограниченный по времени кэш. Но в каталоге результатов HPC или зоне приёма данных с множеством одновременных авторов даже короткий положительный срок может отставать от темпа записей.

Это влияет не только на отображение. Инкрементальная копия или синхронизация дерева может решить по старому размеру и времени, что файл не менялся, и молча не перенести новые данные. fattr4_uncacheable_dirent_metadata позволяет серверу выделить каталоги, где на каждый проход нужна новая серверная точка наблюдения. Ложное значение атрибута не удостоверяет надёжность обычного кэша.

Редакция 11 перенесла норму на видимую границу

draft-ietf-nfsv4-uncacheable-directories-11 подан 5 сентября 2026 года. Это активный документ рабочей группы NFSv4 на стандартизационном треке. В нём заявлены прототипы сервера Hammerspace и клиента Linux, однако он остаётся Internet-Draft, а не RFC, одобрением IETF или свидетельством промышленного внедрения.

Редакция 10 требовала получать метаданные с сервера «на каждом READDIR». Но READDIR и так является сетевой операцией к серверу. Фраза не исключала ясно вариант, когда клиент обновляет имена, а затем сообщает старый размер из своего обычного кэша inode-атрибутов.

Новая редакция задаёт два запрета. Нельзя удовлетворять новый обход результатом READDIR, полученным в другом обходе. Если последний READDIR вернул элемент, нельзя сообщать для него значение атрибута, принятое до этого READDIR, независимо от того, какая операция прежде положила значение в кэш.

Теперь правило проверяется снаружи: первый обход, параллельная запись с другого клиента, второй обход и stat. Запрещено значение, предшествующее READDIR второго прохода. Удалил ли клиент старую запись, перезаписал, сохранил по поколениям или оставил рядом — несущественно, пока она не становится ответом на новый вопрос.

Проход, системный вызов и протокольная операция — не одно

Редакция определяет единицы поведения. readdir в нижнем регистре — запрос приложения. READDIR в верхнем — операция NFSv4.2. enumeration — один проход по каталогу, включающий много вызовов приложения и, для большого каталога, несколько продолжающих READDIR. Один сетевой ответ обычно снабжает множество readdir.

Поэтому проект не требует сетевого обращения на каждое имя. Он требует, чтобы текущий проход основывался на READDIR этого прохода. Клиенту следует включить нужные атрибуты в attr_request. Получить их после можно, но GETATTR на каждый элемент вернёт именно тот шквал запросов, ради устранения которого атрибуты несут внутри READDIR.

После прохода значения можно хранить. Между проходами действуют обычные сроки атрибутного кэша. Когда следующий READDIR снова вернул элемент, более раннее значение перестаёт подходить для ответа этого прохода. Слово «uncacheable» скрывает реальный смысл: ограничивается происхождение отчёта, а не факт хранения.

Включение политики распространяется не мгновенно

Сервер может выставить TRUE, а клиент ещё видеть закэшированные атрибуты каталога. До получения нового значения он вправе продолжать старое поведение. Окно закрывается, когда истекает верхняя граница кэша или повторная проверка замечает изменение каталожного change.

Следовательно, в журнале нужны три времени: SETATTR на сервере, первое наблюдение у каждой группы клиентов и первый соответствующий правилу ответ приложения. Один момент конфигурации нельзя выдавать за одновременный эффект во всей системе.

Делегирование каталога тоже требует перехода. Оно позволяет клиенту отвечать без возврата к серверу, а атрибут требует новый серверный путь на каждый проход. При включении сервер обязан отозвать действующее делегирование и не выдавать новое, пока значение TRUE. Уведомления об атрибутах детей не универсальная замена: механизм необязателен, часто отсутствует, а стоимость может расти как число клиентов, умноженное на число изменений.

Иногда новейшая истина находится у клиента

Клиент с OPEN_DELEGATE_WRITE способен иметь size или change новее серверной копии. RFC 8881 предусматривает CB_GETATTR, чтобы сервер запросил эти значения у временного владельца полномочия записи. Замена такого значения более старым серверным состоянием была бы шагом назад.

Редакция 11 оговаривает исключение: запрет относится к данным старее того, что вернул бы сервер, и не заставляет владельца делегирования отказываться от более новых. Свежесть определяется не направлением запроса, а источником действующей власти над записью.

Даже только что полученное серверное значение может устареть сразу после ответа. Атрибут не создаёт атомарный распределённый снимок данных и метаданных. Он лишь не позволяет прикрепить заведомо прежнее наблюдение к новому проходу.

Метка действует в контексте пути

Атрибут задаётся для каталога и ограничивает ответы об элементах, перечисленных через него. Если один файл жёстко связан с помеченным и непомеченным каталогами, второй путь не затрагивается. Автоматическое наследование подкаталогами протокол также не определяет; это локальная политика сервера, которую надо инвентаризировать отдельно.

Исправлено и поведение по типу объекта. Поддержка атрибута объявляется для файловой системы, поэтому GETATTR на объекте, который не является каталогом, должен вернуть FALSE. SETATTR на неверном типе возвращает NFS4ERR_WRONG_TYPE. Знание расширения файловой системой и его применимость к конкретному объекту — разные факты.

Запрос атрибута не доказывает соблюдение

Атрибут носит рекомендательный характер. GETATTR или SETATTR показывает, что клиент знает идентификатор, но не что он выполняет два запрета. Сервер не может по этому следу отличить соблюдающий клиент от знающего, но игнорирующего, или не реализующего. Поэтому собственную корректность нельзя строить на всеобщем поведении, которое невозможно подтвердить.

Цена механизма намеренна. Каждый новый обход помеченного каталога создаёт работу на сервере; READDIR только с именами и последующий GETATTR на каждый элемент ещё дороже. Если непривилегированный пользователь способен переключить атрибут на горячем дереве, одна запись метаданных навяжет нагрузку всем соблюдающим клиентам. Полномочия, экспортная политика и бюджет мощности — часть управления.

Публичные источники подтверждают текст, историю, базовые RFC, причины коммитов и заявленные прототипы. Они не подтверждают выпущенную версию Linux, поведение продукта Hammerspace, распространённость, измерения, инцидент или достигнутый эффект. Отдельный проект про некэшируемые данные файла касается содержимого и долговечности записи, не расширяя эту норму метаданных.

В терминах слоёв реальности Heng Lu серверный атрибут — заявление, клиентский кэш — частное состояние, READDIR — наблюдение, а stat — сообщение приложению. Редакция 11 усиливает стандарт тем, что сохраняет различия и описывает только проверяемый переход.

Источники