osd流程

接上次说到的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。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容