mongo源码学习(二)db.cpp之mongoDbMain方法分析
mongo后台进程的入口:mongo/src/mongo/db/dbmain.cpp,wmain(for windows)和main函数,main函数也很简单,就是委托给db.cpp中的mongoDbMain函数来处理。
下面的这段代码就是db.cpp:mongoDbMain的执行过程:
int mongoDbMain(int argc, char* argv[], char** envp) {
// 注册进程关闭时候执行的任务
registerShutdownTask(shutdownTask);
// 设置信号处理器, 比如kill -9 [mongo的pid]
setupSignalHandlers();
// srand函数是随机数发生器的初始化函数。原型:void srand(unsigned int seed);srand和rand()配合使用产生伪随机数序列。
srand(static_cast<unsigned>(curTimeMicros64()));
// 执行全局初始化
Status status = mongo::runGlobalInitializers(argc, argv, envp);
// 判断初始化执行是否成功
if (!status.isOK()) {
// 初始化执行失败了, 打日志, 程序退出
severe(LogComponent::kControl) << "Failed global initialization: " << status;
quickExit(EXIT_FAILURE);
}
try {
// 设置全局的服务上下文, 上下文这个东西真的是脑壳疼, 姑且当作一个存放变量的容器吧
setGlobalServiceContext(ServiceContext::make());
} catch (...) {
auto cause = exceptionToStatus();
severe(LogComponent::kControl) << "Failed to create service context: " << redact(cause);
quickExit(EXIT_FAILURE);
}
// 获取全局服务的上下文
auto service = getGlobalServiceContext();
// 设置Replication, replication是复制的意思
setUpReplication(service);
// 设置服务的入口点, 客户端对服务器的访问走的是入口点
service->setServiceEntryPoint(std::make_unique<ServiceEntryPointMongod>(service));
// 这个不知道是什么意思
ErrorExtraInfo::invariantHaveAllParsers();
// 启动时的配置动作, argv就是我们启动mongo时候的配置参数
startupConfigActions(std::vector<std::string>(argv, argv + argc));
cmdline_utils::censorArgvArray(argc, argv);
// 初始化服务的全局状态
if (!initializeServerGlobalState(service))
quickExit(EXIT_FAILURE);
// Per SERVER-7434, startSignalProcessingThread must run after any forks (i.e.
// initializeServerGlobalState) and before the creation of any other threads
// 启动信号处理进行, 上面的官方注释说的是这个函数的执行有先后顺序
startSignalProcessingThread();
#if defined(_WIN32)
if (ntservice::shouldStartService()) {
ntservice::startService();
// exits directly and so never reaches here either.
}
#endif
// 执行启动的测试, 我猜的是检查启动是否有啥异常
StartupTest::runTests();
// 初始化以及监听, 前面都是一些准备动作, 这里是真的要开始监听了, 监听成功就可以接受请求, 然后处理各种CRUD, 执行各种命令了
ExitCode exitCode = initAndListen(serverGlobalParams.port);
exitCleanly(exitCode);
return ;
}
上面的代码读起来还是没有啥太大难度,就是做了一些启动的初始化以及准备工作,然后打开监听开始接收请求。现在我还没有管每个里面是怎么具体执行,接下来我比较感兴趣的是,从客户端的请求是怎么来到入口点的。
mongo源码学习(二)db.cpp之mongoDbMain方法分析的更多相关文章
- mongo源码学习(三)请求接收传输层
在上一篇博客中(mongo源码学习(二)db.cpp之mongoDbMain方法分析),我们把db.cpp中的mongoDbMain的执行过程分析了一下,最后会调用initAndListen(serv ...
- mongo源码学习(四)服务入口点ServiceEntryPoint
在上一篇博客mongo源码学习(三)请求接收传输层中,稍微分析了一下TransportLayer的作用,这篇来看下ServiceEntryPoint是怎么做的. 首先ServiceEntryPoint ...
- Dubbo源码学习(二)
@Adaptive注解 在上一篇ExtensionLoader的博客中记录了,有两种扩展点,一种是普通的扩展实现,另一种就是自适应的扩展点,即@Adaptive注解的实现类. @Documented ...
- python 协程库gevent学习--gevent源码学习(二)
在进行gevent源码学习一分析之后,我还对两个比较核心的问题抱有疑问: 1. gevent.Greenlet.join()以及他的list版本joinall()的原理和使用. 2. 关于在使用mon ...
- Vue源码学习二 ———— Vue原型对象包装
Vue原型对象的包装 在Vue官网直接通过 script 标签导入的 Vue包是 umd模块的形式.在使用前都通过 new Vue({}).记录一下 Vue构造函数的包装. 在 src/core/in ...
- 以太坊 layer2: optimism 源码学习(二) 提现原理
作者:林冠宏 / 指尖下的幽灵.转载者,请: 务必标明出处. 掘金:https://juejin.im/user/1785262612681997 博客:http://www.cnblogs.com/ ...
- mybatis源码学习:一级缓存和二级缓存分析
目录 零.一级缓存和二级缓存的流程 一级缓存总结 二级缓存总结 一.缓存接口Cache及其实现类 二.cache标签解析源码 三.CacheKey缓存项的key 四.二级缓存TransactionCa ...
- Netty源码学习系列之4-ServerBootstrap的bind方法
前言 今天研究ServerBootstrap的bind方法,该方法可以说是netty的重中之重.核心中的核心.前两节的NioEventLoopGroup和ServerBootstrap的初始化就是为b ...
- mongo源码学习(一)
在git上把mongo的源码给拉下来了,然后目录大概是这样的: 这个mongo是用C++写的,编译并没有用Makefile而是用的scons工具,这个好像是python写的. mongo后台进程的入口 ...
随机推荐
- 跟我学SharePoint 2013视频培训课程——理解SharePoint网站的体系结构(3)
课程简介 第三天,理解SharePoint 2013 网站的体系结构 视频 SharePoint 2013 交流群 41032413
- [转]Filter 过滤器
1.简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 ...
- [转]IC行业的牛人
转载的: 说来惭愧,我所了解的牛人也只是大学教授,工业界的高手了解的还太少,虽然我对教育界的牛人了解的也不多,但这里也要牢骚几句,论坛上的人好像只是认识Gray,Razavi,Allen,Lee, ...
- 转 分享我在阿里工作十年接触过Java框架设计模式
转 原文: 分享我在阿里工作十年接触过Java框架设计模式 一.前言 说起来设计模式,大家应该都耳熟能详,设计模式代表了软件设计的最佳实践,是经过不断总结提炼出来的代码设计经验的分类总结,这些模式或者 ...
- 阮一峰 IaaS,PaaS,SaaS 的区别
链接: IaaS,PaaS,SaaS 的区别 作者: 阮一峰 日期: 2017年7月23日 越来越多的软件,开始采用云服务. 云服务只是一个统称,可以分成三大类. IaaS:基础设施服务,Infras ...
- CentOS中安装JAVA环境
好消息, 程序员专用早餐机.和掌柜说 ideaam,可以节省20元. 点击链接 或復·制这段描述¥k3MbbVKccMU¥后到淘♂寳♀ 一般情况下,我们都要将linux自带的OPENJDK卸载掉, ...
- ansible 视频学习
ansible 视频地址 https://ninghao.net/video/4040
- MySql(九):MySQL性能调优——Schema设计的性能优化
一.高效的模型设计 先了解下数据库设计的三大范式 第一范式:要求有主键,并且要求每一个字段原子性不可再分 第二范式:要求所有非主键字段完全依赖主键,不能产生部分依赖 第三范式:所有非主键字段和主键字段 ...
- 什么是内联函数(inline function)
In C, we have used Macro function an optimized technique used by compiler to reduce the execution ti ...
- vivado烧写bin文件到flash 中
点击 bitstream setting ,将 bin_file 勾上,点击 OK. 2)点击 generate bitstream ,生成 bit 文件和 bin 文件 3)点击 open hard ...