預初始化函式,解析ceph.conf配置檔案, 初始化定義global_context 和 config的全域性變數.
全域性預初始化函式
cinit_flag_unprivileged_daemon_defaults預設daemon ,相對於下面的選項而言,一般會採用這個.
cinit_flag_no_default_config_file 不去讀config_file
cinit_flag_no_close_stderr 不關閉stderr
cinit_flag_no_daemon_actions :
不生成/var/run/ceph 和 不列印banner .
cinit_flag_defer_drop_privileges 設定rgw 使用者.uid gid
啟動型別:
#define ceph_entity_type_mon 0x01 : monitor
#define ceph_entity_type_mds 0x02 : mds
#define ceph_entity_type_osd 0x04 : osd
#define ceph_entity_type_client 0x08 : client ,rgw閘道器
#define ceph_entity_type_auth 0x20 : 認證授權型別
#define ceph_entity_type_any 0xff
code_environment_utility = 0, 工具
code_environment_daemon = 1, daemon
code_environment_library = 2, 庫
code_environment_utility_nodout = 3, 工具型別沒有stderr的輸出
在該函式中進行了配置檔案的解析,這是ceph的配置解析模組。整體讀取配置檔案,然後按照行進行解析。
初始化函式
作用:初始化啟動模式.
if (g_ceph_context->get_init_flags() != flags) ;
block_signals(siglist, null);
退出時清空log
if (g_conf->log_flush_on_exit)
g_ceph_context->_log->set_flush_on_exit();
如果不是root使用者,如果setuser和setgroup配置了,則將其置為」」
// consider --setuser root a no-op, even if we're not root
if (getuid() != 0) {
if (g_conf->setuser.length()) {
cerr << "ignoring --setuser " << g_conf->setuser << " since i am not root"
<< std::endl;
g_conf->set_val("setuser", "", false, false);
if (g_conf->setgroup.length()) {
cerr << "ignoring --setgroup " << g_conf->setgroup
<< " since i am not root" << std::endl;
g_conf->set_val("setgroup", "", false, false);
設定run_dir的許可權755
if (g_conf->run_dir.length() &&
code_env == code_environment_daemon &&
!(flags & cinit_flag_no_daemon_actions)) {
int r = ::mkdir(g_conf->run_dir.c_str(), 0755);
if (r < 0 && errno != eexist) {
r = -errno;
cerr << "warning: unable to create " << g_conf->run_dir << ": " << cpp_strerror(r) << std::endl;
設定assert中cct.
register_assert_context(g_ceph_context);
設定使用者對run_dir的許可權
if ((flags & cinit_flag_defer_drop_privileges) &&
(g_ceph_context->get_set_uid() || g_ceph_context->get_set_gid())) {
// fix ownership on log files and run directories if needed.
// admin socket files are chown()'d during the common init path _after_
// the service thread has been started. this is sadly a bit of a hack :(
chown_path(g_conf->run_dir,
g_ceph_context->get_set_uid(),
g_ceph_context->get_set_gid(),
g_ceph_context->get_set_uid_string(),
g_ceph_context->get_set_gid_string());
g_ceph_context->_log->chown_log_file(
g_ceph_context->get_set_uid(),
g_ceph_context->get_set_gid());
記憶體洩漏檢測
// test leak checking
if (g_conf->debug_deliberately_leak_memory) {
derr << "deliberately leaking some memory" << dendl;
char *s = new char[1234567];
(void)s;
// cppcheck-suppress memleak
列印banner
if (code_env == code_environment_daemon && !(flags & cinit_flag_no_daemon_actions))
output_ceph_version();
void common_init_finish(cephcontext *cct)
cct->init_crypto();
//初始化壓縮庫
//如果不是cinit_flag_no_daemon_actions 啟動service執行緒。
int flags = cct->get_init_flags(); 主要epoll接收外部的socket訊號。
if (!(flags & cinit_flag_no_daemon_actions))
cct->start_service_thread();
if ((flags & cinit_flag_defer_drop_privileges) &&
(cct->get_set_uid() || cct->get_set_gid())) {
cct->get_admin_socket()->chown(cct->get_set_uid(), cct->get_set_gid());
start_service_thread
說明:service_thread 啟動一些服務類執行緒,比如:socket_admin執行緒和rgwasyncradosprocessor 和asynccompressor::compressor_tp執行緒等等。
建構函式初始化列表和初始化函式
其實並沒有所謂的初始化函式的概念,本文中的初始化函式只是說明在函式體內進行賦值。而初始化列表才是真正意義上的物件初始化。使用初始化列表效率會高一點。c 規定,物件的成員變數的初始化動作發生在進入建構函式本體之前。在建構函式體內只是賦值,並不是初始化。請看下面這個栗子 class base publi...
C 解析和初始化
include include using namespace std 1 父類的屬性,應該有父類的建構函式去初始化 2子類新增加的屬性,應該有子類的建構函式完成 父子分工,很明確 在子類物件構造的時,需要呼叫父類建構函式對其繼承得來的成員進行初始化 在子類物件析構的時,需要呼叫父類析構函式對其繼承...
spring 解析初始化過程
1.xmlbeandefinitionreader 讀取解析檔案 解析encodedresource 編碼,校驗dtd,xsd,可以手動配置,沒有配置自動檢測,檢測方法有沒有doctype resolveentity 本地dtd 檔案頭 publicid systemid 忽略介面 beanname...