注意
本文档适用于 Ceph 开发版本。
观察通知
请参阅 librados 以了解监控/通知接口。
概述
对象信息(参见 osd/osd_types.h)通过对象信息对象中的 watchers 映射持久跟踪特定对象的监控集。
每个监控都有一个关联的监控对象(参见 osd/Watch.h)。被监控对象的上下文将有一个对每个监控的(强)引用,并且每个监控对象都持有对相应对象上下文的引用。这种循环引用是故意的,当监控状态在新对等间隔上被丢弃或在超时过期或取消监控操作时被解除。
一个监控通过 Watch::conn 强引用跟踪关联的连接。关联的连接在 OSD::Session 中存储了一个 WatchConState,用于跟踪关联的监控,以便在 ms_handle_reset()(通过 WatchConState::reset())时通知它们。
每个监控对象跟踪当前未确认的通知集。在监控对象上调用 start_notify() 会向监控添加对新进行中通知的引用,并执行以下操作:
如果监控是连接的,则向客户端发送通知消息
如果监控是未连接的,则不执行任何操作。
当监控连接时(在 PrimaryLogPG::do_osd_op_effects 中),会向所有剩余跟踪的通知对象重新发送通知。
每个通知对象通过调用 complete_watcher() 跟踪未通知的监控集。一旦剩余集为空或超时过期(在 init() 中注册的回调),就会向客户端发送通知完成通知。
观察生命周期
一个监控可能处于以下 5 种状态之一:
不存在。
存储在磁盘上,但未注册到对象上下文中。
已连接
已断开连接,已向计时器注册回调
已断开连接,回调在队列中用于清理或已降级
情况 2 发生在一个 OSD 处于活动状态和具有监控的对象的上下文由于访问而被加载到内存之间。在情况 2 中,监控没有注册状态。情况 2 在 PrimaryLogPG::populate_obc_watchers() 中在 PrimaryLogPG::find_object_context 时转换为情况 4。情况 1 由于监控操作通过 OSD::do_osd_op_effects 转换为情况 3。情况 4,5 以相同的方式转换为情况 3。情况 3 在监控的会话连接重置时转换为情况 4。
情况 4&5 可以进行一些解释。通常,当监控进入情况 4 时,会向 OSDService::watch_timer 注册一个回调,以便在超时过期时调用。然而,在回调被调用时,pg 可能处于无法写入对象以删除监控的状态(即在清理期间或对象正在降级时)。在这种情况下,我们使用 Watch::get_delayed_cb() 生成另一个上下文,用于从回调_for_degraded_object 和 Scrubber::callbacks 列表中使用。在任何情况下,Watch::unregister_cb() 都会做正确的事情(对于未注册到计时器的上下文,SafeTimer::cancel_event() 无害)。
通知生命周期
通知超时更简单:在通知 init() 时注册一个超时回调。如果所有监控在超时发生之前确认通知,则取消超时并通知客户端通知完成。否则,超时触发,通知对象通过 cancel_notify 向每个监控发送通知以删除自己,并提前向客户端发送通知完成通知。
由 Ceph 基金会带给您
Ceph 文档是一个社区资源,由非盈利的 Ceph 基金会资助和托管Ceph Foundation. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.