摘要

  • LAYOUT_WCC 把客户端从 NFSv3 操作中取得的数据文件属性带回元数据服务器,使后者可以少做一次 GETATTR。
  • 客户端可以不报告,元数据服务器也可以忽略或重新查询;成功响应不逐项确认哪些属性已被采用。
  • 属性变化、数据落入稳定存储、所有镜像一致以及应用读到正确内容,分别需要自己的凭证。

设想一次 NFS4ERR_ACCESS。客户端刚从数据服务器收到实际 uid 与 gid,元数据服务器的缓存却保存着另一组预期值。最诱人的自动化是:谁最后报告,谁就改写另一边。但 RFC 9766 设计的不是这种权力转移,而是一条有边界的证据通道。

数据与元数据没有走同一条路

pNFS 的 flexible file layout 把一个文件拆成不同控制面。元数据服务器管理命名空间、元数据与 layout;客户端取得 layout 后,可以直接到数据服务器读写内容。数据服务器甚至可以只支持 NFSv3。

效率来自绕过,盲区也来自绕过。客户端在数据服务器上完成 WRITE 时,元数据服务器不一定参与。NFSv3 数据服务器又没有一条普遍适用的反向控制协议,把文件大小、修改时间或属主变化主动推给元数据服务器。于是,内容已经改变,负责回答 GETATTR 的一方却可能还没收到变化。

元数据服务器可以亲自向数据服务器发 GETATTR。这个答案更直接,却会增加往返;大量查询还会把元数据读取转化为数据服务器负荷。RFC 9766 新增 NFSv4.2 操作 77,让已经拿到 NFSv3 WCC 属性的客户端把它们送回元数据服务器。

这个优化的关键不在“传了什么”,而在“没有夺走什么”:元数据服务器仍然决定是否采用,也仍然可以再查一次。

弱一致性说明的是证据强度

RFC 1813 的 Weak Cache Consistency 不是营销上的保守命名。它把操作前的关键属性与操作后的属性放在一起,使客户端能够判断期间是否可能出现其他修改,从而决定是否让缓存失效。它比单独一张事后快照更有解释力,但不是严格的服务器—客户端一致性协议。

若操作前取值、修改动作和操作后取值之间留有可被第三方写入的窗口,客户端就无法断定自己是不是唯一修改者。属性又会继续变化,所以一份当时正确的 WCC 也不能冻结未来。

RFC 9766 保留了这种“不足”。客户端可以忽略从 READ、WRITE 或 COMMIT 得到的 WCC;元数据服务器可以忽略 LAYOUT_WCC 中的属性。当服务器不采用时,客户端没有追索机制,因此结果里根本没有表示逐项接受状态的 bitmap。一次 RPC 成功只能证明没有返回所列错误,不能证明八个字段都进入了权威视图。

八个字段不能压成一盏绿灯

flexible file payload 要映射 size、space_used、mode、owner、owner_group、time_access、time_modify 与 time_metadata。数字 uid/gid 在 NFSv4 一侧被转换为属主字符串。

这些字段代表不同现象。大小变了,可能是写入;访问时间变了,可能是读取;mode 或 owner 不一致,可能解释权限错误。它们既没有同一影响,也不应有同一信任门槛。对容量展示可接受的时间差,未必适用于自动修复权限。

RFC 给出几个适合报告的时点:客户端将向元数据服务器索取大小、占用空间、change 或三个时间属性之前;它通过 LAYOUTRETURN 或 LAYOUTERROR 报告访问错误时;以及它要刷新委托期间代理维护的时间时。这些是减少重复取值的机会,不是无条件 SETATTR 的授权。

当 uid/gid 与预期不符,元数据服务器既可能修复数据文件权限,也可能承认自己的缓存错了。决定方向需要 layout 生命周期、配置来源、最近变更和验证策略。把差异直接变成写操作,会让证据生产者顺便取得修正现实的权力。

位置关系不能代替对象身份

外层由当前 filehandle 与 lowa_stateid 指向特定 layout,lowa_type 决定如何解释 payload。进入 flexible file 结构后,报告还要面对镜像与数据服务器数组。

数组位置不够。三个镜像中只有两个发生变化时,客户端可以把三个都列出,并给未变化者空 attribute mask;也可以只报两个。元数据服务器必须用 device ID、stateid 和数据文件 handle 三者组合定位更新对象。一个设备上可能有多个数据文件,缺少任何一项都会产生歧义。

错误处理也不是全有或全无。遇到允许的错误,元数据服务器可以忽略整个操作;若 layout-specific payload 允许,也可以采用其中一部分。因此,审计日志若只留下“LAYOUT_WCC 成功/失败”,事后无法说明哪个镜像、哪个数据文件、哪些字段真正改变了元数据状态。

属性没有为数据耐久性作证

文件大小正确不等于最后一次 WRITE 已经稳定。RFC 8435 对另一条链作出要求:若数据服务器的 WRITE 没有返回 FILE_SYNC,客户端在 LAYOUTCOMMIT 前必须先对相关数据服务器执行 COMMIT。LAYOUT_WCC 没有取代这张持久化回执。

镜像也有自己的完成条件。客户端侧 mirroring 要求客户端更新所有镜像,只有全部成功才把写事务视为成功;错误交给元数据服务器后,后者可能还要 resilver。来自一个数据文件的属性不能替没被观察的副本说话。

再往上,元数据完全正确也不代表应用读到了预期字节。缓存可能仍旧,文件可能选错,业务校验也可能失败。从属性报告、元数据采用、直接核验、稳定存储、镜像一致到应用结果,应该是一条可连接但不可合并的凭证链。

可选扩展留下更强的退路

RFC 9766 把 LAYOUT_WCC 同时规定为 NFSv4.2 与 flexible file layout 的可选扩展。未实现 operation 77 的端点不因此失效;系统仍可采用原有 GETATTR 路径,只是成本不同。RFC 8178 规定扩展框架,RFC 7862 与 RFC 7863 提供协议和 XDR 基础。文档可以定义编码,只有运行中的端点才能证明支持与采用。

安全边界继续继承 RFC 8435。松耦合模型用 synthetic uid/gid 隔离合作型客户端,却不能防御恶意客户端,也可能只能一次隔离所有客户端;紧耦合模型依赖自己的控制协议。后端通信仍需防窃听与篡改。认证过的客户端可以证明“谁提交了报告”,不能自动证明“报告是最新的数据服务器真相”。

来源

  1. RFC 9766:NFSv4.2 Flexible File Layout 的弱缓存一致性扩展
  2. RFC 8435:Parallel NFS Flexible File Layout
  3. RFC 8434:pNFS Layout Type 要求
  4. RFC 1813:NFS Version 3 Protocol
  5. RFC 8881:NFS Version 4 Minor Version 1
  6. RFC 7862:NFS Version 4 Minor Version 2
  7. RFC 7863:NFSv4.2 XDR Description
  8. RFC 8178:NFSv4 扩展与次版本规则
  9. RFC 9754:NFSv4.2 文件打开与委托扩展
  10. Running-Code Primacy
  11. Minimum Initial Specification, Localized Future Decision, and Voluntary Adoption
  12. On Reality Layers, Symbolic Power, and Why Clarity Feels So Hostile