1、ceph16.2.12 ceph-mon调试启动过程

ceph_mon.cc的main函数开始打好断点

void argv_to_vec(int argc, const char **argv,
                 std::vector<const char*>& args)
{
  args.insert(args.end(), argv + 1, argv + argc);
}

将 argv 数组中的参数转换成 char 类型的 vector,存储在 args 指向的 vector 中。

使用了 C++ STL 中的 vector 和 insert 函数,将从 argv + 1 到 argv + argc 的参数插入到 args 数组的尾部。这里 +1 是因为第一个参数通常是程序的名称

if (ceph_argparse_flag(args_copy, i, "--mkfs", (char*)NULL)) {flags |= CINIT_FLAG_NO_DAEMON_ACTIONS;
     } else if (ceph_argparse_witharg(args_copy, i, &val, "--inject_monmap", (char*)NULL)) {flags |= CINIT_FLAG_NO_DAEMON_ACTIONS;
     } else if (ceph_argparse_witharg(args_copy, i, &val, "--extract-monmap", (char*)NULL)) {flags |= CINIT_FLAG_NO_DAEMON_ACTIONS;
     }

使用了 ceph_argparse_flag 函数来判断是否出现了 "--mkfs" 参数,如果出现了,则说明要进行文件系统的创建,于是将 flags 变量的某一位设为 1,代表不需要执行守护程序操作。

当出现了 "--inject_monmap" 或 "--extract-monmap" 这两个参数时,也将 flags 变量中的某一位设置为 1,表示不需要执行守护程序操作。

// don't try to get config from mon cluster during startup flags |= CINIT_FLAG_NO_MON_CONFIG;

Ceph 初始化过程中不尝试从 MON 集群获取配置信息

->调用global_init 开始------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

->调用global_pre_init开始-----------------------------------------------------------------------------------------------------------------------------------------------

->调用common_preinit初始化一个CephContext,这里面最主要的是下面代码 开始

// Create a configuration object CephContext *cct = new CephContext(iparams.module_type, code_env, flags);

主要功能是创建各种组件实例并进行注册

如,

创建了一个 logging::Log 实例,将一个 LogObs 对象作为空间日志观察者注册到 _conf 对象中,在配置改变时接收通知并更新 logging::Log。

创建了一个 CephContextObs 对象作为 Ceph 配置观察者,

创建一个 LockdepObs 对象作为锁依赖观察者,在系统进入死锁时给出帮助信息。

创建了一个 PerfCountersCollection 对象

AdminSocket 对象(用于处理 Ceph 管理命令)并注册了一堆命令,如下图

HeartbeatMap 对象(用于处理心跳)、

PluginRegistry 对象(用于管理各种插件)

最后,调用 lookup_or_create_singleton_object 函数,用于将一个 MempoolObs 实例注册为单例对象,以观察 Ceph 系统中的内存池(mempools)使用情况。

->调用common_preinit初始化一个CephContext,这里面最主要的是下面代码 结束

int ret = conf.parse_config_files(c_str_or_null(conf_file_list),&cerr, flags);

里面主要解析配置文件的是如下代码

int
md_config_t::parse_buffer(ConfigValues& values,
              const Confi
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值