摘要
- RFC 9737 允许 pNFS 客户端在 MDS 恢复宽限期内,用全零匿名 stateid 通过
LAYOUTRETURN报告停机期间的数据服务器 I/O 错误。 - 全零值只让报告进入恢复流程,不会复活旧 layout、授权普通 I/O,也不会证明报告之外的镜像正确。
- 显式错误、完成回收且无错误、客户端沉默、镜像集合变化与版本不兼容,必须保留为五种不同状态。
服务器重启之前,客户端握有一个有效 layout。服务器重启之后,这份 layout 的 stateid 已经死亡。问题在于:客户端可能趁元数据平面离线时,仍直接向多个数据服务器写入;其中一份镜像返回了错误。
权力过期了,观察却仍然真实存在。
如果系统为了接收错误而恢复旧 stateid,它会把过期权限重新带入当前状态。如果系统拒绝一切旧上下文,它又会丢掉决定镜像修复来源所需的唯一证词。RFC 9737 选择第三条路:不恢复旧权力,只开一条范围极窄的证据通道。
全零不是万能凭证
在 pNFS flexible file layout 中,MDS 提供布局,客户端绕过 MDS 直接访问数据服务器。客户端侧镜像要求客户端更新所有副本,并把错误告诉 MDS。RFC 8435 的 ff_ioerr4 能携带设备、操作、错误状态、字节偏移和长度。
这些字段很具体,但规范仍把它们称为提供给 MDS 的 hints。客户端是重要见证者,不是全知的完整性证明器。它能说明某次操作在某段范围、某个设备上失败;不能由此证明其他所有字节、其他客户端和应用语义都正确。
MDS 重启后进入 grace period。客户端可以用 CLAIM_PREVIOUS 回收打开状态,最后用 RECLAIM_COMPLETE 表明回收结束。旧 layout stateid 却已经无效,客户端也不能在宽限期内先拿一个新 layout,再借新权限解释旧错误。
RFC 9737 要求 MDS 在这个窗口中接受 lrf_stateid 为全零的 LAYOUTRETURN。它只回答一个问题:现在可以听取这份停机期错误报告。
恢复时代是消息含义的一部分
全零 stateid 只能在 grace period 内用于这条路径。宽限期内使用其他值,MDS 必须返回 NFS4ERR_GRACE;宽限期结束后继续使用全零值,则返回 NFS4ERR_NO_GRACE。处理匿名形式时,MDS 还不得递增返回 stateid 的 seqid。
这组规则避免把证据接纳伪装成普通 layout 状态迁移。报告进入决策,却不进入仍然存活的权限序列。
因此,日志里的 stateid=0 本身几乎没有审计价值。记录必须带上重启 epoch、grace 起止、客户端、文件、write intent、客户端看到的镜像集合、ff_ioerr4 内容、服务器响应以及后续决定。没有时间和镜像上下文,全零无法证明它被合法使用。
这正是最小初始规范的意义:共同层严格规定一个值、一条操作、一个时期、一个用途;复制方式、访问策略和代理实现仍可由本地运行代码决定。
没有错误与没有证人不是一回事
RFC 9737 的恢复表把三种经常被监控系统压成零的状态分开。
客户端回收文件且没有报告错误,MDS 不得 resilver。客户端报告错误,文件必须 resilver。客户端在 grace 结束前既没有回收,也没有报告,MDS 同样必须 resilver,因为客户端可能已经重启并丢失状态。
第二和第三种都会触发重建,但证据性质不同。显式错误是正面问题证据;客户端缺席是证据缺失。把缺席解释成“没有错误”,等于让一台已经消失的机器替所有镜像签发健康证明。
第一种也不能被夸大。完成回收且无报告,只能支持协议规定的不重建决定。它不是逐字节加密审计,不证明静默损坏不存在,也不证明另一个客户端没有不同观察。运行代码优先要求系统保留准确动词:回收过、观察到、报告过、接收了、决定了、验证了。
一份真实报告也可能已经过时
MDS 还要比较报告中的 layout 与文件当前镜像实例。如果不一致,必须忽略 LAYOUTRETURN 并重建文件。客户端可能完全诚实地描述了旧镜像集合,但对旧集合的准确描述不能直接支配新集合。
审计链必须保留两份指纹:客户端观察时的镜像集合,以及 MDS 决策时认为有效的集合。没有比较结论,外部只会看到“收到错误后进行了重建”,却无法知道服务器其实因证据过时而走了独立的保守路径。
镜像集合的身份是证据的一部分。设备名、索引或地址相似,不等于恢复周期中的镜像角色相同。
决定重建之后,还有另一条证据链
write intent 从客户端取得 LAYOUTIOMODE4_RW 时开始。MDS 必须跨重启跟踪这些意图。需要 resilver 时,大致顺序是:fence 文件、记录重建需要、释放 write intent,等所有意图消失后才开始复制。存在未清意图时不得重建。
复制期间怎样提供访问属于实现选择:完全阻断 I/O、强制经 MDS,或者插入代理边复制边更新。如果继续开放访问,客户端必须保持重启前相同的 layout 集合;代理必须留到 grace 结束。
一条被接收的错误报告不证明这些步骤完成。还需要证明 fence 生效、来源镜像可读、范围复制完成、副本收敛、后续读取正确、应用接受数据。报告决定往哪里查,不替代结果验证。
旧版本以额外工作换取不说假话
不支持扩展的 MDS 会对全零 stateid 返回 NFS4ERR_BAD_STATEID。客户端应退回旧行为,不再通过这条路径报告错误。兼容失败没有被包装成成功。
代价是保守重建。MDS 宁可多花带宽、IOPS 与时间,也不假设自己听懂了未支持的证据。运营指标必须把这种 fallback 单独计数;否则“恢复成功”会掩盖扩展根本没有生效。
RFC 9737 最有价值的地方,并不是让零拥有权力。恰恰相反,它证明系统可以在不复活旧权限的前提下保存观察。真正成熟的恢复设计,应当把报告可听、报告适用、重建决定、复制完成和数据可用分别留下收据。
来源
- https://www.rfc-editor.org/rfc/rfc9737.html
- https://www.rfc-editor.org/rfc/rfc9737.txt
- https://www.rfc-editor.org/info/rfc9737/
- https://datatracker.ietf.org/doc/rfc9737/
- https://datatracker.ietf.org/doc/rfc9737/history/
- https://www.rfc-editor.org/errata/rfc9737
- https://www.rfc-editor.org/rfc/rfc8435.html
- https://www.rfc-editor.org/info/rfc8435/
- https://www.rfc-editor.org/rfc/rfc8881.html
- https://www.rfc-editor.org/info/rfc8881/
- https://www.rfc-editor.org/rfc/rfc7862.html
- https://www.rfc-editor.org/info/rfc7862/
- https://www.rfc-editor.org/rfc/rfc7863.html
- https://www.rfc-editor.org/info/rfc7863/
- https://www.rfc-editor.org/rfc/rfc8178.html
- https://www.rfc-editor.org/info/rfc8178/
- https://www.rfc-editor.org/rfc/rfc4506.html
- https://www.rfc-editor.org/info/rfc4506/
- https://www.rfc-editor.org/rfc/rfc5661.html
- https://www.rfc-editor.org/info/rfc5661/
- https://datatracker.ietf.org/doc/draft-ietf-nfsv4-layrec/
- https://datatracker.ietf.org/doc/draft-ietf-nfsv4-layrec/history/
- https://heng.lu/running-code-primary-the-patch-needed-to-preserve-the-internet-original-design/
- https://heng.lu/minimum-initial-specification-localized-future-decision-voluntary-adoption-internet-coordination-system/
会员简报
档案背景详情
使用相应会员等级登录,即可解锁完整简报与来源注释。
仅限 Strategic Circle
Strategic Circle
所有读者均可浏览。加入并登录后可解锁档案简报。
加入 Strategic Circle仅限 Leadership Alliance
Leadership Alliance
符合条件的 IP 资产所有者和管理层可登录查看 Leadership Alliance 简报。
加入 Leadership Alliance
