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后台进程的入口 ...
随机推荐
- 豆瓣上9分以上的IT书籍-编程技术篇
在豆瓣上9分以上的IT书籍-编程语言篇中,收集了很多优秀的编程语言书籍,也得到了不少读者的喜欢.不过也有一些读者留言说某某书为什么没有,一种是因为某些书并不算讲某种编程语言的,一种是由于豆瓣9分以上这 ...
- Jedis工具类(含分布式锁的调用和释放)
个人把工具类分为两部分: 一.连接池部分 import org.slf4j.Logger; import org.slf4j.LoggerFactory; import redis.clients.j ...
- Raid介绍
https://wsgzao.github.io/post/raid/ http://www.cnblogs.com/Bob-FD/p/3409221.html
- java文件传输接口
开发的时候碰到这样的需求:需要在一个系统(客户端发送请求)中将文件传输至另外一个系统(服务端接收)中去的实现方式,可以批量传输文件,代码如下: 客户端请求: public String upLoadF ...
- 使用 NodeJS + Express 從 GET/POST Request 取值 -摘自网络
過去無論哪一種網站應用程式的開發語言,初學者教學中第一次會提到的起手式,八九不離十就是 GET/POST Request 的取值.但是,在 Node.js + Express 的世界中,彷彿人人是高手 ...
- 使用 Swagger 文档化和定义 RESTful API
大部分 Web 应用程序都支持 RESTful API,但不同于 SOAP API——REST API 依赖于 HTTP 方法,缺少与 Web 服务描述语言(Web Services Descript ...
- 运行jar乱码问题
请使用 1.java -jar -Dfile.encoding=utf-8 dapao.jar 2.请使用URLDecode,URLEncode 3.请使用unicode编码格式 bat运行当前目录 ...
- 为jqgrid添加统计金额页脚
为jqgrid增加自定义用户数据 设计统计的金额总和 最后在jgrid组件中添加 最后的效果为:
- webBrowser获取取Cookie不全的解决方法
//取当前webBrowser登录后的Cookie值 [DllImport("wininet.dll", CharSet = CharSet.Auto, Set ...
- centos安装man中文手册
第一步下载man中文手册压缩包 //下载 wget http://pkgs.fedoraproject.org/repo/pkgs/man-pages-zh-CN/manpages-zh-1.5.1. ...