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方法分析的更多相关文章

  1. mongo源码学习(三)请求接收传输层

    在上一篇博客中(mongo源码学习(二)db.cpp之mongoDbMain方法分析),我们把db.cpp中的mongoDbMain的执行过程分析了一下,最后会调用initAndListen(serv ...

  2. mongo源码学习(四)服务入口点ServiceEntryPoint

    在上一篇博客mongo源码学习(三)请求接收传输层中,稍微分析了一下TransportLayer的作用,这篇来看下ServiceEntryPoint是怎么做的. 首先ServiceEntryPoint ...

  3. Dubbo源码学习(二)

    @Adaptive注解 在上一篇ExtensionLoader的博客中记录了,有两种扩展点,一种是普通的扩展实现,另一种就是自适应的扩展点,即@Adaptive注解的实现类. @Documented ...

  4. python 协程库gevent学习--gevent源码学习(二)

    在进行gevent源码学习一分析之后,我还对两个比较核心的问题抱有疑问: 1. gevent.Greenlet.join()以及他的list版本joinall()的原理和使用. 2. 关于在使用mon ...

  5. Vue源码学习二 ———— Vue原型对象包装

    Vue原型对象的包装 在Vue官网直接通过 script 标签导入的 Vue包是 umd模块的形式.在使用前都通过 new Vue({}).记录一下 Vue构造函数的包装. 在 src/core/in ...

  6. 以太坊 layer2: optimism 源码学习(二) 提现原理

    作者:林冠宏 / 指尖下的幽灵.转载者,请: 务必标明出处. 掘金:https://juejin.im/user/1785262612681997 博客:http://www.cnblogs.com/ ...

  7. mybatis源码学习:一级缓存和二级缓存分析

    目录 零.一级缓存和二级缓存的流程 一级缓存总结 二级缓存总结 一.缓存接口Cache及其实现类 二.cache标签解析源码 三.CacheKey缓存项的key 四.二级缓存TransactionCa ...

  8. Netty源码学习系列之4-ServerBootstrap的bind方法

    前言 今天研究ServerBootstrap的bind方法,该方法可以说是netty的重中之重.核心中的核心.前两节的NioEventLoopGroup和ServerBootstrap的初始化就是为b ...

  9. mongo源码学习(一)

    在git上把mongo的源码给拉下来了,然后目录大概是这样的: 这个mongo是用C++写的,编译并没有用Makefile而是用的scons工具,这个好像是python写的. mongo后台进程的入口 ...

随机推荐

  1. 探索MVP(Model-View-Presenter)设计模式在SharePoint平台下的实现

    对于SharePoint Developers来说,往往会过多的去关注SharePoint平台和工具,而把设计模式和代码的可测试性放在了一个较低的优先级.这并不是说SharePoint Develop ...

  2. javascript 中的==(相等运算符)与===(等同运算符)比较

    javascript 中的==(相等运算符)与===(等同运算符)比较:(1)==用于一般比较,===用于严格比较,(2)==在比较的时候可以转换数据类型,===严格比较,只要类型不匹配就返回flas ...

  3. Nginx 通过certbot 配置let's encrypt 证书 【转载,整理】

    重要目录:/usr/local/certbot,/var/log/letencrypt,/etc/letencrypt

  4. laravel用redis保存session遇到的坑,没报错,但redis-cli就是查不到

    laravel用redis保存session遇到的坑, 配置redis存储session流程是这样的 在.evn文件中把session驱动和连接改为了redis的 如下: SESSION_DRIVER ...

  5. CSS父元素高度随子元素高度变化而变化

    <html> <body> <head> <style> #menu{width:1000px;overfloat:hidden;} /* width: ...

  6. 快速开方法(c语言)译文

    人们最早就在Quake3源代码中发现了类似如下的C代码,它可以快速的求1/sqrt(x),在3D图形向量计算方面应用很广. float invSqrt(float x) { float xhalf = ...

  7. Fiddlercore Demo - Fiddler

    public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Loa ...

  8. android源码编译-Mac 10.11 xcode5.1.1

    第一步: 参考官网:创建一个dmg,大小80g,这个要尽量大一点,40g感觉不够用:http://source.android.com/source/initializing.html 第二步:下载a ...

  9. C++对象模型-构造函数语意学

    关于C++,最常听到的一个抱怨就是:编译器背着程序员干了太多的事情. default constructor函数的构建 default constructors会在需要的时候被编译器创建出来,关键字是 ...

  10. vue-cli+webpack在生成的项目中使用bootstrap方法(二)

    vue-cli+webpack在生成的项目中使用bootstrap方法(一)中,是通过手动下载bootstrap库,然后手动添加到src/assets中,显然是过程太多. 当然是可以更省力些,可以通过 ...