注意
本文档适用于 Ceph 的开发版本。
子树导出
正常迁移
导出器首先在 export_dir() 中进行一些检查,以验证此时是否允许导出子树。特别是,集群不得处于降级状态,子树根目录不得处于冻结或已冻结状态(即已在导出,或嵌套在正在导出的事物之下),并且路径必须被固定(即不与重命名冲突)。如果满足这些条件,则启动子树冻结,并且导出器致力于子树迁移,除非导入器或其自身发生故障。
MExportDirDiscover 仅用于确保正在导出的基本目录在目标节点上打开。它被导入器固定以防止其被修剪。这发生在导出器完成子树冻结之前,以确保导入器能够复制必要的元数据。当导出器收到 MExportDirDiscoverAck 时,它允许冻结继续进行。
MExportDirPrep 消息随后用于填充一个跨越树,其中包括所有必需的 dir、inode 和 dentry,以到达导出区域内的任何嵌套导出。这也会复制元数据,但它由导出器推出,避免了与常规发现和复制过程的死锁。导入器负责在确认之前打开来自任何第三方的边界目录。这确保了导入器拥有正确的 dir_auth 信息,即对于正在迁移的子树内嵌套的所有点,权限委托给何处。在处理 MExportDirPrep 时,导入器会冻结整个子树区域,以防止任何新的复制或缓存过期。
警告阶段仅在基本子树目录被除导入器和导出器之外的节点打开时发生。如果是这样,MExportDirNotify 消息会通知任何旁观者该区域的权限暂时不明确。特别是,从缓存中修剪项目的旁观者必须向旧权限和新权限发送 MCacheExpire 消息。这对于确保幸存的权限可靠地接收所有过期至关重要,即使导入器或导出器发生故障也是如此。当子树被冻结(在导入器和导出器上)时,过期将不会立即处理;相反,它们将被排队,直到该区域解冻并且可以确定该节点是否对该区域具有权限。
MExportDir 消息将实际的子树元数据发送给导入器。收到后,导入器将数据插入其缓存中,在 EImportStart 中记录一份副本,并回复 MExportDirAck。导出器现在可以记录 EExport,它最终指定导出成功。在发生故障的情况下,EExport 的存在在恢复期间消除了权限歧义。
一旦记录,导出器将向任何旁观者发送 MExportDirNotify,通知他们权限不再模糊,并且缓存过期应仅发送给新权限(导入器)。一旦这些得到确认,隐式刷新旁观者到导出器消息流中的任何杂散过期通知,导出器解冻子树,清理其状态,并向导入器发送最终的 MExportDirFinish。收到后,导入器记录 EImportFinish(true),解冻其子树,并清理其状态。
部分故障恢复
从日志恢复