1 介绍
ceph里面的配置文件代码比较繁琐,分析清楚配置代码对未来排查问题大有益处。
2 启动分析
2.1 入口
无论是osd、mgr还是mon等程序都需要加载配置,都有统一的入口,例如ceph-osd.cc在main函数中调用global_init--->global_pre_init函数进行配置的加载。
2.2 env_to_vec分析
split_dashdash把args根据"--"拆分成两段(注意:--不同于--param),前段为类型为vector的options, 后段为类型为vector的arguments。
get_str_vec。把环境变量值取出来:默认的环境变量是"CEPH_ARGS",可以通过参数来指定名字。以空格“ ” 为间隔,把环境变量拆分为一个个字符串到g_str_vec中。
g_str_vec腾挪到env 的vector<const char*>中,同args一样以“--”进行拆分。
分别聚合env和args的options和arguments到args中, 还是以“--”来间隔,无论是options还是arguments,env的参数都在前。
2.3 ceph_argparse_early_args
解析options来获取对应的值:
a) -v 展示version
b) -c 配置文件
c) --cluster cluster
d) -i 非client实体的id (client程序通过-i指定id会无效)
e) --id / --user 设置实体的id,会覆盖-i的选项
f) --name/-n 通过名字来解析设置实体的id, 会覆盖-i 以及 --id/--user
g)--show_args 显示参数 ,但是不会exit
3 配置类分析
3.1 ConfigProxy
配置的代理类,实际是封装了:
a) ConfigValues values;
b) ObserverMgr<md_config_obs_t> obs_mgr;
c) md_config_t config;
3.2 md_config_t
主要包含了配置的元数据, 主要成员有:
1) std::map<std::string, const Option&> schema;
a) 构造函数中通过全局变量ceph_options=build_options()构造,在这个函数里面可以看到很多默认的值
2) std::map<std::string, member_ptr_t> legacy_values;
3.3 Option
主要成员:
-
name:
-
type :参考 type_t {TYPE_UINT, TYPE_INT...}
-
level: 参考level_t {basic, advanced, dev}
3.1 basic: for users, configures some externally visible functional aspect
3.2 advanced: for users, configures some internal behaviour
3.3 Dev: not for users. May be dangerous, may not be documented.
- value_t value; value_t daemon_value;
3.4 ConfigValues
主要成员:
using values_t = std::map<std::string, map<int32_t,Option::value_t>>; // <name, <level, value_t>
values_t values;
3.5 类关系
通过ConfigProxy提供对外的接口:
1、如果是set类接口:先通过md_config_t获取option,通过option获取name、类型、默认值、校验等信息,解析value,最后设置到ConfigValues中。
2、如果是get类接口:
2.1、流程也是从md_config_t到ConfigValues, 如果从ConfigValues不能获取到,则获取Option的默认值
2.2、md_config_t::expand_meta 解析${var}到实际的值
网友评论