ceph——创建pg

bool OSD::ms_dispatch(Message *m)
|---如果是标记osd down的话,直接返回service.got_stop_ack(), return true
|---如果osd已经已经停止服务,则return true
|---do_waiters()      //list<OpRequestRef> finished 只保存pg创建的请求
    |---dispatch_op(next)
        |---handle_pg_create(op)   //处理新的请求的时候,需要等待创建pg的请求处理完成
|---_dispatch(m)
    |---handle_osd_map(static_cast<MOSDMap*>(m))    //CEPH_MSG_OSD_MAP 创建osd map
        |---
    |---handle_scrub(static_cast<MOSDScrub*>(m));  //MSG_OSD_SCRUB 
        |---
    |---handle_command(static_cast<MCommand*>(m))  //MSG_COMMAND
        |---
    |---osdmap    //MSG_OSD_PG_CREATE,如果是创建pg的前提是osdmap存在
        |---如果osdmap不存在,则waiting_for_osdmap.push_back(op),然后延时执行
    |---dispatch_op(op)    //只处理MSG_OSD_PG_CREATE
        |---handle_pg_create(op)  
            |---

void OSD::handle_pg_create(OpRequestRef op)
|---require_mon_peer //如果不是由MON发过来的消息,则不能执行
|---require_same_or_newer_map  //如果osdmap的epoch比消息中的epoch新,则不能执行
|---op->mark_started()   //op is struct OpRequest : public TrackedOp
    |---OpRequest::mark_flag_point
|---for
    |---如果处于split(分裂)状态,则不用处理
    |---如果已经存在pool,则不用处理
    |---osdmap->pg_to_up_acting_osds(on, &up, &up_primary, &acting, &acting_primary)  //OSDMap.h
        |---void OSDMap::_pg_to_up_acting_osds(
            |---acting_primary 获取主OSD的id
    |---role = osdmap->calc_pg_role   //OSDMap::calc_pg_role
        |---OSDMap::calc_pg_rank    //确定OSD的角色
    |---如果当前osd不是主osd(MON只给主OSD发消息),则不能处理
    |---history.same_primary_since > m->epoch  如果之前处理的最新的epoch比该消息中的epoch新,则不能处理
    |---enqueue_peering_evt
|---op_shardedwq.queue   //入队,等待process处理
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值