rados写入一个文件的流程

简单分析下使用librados接口写入一个文件的流程,首先是librados解析配置、和集群建立链接之后,创建一个librados::IoCtx后就可以开始写入文件。入口是librados::IoCtxImpl::write_full这个方法,然后进程objecter相关的逻辑,Objecter::write_full,Objecter::write_full会把相关的请求通过add_data方法加入到 OSDOp的indata里。librados::IoCtxImpl::operate会执行刚才生成的那些op。Objecter::op_submit,然后_op_submit_with_budget,这里会通过objecter_inflight_ops、objecter_inflight_op_bytes这两个配置来进行流控。_op_submit在这个函数里会调用_calc_target来进行这个文件目标位置,注意_calc_target里会判断cache tier的情况,代码如下:

 // apply tiering
 t->target_oid = t->base_oid;
 t->target_oloc = t->base_oloc;
 if ((t->flags & CEPH_OSD_FLAG_IGNORE_OVERLAY) == 0) {
   if (is_read && pi->has_read_tier())
     t->target_oloc.pool = pi->read_tier;
   if (is_write && pi->has_write_tier())
     t->target_oloc.pool = pi->write_tier;
   pi = osdmap->get_pg_pool(t->target_oloc.pool);
   if (!pi) {
     t->osd = -1;
     return RECALC_OP_TARGET_POOL_DNE;
   }
 }

最终Objecter::_send_op会把这个op的请求发送到primary的osd。

流控的逻辑是在Objecter::_op_submit_with_budget体现的:

  if (!op->ctx_budgeted || (ctx_budget && (*ctx_budget == -1))) {
    int op_budget = _take_op_budget(op, sul);
    // take and pass out the budget for the first OP
    // in the context session
    if (ctx_budget && (*ctx_budget == -1)) {
      *ctx_budget = op_budget;
    }
  }
}

上面的代码里的_take_op_budget会做流控
在Objecter::_finish_op里有调用put_op_budget,代码如下:

  if (!op->ctx_budgeted && op->budgeted)
    put_op_budget(op);

刚才Objecter::_send_op会调用 op->session->con->send_message(m);把请求发送到primary的osd上,message的type是CEPH_MSG_OSD_OP。

在Objecter::ms_dispatch里会处理osd返回的结果,对应的函数是Objecter::handle_osd_op_reply。

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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,991评论 19 139
  • 个人自行阅读时候,翻译的文档。因为比较渣,如果有更合理或者错误的地方烦劳告知,我会做修改。Oracle Data ...
    窝窝的小黑屋阅读 1,252评论 0 3
  • 未使用Builder模式 假设有一个Student代表学生类,里面有很多属性,如下: 如果我们需要创建一个Stud...
    剩下的只有自己阅读 377评论 0 1
  • 一直听到别人跟我说这句话— 越长大、越孤单 其实这句话在某些程度上讲,是正确的。很多人都在感叹,为什么传说中的大学...
    乖小孩Charlotte阅读 242评论 0 0
  • 著名的习得性无助实验 程序一:把一条狗放进一个笼子里,锁住笼门使狗无法轻易从笼子里逃出来。而笼子里装有电击装置,通...
    Hi_Yon阅读 584评论 0 0