注意
本文档适用于 Ceph 开发版本。
PG移除
请参阅OSD::_remove_pg、OSD::RemoveWQ
PG从OSD中移除有两种方式:
从主节点进行MOSDPGRemove
OSD::advance_map发现池已被移除
在任何一种情况下,我们移除PG的一般策略是
OSDService::deleting_pgs跟踪所有正在被删除的PG。DeletingState对象在至少有一个对其的引用存在时存活。RemoveWQ中的每个项目都包含相关PG的DeletingState的引用,因此deleting_pgs.lookup(pgid)只有在当前没有正在删除该PG的集合时才会返回空引用。
PG的DeletingState还包含有关当前删除状态的信息,并允许取消删除。可能的状态有:
队列:PG在RemoveWQ中
清理目录:PG的内容正在同步移除
删除目录:PG的目录和元数据正在排队删除
已删除目录:最终删除事务已排队
已取消:删除已被取消
在1和2中,删除可以被取消。每个状态转换方法(和check_canceled)如果删除已被取消则返回false,如果状态转换成功则返回true。类似地,try_stop_deletion()如果成功取消删除则返回true。此外,如果try_stop_deletion()未能停止删除,它将不会返回,直到最终删除事务已排队。这确保了在该点之后排队的任何操作都将按顺序排在PG删除之后。
OSD::_create_lock_pg必须处理两种情况:
要么没有为PG创建DeletingStateRef,或者它未能取消
我们成功取消了删除。
在第一种情况下,我们假设没有发生删除,除了我们避免在删除完成之前向PG写入。在第二种情况下,我们按照第一种情况处理,但首先将PG标记为回填。
类似地,OSD::osr_registry确保在旧PG完全移除之前创建的那些PG的OpSequencers可以被重用于新PG,确保新PG上的操作相对于旧PG上的操作正确排序。
由 Ceph 基金会带给您
Ceph 文档是一个社区资源,由非盈利的 Ceph 基金会资助和托管Ceph Foundation. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.