ceph 初始化函式解析

2022-08-03 13:33:18 字數 4049 閱讀 5294

預初始化函式,解析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...