OSD的内部队列
由于op可能各种各样的原因需要背推迟处理,为此PG内部维护了多种op重试队列,它们的含义下表所示:
队列名称 | 入队条件 |
wait_for_map | 当收到op时,已经有来自同一个客户端的op存在于此队列中,,或者op携带的Epoch大于PG当前的Epoch |
waiting_for_peered | PG不是Peered或者Active状态(例如PG处于Down或者Incomplete状态)。 |
waiting_for_active | PG不是Active状态(例如PG处于peered状态)。 |
waiting_for_unreadable_object |
op操作Primary上的降级对象或对象不可读(例如纠删码的情况下,对象的一个或多个分片损坏,并且无法通过解码恢复)。 |
waiting_for_degraded_object | op包含写操作并且操作对象降级 |
waiting_for_srub |
op操作的对象正在Srub。 注意:由于PG能够执行Srcub的迁移是PG处于Active + Clean状态,所以PG总是最后检查此队列。 |
为了保证op之间不会乱序,所有队列都被设计成FIFO队列并且队列之间严格有序,当某个限制条件 被解除后,PG会触发相关队列的op出列,重新进入op_shardedwq排队。