注意
本文档适用于 Ceph 开发版本。
映射和PG消息处理
概述
OSD处理将传入消息路由到PG,在某些情况下创建PG。
PG消息通常有两种类型:
对等消息
操作/子操作
消息可能以几种方式被丢弃或延迟。重要的是,消息延迟不应导致在到达相关PG处理逻辑的过程中违反某些消息排序要求:
涉及同一对象的操作不得重新排序。
对等消息不得重新排序。
子操作不得重新排序。
MOSDMap
MOSDMap消息可能来自监视器或其他OSD。收到后,OSD必须执行几项任务:
将新地图持久化到文件存储。
更新并持久化超级块。
更新与当前地图相关的OSD状态。
通过OSDService.
因池删除而删除PG。
队列虚拟事件以触发PG地图追赶。
每个PG在处理事件之前,在process_peering_events期间异步赶上当前发布的地图。因此,不同的PG可能对“当前”地图有不同的看法。
这种设计的一个后果是,包含来自多个PG的子消息的消息(MOSDPGInfo、MOSDPGQuery、MOSDPGNotify)必须将每个子消息标记为PG的时期,以及将整个消息标记为OSD的当前发布时期。
MOSDPGOp/MOSDPGSubOp
见OSD::dispatch_op、OSD::handle_op、OSD::handle_sub_op
MOSDPGOps由客户端用于启动rados操作。MOSDSubOps用于OSD之间协调大多数非对等活动,包括复制MOSDPGOp操作。
OSD::require_same_or_newer 地图检查当前OSDMap是否至少与消息上指示的地图时期一样新。如果不是,则通过OSD::wait_for_new_map通过OSD::waiting_for_osdmap将消息排队。注意,这不能违反上述条件,因为任何两条消息都将按接收顺序排队,如果收到一条时期为e0的消息,则来自同一来源的后续消息必须至少为e0时期。注意,来自同一OSD的两个PG在这些目的上被视为不同的来源,即来自不同PG的消息可能会被重新排序。
MOSDPGOps遵循以下流程:
OSD::handle_op:验证权限和crush映射。
OSD::enqueue_op
MOSDSubOps遵循以下流程:
OSD::handle_sub_op检查发送者是否为OSD
OSD::enqueue_op
OSD::enqueue_op调用PG::queue_op,该操作在调用OpWQ::queue之前检查waiting_for_map,并将操作添加到负责处理该操作的PG的队列中。
OSD::dequeue_op最终被调用,并锁定PG。此时,操作被传递到PG::do_request,该操作检查:
PG地图是否足够新(PG::must_delay_op)
请求操作的客户端是否有足够的权限(PG::op_has_sufficient_caps)
操作不会被丢弃(PG::can_discard_{request,op,subop,scan,backfill})
PG处于活动状态(PG::flushed布尔值)
操作是CEPH_MSG_OSD_OP并且PG处于PG_STATE_ACTIVE状态并且不在PG_STATE_REPLAY
如果这些条件不满足,操作将被丢弃或排队以供以后处理。如果所有条件都满足,操作将根据其类型进行处理:
CEPH_MSG_OSD_OP由PG::do_op处理
MSG_OSD_SUBOP由PG::do_sub_op处理
MSG_OSD_SUBOPREPLY由PG::do_sub_op_reply处理
MSG_OSD_PG_SCAN由PG::do_scan处理
MSG_OSD_PG_BACKFILL由PG::do_backfill处理
CEPH_MSG_OSD_OP处理
PrimaryLogPG::do_op处理CEPH_MSG_OSD_OP操作,如果它是CEPH_OSD_OP_PGLS并且为指定的snapid并且一些对象更新仍然缺失,则将其排队
在wait_for_all_missing中,如果它是CEPH_OSD_OP_PGLS并且为指定的snapid并且一些对象更新仍然缺失
在waiting_for_active中,如果操作可以写入但清理程序正在工作
在waiting_for_missing_object中,如果操作需要对象或快照目录或特定快照而它们仍然缺失
在waiting_for_degraded_object中,如果操作可以写入退化的对象或快照目录,或者如果另一个对象阻止它(“blocked_by”)
在waiting_for_backfill_pos中,如果操作需要对象,该对象将在回填完成后可用
在waiting_for_ack中,如果预期从另一个OSD收到确认
在waiting_for_ondisk中,如果操作正在等待写入完成
对等消息
见OSD::handle_pg_(notify|info|log|query)
对等消息带有两个时期标记:
epoch_sent:消息发送时的地图时期
query_epoch:触发消息的消息发送时的地图时期
在没有触发消息的情况下,这两个是相同的。如果相关PG进入新时期(见PG::old_peering_evt、PG::queue_peering_event),则丢弃对等消息。通知、信息、通知和日志都作为PG::PeeringMachine事件处理,并由PG::queue_*通过PG::CephPeeringEvts包装,其中包括创建的状态机事件以及epoch_sent和query_epoch,以便在插入和从队列中删除时通用检查PG::old_peering_message。
注意,通知、日志和信息可以触发PG的创建。见OSD::get_or_create_pg。
由 Ceph 基金会带给您
Ceph 文档是一个社区资源,由非盈利的 Ceph 基金会资助和托管Ceph Foundation. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.