1、执行创建池子命令:ceph osd pool create 128 128
注意此处创建池子命令和rados创建池子命令的流程完全不同。ceph命令调用librados接口向mon发送命令。
ceph 命令中大部分都是发送给mon的(MonCommands.h中),只有很少一部分直接发送给osd或者pg。
暂时未详细分析哪些命令是发送给osd和pg的。
2、Mon收到消息,在_ms_dispatch
函数中进行处理。_ms_dispatch -> dispatch_op中处理客户端的command:
case MSG_MON_COMMAND:
op->set_type_command();
handle_command(op);
handle_command中,发送给OSDMonitor进行处理:
if (module == "osd") {
osdmon()->dispatch(op);
return;
}
3、OSDMonitor处理消息,并创建池子
4、OSDMonitor的变化影响到了PGMonitor(paxos_service),PGMonitor中,post_paxos_update --> check_subs -> preprocess_query -> preprocess_pg_stats
PaxosService::dispatch -> prepare_update -> prepare_pg_stats
prepare_pg_stats函数通过pg_stats_have_changed函数检测到底层池子发生变化,然后调用send_pg_creates,发送了MOSDPGCreate消息。
4、OSD收到MSG_OSD_PG_CREATE消息,然后通过handle_pg_create函数创建pg。
大致流程:ceph命令->Monitor->OSDMonitor->PGMonitor->OSD