global_pre_init

预初始化函数,解析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的配置解析模块。整体读取配置文件,然后按照行进行解析。

global_init

初始化函数

作用:

初始化启动模式.

if (g_ceph_context->get_init_flags() != flags) {

g_ceph_context->set_init_flags(flags);

}

错误信号集处理器加载。

int siglist[] = { SIGPIPE, 0 };

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();

common_init_finish函数

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线程等等。

ceph 初始化函数解析的更多相关文章

  1. java中main函数解析(转载)

    从写java至今,写的最多的可能就是主函数 public static void main(String[] args) {} 但是以前一直都没有问自己,为什么要这么写,因为在c语言中就没有这样子的要 ...

  2. driver_register()函数解析

    driver_register()函数解析 /** * driver_register - register driver with bus * @drv: driver to register *  ...

  3. 第3阶段——内核启动分析之start_kernel初始化函数(5)

    内核启动分析之start_kernel初始化函数(init/main.c) stext函数启动内核后,就开始进入start_kernel初始化各个函数, 下面只是浅尝辄止的描述一下函数的功能,很多函数 ...

  4. java中main函数解析

    从写java至今,写的最多的可能就是主函数 public static void main(String[] args) {} 但是以前一直都没有问自己,为什么要这么写,因为在c语言中就没有这样子的要 ...

  5. C语言指定初始化器解析及其应用

    指定初始化器的概念 C90 标准要求初始化程序中的元素以固定的顺序出现,与要初始化的数组或结构体中的元素顺序相同.但是在新标准 C99 中,增加了一个新的特性:指定初始化器.利用该特性可以初始化指定的 ...

  6. c语言中的c语言中realloc()函数解析

    c语言中realloc()函数解析 真是有点惭愧,这些内容本应该很早就掌握的,以前只是糊里糊涂的用,不知道在内存中具体是怎么回事,现在才弄清楚. realloc(void *__ptr, size_t ...

  7. 大括号之谜:C++的列表初始化语法解析

    有朋友在使用std::array时发现一个奇怪的问题:当元素类型是复合类型时,编译通不过. struct S { int x; int y; }; int main() { int a1[3]{1, ...

  8. CAD调试时抛出“正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码”异常的解决方法

    这些天重装了电脑Win10系统,安装了CAD2012和VS2012,准备进行软件开发.在调试程序的时候,CAD没有进入界面就抛出 “正试图在 os 加载程序锁内执行托管代码.不要尝试在 DllMain ...

  9. 正尝试在 OS 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样...

    出错提示: 正尝试在 OS 加载程序锁内执行托管代码.不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起. 原因分析: .NET2.0中增加了42种非常强大的调试助手 ...

随机推荐

  1. JVM中ClassLoader的学习

    JVM中class loaderの学习 一..class文件和jvm的关系 类的加载 所有的编译生成的.class文件都会被直接加载到JVM里面来吗(并不 首先我们明确一个概念,.class文件加载到 ...

  2. 浅入深出Vue:路由

    路由的概念在计算机界中的历史大概可以追溯到OSI模型中的数据链路层与网络层中的定义.这里的定义大意是:在转发数据包时,根据数据包的目的地址进行寻址,从而将数据包发往指定的目的地. 在 Web开发中同样 ...

  3. 设计模式-模块方法模式(TemplateMethod)

    模块方法模式是行为模式之一,它把具有特定步骤算法中的某些必要的处理委让给抽象方法,通过子类继承对抽象方法的不同实现改变整个算法的行为. UML图: 具体代码: /** * 抽象-模块方法模式核心 */ ...

  4. POJ 2679:Adventurous Driving(SPFA+DFS)

    http://poj.org/problem?id=2679 Adventurous Driving Time Limit: 1000MS   Memory Limit: 65536K Total S ...

  5. 玩转SpringBoot之MyBatisplus自动化构建工具

    使用MyBatisplus自动化构建项目 为什么要用这个? 方便 因为之前那种方式让我用起来不爽了:mybatis逆向工程(MyBatis Generator) 能紧密的贴合mybatis,并且MyB ...

  6. ReentrantLock源码的一点总结

    ReentrantLock 是可重入锁,可重入锁的意思就是同一个线程可以重复获得该锁. 如何做到可重复获得该锁?计数器实现. 第一次加锁,cas比较是不是0,是0设置为1,并设置当前拥有锁的线程: 第 ...

  7. WebSocket+Netty构建web聊天程序

    WebSocket 传统的浏览器和服务器之间的交互模式是基于请求/响应的模式,虽然可以使用js发送定时任务让浏览器在服务器中拉取但是弊端很明显,首先就是不等避免的延迟,其次就是频繁的请求,让服务器的压 ...

  8. 1. Django每日一码 之原生View源码

    2019-7-4  今日源码:原生 View 1.URL中调用as_view方法 def as_view(cls, **initkwargs): """ Main ent ...

  9. python接口自动化(三十四)-封装与调用--函数和参数化(详解)

    简介 前面虽然实现了参数的关联,但是那种只是记流水账的完成功能,不便于维护,也没什么可读性,随着水平和技能的提升,再返回头去看前边写的代码,简直是惨不忍睹那样的代码是初级入门的代码水平都达不到.接下来 ...

  10. Bzoj 2525 [Poi2011]Dynamite

    2525: [Poi2011]Dynamite Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 240  Solved: 120[Submit][Sta ...