osd流程

作者: andyzyao | 来源:发表于2017-06-08 10:52 被阅读0次

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

    相关文章

      网友评论

          本文标题:osd流程

          本文链接:https://www.haomeiwen.com/subject/vemzfxtx.html