Ceph守护进程实现

以Ceph Monitor的守护进程实现为例,源码文件:src/ceph_mon.cc

Preforker prefork;
if (!(flags & CINIT_FLAG_NO_DAEMON_ACTIONS)) {
  if (global_init_prefork(g_ceph_context) >= 0) {
    string err_msg;
    err = prefork.prefork(err_msg);
    if (err < 0) {
      cerr << err_msg << std::endl;
      prefork.exit(err);
    }
    if (prefork.is_parent()) {
        err = prefork.parent_wait(err_msg);
        if (err < 0)
        cerr << err_msg << std::endl;
      prefork.exit(err);
    }
    global_init_postfork_start(g_ceph_context);
  }
  common_init_finish(g_ceph_context);
  global_init_chdir(g_ceph_context);
  if (global_init_preload_erasure_code(g_ceph_context) < 0)
    prefork.exit(1);
}

Ceph对系统的fork调用封装了一个类Preforker,实现比较简单,代码文件是src/common/Preforker.h

可以看到,父进程并没有退出,而是直接进入等待。子进程被创建之后,继续下面的逻辑。因此,Ceph的每个monitor实例会存在两个进程。其实,OSD实例也是一样。

你可能感兴趣的:(Ceph守护进程实现)