注意
本文档适用于 Ceph 的开发版本。
The ClientRequest pipeline
RADOS 要求对每个对象的写入操作都按顺序执行。如果客户端提交了一系列并发写入(即在提交下一个写入之前不等待前一个写入完成),客户端可能依赖于写入操作按照提交的顺序完成。
因此,客户端->osd 通信以及双方的排队机制必须确保(连接、对象)对的写入操作在整个过程中保持有序。
crimson-osd 通过管道和阶段(crimson/osd/osd_operation.h)来强制执行这种排序。消息到达 OSD 后,会进入 ConnectionPipeline::AwaitActive 阶段,并依次通过一系列管道阶段
ConnectionPipeline:按连接划分的阶段,表示消息在被移交给目标 PG 之前的处理路径
PerShardPipeline:中间管道,表示从接收分片移交给具有目标 PG 的分片的过程。
CommonPGPipeline:表示在目标 PG 上获取操作目标 ObjectContext 之前的处理。
CommonOBCPipeline:表示在目标对象上实际处理 IO 的过程
因为 CommonOBCPipeline 是按对象而不是按连接或按 PG 划分的,所以不同对象上的多个请求可以同时处于同一个 CommonOBCPipeline 阶段。这允许我们在同一个 PG 中并发处理多个读取操作。我们还可以并发处理多个对象上的写入操作,直到实际提交写入操作为止。
有关详细信息,请参阅 crimson/osd/osd_operations/client_request.(h|cc)。