本文的所有的分析仅基于个人理解,代码基于ceph nautilus版本
MDSDaemon Start
首先一切的开始自然是mds进程的上电过程:
src/ceph_mds.cc
int main(int argc, const char **argv)
{
// 全局初始化,任何类型ceph daemon启动时都需要调用global_init来完成一些初始化工作
auto cct = global_init(NULL, args,
CEPH_ENTITY_TYPE_MDS, CODE_ENVIRONMENT_DAEMON,
0, "mds_data");
// 初始化堆栈分析器,如果设置了CEPH_HEAP_PROFILER_INIT的环境变量后才会启动,且需要google-perftools才能使用
// 默认情况下是不启动的,后续可以通过ceph tell mds.$name heap start_profiler来启动
ceph_heap_profiler_init();
// 对fork的封装
Preforker forker;
entity_addrvec_t addrs;
pick_addresses(g_ceph_context, CEPH_PICK_ADDRESS_PUBLIC, &addrs);
// Normal startup
if (g_conf()->name.has_default_id()) {
derr << "must specify '-i name' with the ceph-mds instance name" << dendl;
exit(1);
}
if (g_conf()->name.get_id().empty() ||
(g_conf()->name.get_id()[0] >= '0' && g_conf()->name.get_id()[0] <= '9')) {
derr << "MDS id '" << g_conf()->name << "' is invalid. "
"MDS names may not start with a numeric digit." << dendl;
exit(1);
}
// fork子进程并等待子进程退出??
if (global_init_prefork(g_ceph_context) >= 0) {
std::string err;
int r = forker.prefork(err);
if (r < 0) {
cerr << err << std::endl;


1111

被折叠的 条评论
为什么被折叠?



