接上次说到的objecter的流程,现在看下文件的写入在osd侧的流程。
OSD::ms_fast_dispatch -> OSD::enqueue_op,enqueue_op会把请求入到op_shardedwq的队列中,op_shardedwq是一个按照pg做sharded的多线程的任务队列,其中每个队列的任务也是有多个线程在执行的,相关配置有: osd_op_num_shards、osd_op_num_threads_per_shard。
op_sharededwq里的请求,最终由OSD::ShardedOpWQ::_process来进行处理。
这里用到了boost::static_visitor模式,用这种方式来实现多态。
调用的方法实际上是这个:
void PGQueueable::RunVis::operator()(const OpRequestRef &op) {
return osd->dequeue_op(pg, op, handle);
}
然后是 pg->do_request(op, handle);
在然后void PrimaryLogPG::do_request( OpRequestRef& op, ThreadPool::TPHandle &handle)
注意,在这一步有判断pg的状态,如果pg不是active并且peered的话,请求会加到waiting_for_peered等待队列里,等pg状态正常了才会处理:
if (!is_peered()) {
// Delay unless PGBackend says it's ok
if (pgbackend->can_handle_while_inactive(op)) {
bool handled = pgbackend->handle_message(op);
assert(handled);
return;
} else {
waiting_for_peered.push_back(op);
op->mark_delayed("waiting for peered");
return;
}
}
后面PrimaryLogPG::do_op(OpRequestRef& op)
PrimaryLogPG::execute_ctx
然后这里进行事务相关的处理。
PrimaryLogPG::execute_ctx里会调用prepare_transaction,然后再调用issue_repop,在issue_repop里调用了pgbackend->submit_transaction。