mongo配置文件是mongod.conf,如果是linux系统apt安装,默认的路径是/etc/mongod.conf。mongod启动命令手动指定路径mongod --config /etc/mongod.conf。
mongod.conf配置文件常见的配置参数有net.port: 27017,storage.dbPath: /var/lib/mongodb,storage.engine: wiredTiger。
mongod启动命令也可以手动指定参数mongod --port 27017 --dbpath /data/mongodb。
mongod参数(端口、数据路径dbpath 等)可以在多个地方设置,mongod到底以哪个优先级高?哪个起作用呢?
mongod启动入口db.cpp流程是:main-> mongoDbMain -> mongo::runGlobalInitializers。runGlobalInitializers 的主要作用是在 MongoDB 服务器启动过程中,初始化各种全局资源和模块。它确保了在数据库实例开始处理客户端请求之前,所有必要的初始化工作都已完成,包括内存管理、日志系统、网络组件等的初始化。
#if defined(_WIN32)
int wmain(int argc, wchar_t* argvW[], wchar_t* envpW[]) {
mongo::WindowsCommandLine wcl(argc, argvW, envpW);
std::cout << "conca " << " this is win32..." ;
int exitCode = mongo::mongoDbMain(argc, wcl.argv(), wcl.envp());
mongo::quickExit(exitCode);
}
#else
int main(int argc, char* argv[], char** envp) {
int exitCode = mongo::mongoDbMain(argc, argv, envp);
mongo::quickExit(exitCode);
}
#endif
int mongoDbMain(int argc, char* argv[], char** envp) {
registerShutdownTask(shutdownTask);
setupSignalHandlers();
srand(static_cast<unsigned>(curTimeMicros64()));
std::cout << "conca setupSignalHandlers" << std::endl;
Status status = mongo::runGlobalInitializers(argc, argv, envp);
std::cout << "conca mongo::runGlobalInitializers" << std::endl;
}
/mongo/base/initializer.cpp,Initializer的依赖管理类。这个类最主要的作用的就是解决初始化组件先后顺序。比如A依赖B,那么在执行A的时候需要先执行 B
Status runGlobalInitializers(int argc, const char* const* argv, const char* const* envp) {
InitializerContext::ArgumentVector args(argc);
std::copy(argv, argv + argc, args.begin());
InitializerContext::EnvironmentMap env;
if (envp) {
for (; *envp; ++envp) {
const char* firstEqualSign = strchr(*envp, '=');
if (!firstEqualSign) {
return Status(ErrorCodes::BadValue, "malformed environment block");
}
env[std::string(*envp, firstEqualSign)] = std::string(firstEqualSign + 1);
}
}
return runGlobalInitializers(args, env);
}
Status runGlobalInitializers(const InitializerContext::ArgumentVector& args,
const InitializerContext::EnvironmentMap& env) {
return getGlobalInitializer().executeInitializers(args, env);
}
/mongo/base/global_initializer.cpp
Initializer& getGlobalInitializer() {
static Initializer theGlobalInitializer;
return theGlobalInitializer;
}
executeInitializers负责按照依赖关系执行所有注册的初始化器。调用 _graph.topSort 对初始化器依赖图进行拓扑排序,确保初始化器按正确的依赖顺序执行。
创建 InitializerContext 对象,用于传递参数和环境信息给初始化函数。
遍历每个节点:按拓扑排序结果依次处理每个节点;跳过已初始化的节点;检查节点是否有初始化函数,若没有则返回错误;
调用初始化函数,并处理可能抛出的数据库异常;若初始化函数执行失败,返回错误状态;若初始化成功,将节点标记为已初始化;
Status Initializer::executeInitializers(const InitializerContext::ArgumentVector& args,
const InitializerContext::EnvironmentMap& env) {
std::vector<std::string> sortedNodes;
Status status = _graph.topSort(&sortedNodes);
if (Status::OK() != status)
return status;
InitializerContext context(args, env);
for (size_t i = 0; i < sortedNodes.size(); ++i) {
std::cout << "conca sortedNodes["<< i <<"]: " << sortedNodes[i] << std::endl;
InitializerDependencyNode* node = _graph.getInitializerNode(sortedNodes[i]);
// If already initialized then this node is a legacy initializer without re-initialization
// support.
if (node->isInitialized())
continue;
auto const& fn = node->getInitializerFunction();
if (!fn) {
return Status(ErrorCodes::InternalError,
"topSort returned a node that has no associated function: \"" +
sortedNodes[i] + '"');
}
try {
status = fn(&context);
} catch (const DBException& xcp) {
return xcp.toStatus();
}
if (Status::OK() != status)
return status;
node->setInitialized(true);
}
return Status::OK();
}
打印出每个节点具体初始化类,std::cout << "conca sortedNodes["<< i <<"]: " << sortedNodes[i] << std::endl;
打印了400个函数,请注意第85个函数:conca sortedNodes[85]: StartupOptions_Parse,解析参数函数
conca sortedNodes[0]: RegisterErrorExtraInfoForJSExceptionInfo
conca sortedNodes[1]: OIDGeneration
conca sortedNodes[2]: ValidateLocale
conca sortedNodes[3]: RegisterErrorExtraInfoForStaleDbRoutingVersion
conca sortedNodes[4]: OptionsParseUseStrict
conca sortedNodes[5]: EnableVersionInfo
conca sortedNodes[6]: LoadICUData
conca sortedNodes[7]: GlobalLogManager
conca sortedNodes[8]: TcmallocConfigurationDefaults
conca sortedNodes[9]: BeginServerParameterRegistration
conca sortedNodes[10]: idl_1bb39f92e275eb74aff8021ded075865feb7238a
conca sortedNodes[11]: idl_d19b31960fb45750777a81561bfde91056eb2bd0
conca sortedNodes[12]: idl_5003e181d12e034efe5a4ba5ca1bb1abebb96cda
conca sortedNodes[13]: idl_47322fe18df7894bc662bd7c55c6f0be8aa37c43
conca sortedNodes[14]: idl_4a4040f4f1d46436f017119d996cf313ca5e73ba
conca sortedNodes[15]: idl_1cedc99fabceb96b870a29891061a9399ce9881d
conca sortedNodes[16]: idl_bb7993b0c90b6b2629e378dfd88575ca0049ef7f
conca sortedNodes[17]: idl_5f995c9e532682907ecf6de561a1ef7854e056fd
conca sortedNodes[18]: idl_43d4ca86eda1d8935717c5b47ead487b5ef931d9
conca sortedNodes[19]: idl_42d839f9da6af67ecf6311443772bf007241c38e
conca sortedNodes[20]: idl_7e41a7d3101a9eccf67b3f8da1ec7e7915fb69a5
conca sortedNodes[21]: idl_0e324fb270d0dc1abee4b210883bf4af4be39278
conca sortedNodes[22]: idl_202200dfd83a2b867ca338025844dec7de819b45
conca sortedNodes[23]: idl_ce5e0aa5bef218299c1fa4f49b3d1c77feaed90f
conca sortedNodes[24]: idl_a99f9bf08721834679bf2dd7b5ba395bd9c0501a
conca sortedNodes[25]: idl_48dc1e3752e5ce279f0f3578b4368a98e687172a
conca sortedNodes[26]: idl_bc61ef02ecf5881e52820dcd513438ce23b48d27
conca sortedNodes[27]: idl_8e50acf40a35f01e97bf43b210bd689bd38d1fd5
conca sortedNodes[28]: idl_4fba5585dd650379beb7da79494ffdef61084aff
conca sortedNodes[29]: idl_04d883c8528a53efbc77b1d992d772881a31c2e1
conca sortedNodes[30]: idl_6f9217d659be8dc4c35221ccd2fec12841744571
conca sortedNodes[31]: idl_905720127adf85022538db8bcccbdd80953abffe
conca sortedNodes[32]: idl_5de512b2c698a0618a7ffc69efde27e3b4e5ae8f
conca sortedNodes[33]: idl_dab8c7d3d630154b7836f7887c1e546f26cb9e07
conca sortedNodes[34]: idl_9f9852bf8c7821940266b14ab747993125c57886
conca sortedNodes[35]: idl_8ca33f361b0621cd3831637dfaadf09a52d75e2c
conca sortedNodes[36]: idl_0f4ff67704659a8aecb5278d23668d0561d2d29b
conca sortedNodes[37]: idl_b459675858de95f9188218143ac24a3c06455048
conca sortedNodes[38]: idl_8ddc250dbb1c12b1430c218ab90a19f202a22596
conca sortedNodes[39]: idl_6466812a9192ce7fb46ce034080129dde2b6b3e3
conca sortedNodes[40]: idl_2d027c0f06ff60334b8c977697f76a27b3b6872d
conca sortedNodes[41]: idl_c325e5775ad1b65651b63414b494e1bbc482e962
conca sortedNodes[42]: idl_7ffdacdacfd04bf86d553bc3bd3458d88773deb4
conca sortedNodes[43]: idl_54f8f7a0f1900bb57ff5770bc33ad13edb7c7d3b
conca sortedNodes[44]: idl_4d26969e448611fed5050eaa46663f1ceff8c9e9
conca sortedNodes[45]: idl_1688f48a0e9ad541fed4cfdbedbcc46c200daaec
conca sortedNodes[46]: idl_ecb07a8437f03ceb4fe24aa53669f33cffc782fe
conca sortedNodes[47]: idl_6176655f93594b3ee86e7c012ba75f1294a73a58
conca sortedNodes[48]: idl_dace9dc014df744013e94bb85aa8354358cc5390
conca sortedNodes[49]: idl_aa629c1d5e7ce5614728bd1d4f3e04442ceffe4e
conca sortedNodes[50]: idl_f1c34760c430b0f964e6038f6c54226c173e6265
conca sortedNodes[51]: idl_b4cee05cbe7cb02eb0d202d8f47939e2d1bca196
conca sortedNodes[52]: idl_00f530d5d6eec2fd73d1b0b17c85c58438bf160b
conca sortedNodes[53]: idl_8e3863b0202e12fb8c8306d9da3f1be4fb06a388
conca sortedNodes[54]: idl_37c24b9a7239f7fd2d08c68708438c4221821321
conca sortedNodes[55]: idl_d65e863dd5fd6712a543d4563d77f8c55602d6b9
conca sortedNodes[56]: idl_abacb19e07e7490c3007cf8665de157e7167fb93
conca sortedNodes[57]: idl_10de0d47878949f4ef424237b9c0a37247c4113e
conca sortedNodes[58]: idl_36d28736d35580e6e74eb5c6ba4521de1ae46d76
conca sortedNodes[59]: idl_9efce71c8b97b064552b82f56e87b6dbfd3bdfa0
conca sortedNodes[60]: idl_3b9508fab768588483ab14f4f15556d8043cd16a
conca sortedNodes[61]: idl_7cb0d331a6ea6e908743e23105ee120202a6e968
conca sortedNodes[62]: idl_cd2f134060cbbb0f81278968ffb673db6d49b2fa
conca sortedNodes[63]: idl_0b45f128feb728345b7b4b08f1b43ce0cec1d46c
conca sortedNodes[64]: idl_d1e6616d0623fa7d56bedf369dba264299090c32
conca sortedNodes[65]: idl_84e42c5cf081c4abd41d2e3bccc88792de5ef166
conca sortedNodes[66]: idl_7e061f03f93b157be49f3f9964a343bd7376e5d5
conca sortedNodes[67]: idl_fa997c98ba838b297ed772cb9690fb529e43425c
conca sortedNodes[68]: idl_bbbe7c9d9b0ab52d9cad6eeff4857bac156d2b45
conca sortedNodes[69]: EndServerParameterRegistration
conca sortedNodes[70]: BeginStartupOptionHandling
conca sortedNodes[71]: BeginStartupOptionRegistration
conca sortedNodes[72]: BeginGeneralStartupOptionRegistration
conca sortedNodes[73]: MongodOptions_Register
conca sortedNodes[74]: EndGeneralStartupOptionRegistration
conca sortedNodes[75]: BeginModuleStartupOptionRegistration
conca sortedNodes[76]: idl_c5bbf443cc92544496ec264163a5abf7844bf6d5_Register
conca sortedNodes[77]: idl_ff0d31d3a91241e3e48b0acf07e7e8553c65eba4_Register
conca sortedNodes[78]: idl_4feea06edab5ab9a9e31140b44e901bd5dca3ff7_Register
conca sortedNodes[79]: idl_6176655f93594b3ee86e7c012ba75f1294a73a58_Register
conca sortedNodes[80]: idl_2eb348f9af5be0f77ad3c59e0ae2febc206c1d79_Register
conca sortedNodes[81]: SSLServerOptionsIDL_Register
conca sortedNodes[82]: EndModuleStartupOptionRegistration
conca sortedNodes[83]: EndStartupOptionRegistration
conca sortedNodes[84]: BeginStartupOptionParsing
conca sortedNodes[85]: StartupOptions_Parse
conca parser.run. options_parser_init.cpp
conca parser.run. transformImplicitOptions
conca parser.run. parseCommandLine
conca parser.run. key(config)
conca parser.run. addDefaultValues
conca sortedNodes[86]: EndStartupOptionParsing
conca sortedNodes[87]: BeginStartupOptionValidation
conca sortedNodes[88]: SSLServerOptions_Validate
conca sortedNodes[89]: AllFailPointsRegistered
conca sortedNodes[90]: MongodOptions
conca sortedNodes[91]: EndStartupOptionValidation
conca sortedNodes[92]: OutputConfig
conca sortedNodes[93]: GatherReadctionOptions
conca sortedNodes[94]: BeginStartupOptionSetup
conca sortedNodes[95]: ServerOptions_Setup
conca sortedNodes[96]: EndStartupOptionSetup
conca sortedNodes[97]: BeginStartupOptionStorage
conca sortedNodes[98]: CoreOptions_Store
conca sortedNodes[99]: FreeMonitoringOptions_Store
conca sortedNodes[100]: SSLServerOptionsIDL_Store
conca sortedNodes[101]: idl_ff0d31d3a91241e3e48b0acf07e7e8553c65eba4_Store
conca sortedNodes[102]: StoreSASLOptions
conca sortedNodes[103]: WiredTigerOptions_Store
conca sortedNodes[104]: EndStartupOptionStorage
conca sortedNodes[105]: BeginPostStartupOptionStorage
conca sortedNodes[106]: SetTargetSnapshotWindowSize_Post
conca sortedNodes[107]: SSLServerOptions_Post
conca sortedNodes[108]: EndPostStartupOptionStorage
conca sortedNodes[109]: EndStartupOptionHandling
conca sortedNodes[110]: ForkServer
conca sortedNodes[111]: RegisterErrorExtraInfoForNestedErrorExtraInfoExample
conca sortedNodes[112]: RegisterErrorExtraInfoForDuplicateKeyErrorInfo
conca sortedNodes[113]: ServerLogRedirection
conca sortedNodes[114]: RegisterErrorExtraInfoForCannotImplicitlyCreateCollectionInfo
conca sortedNodes[115]: RegisterErrorExtraInfoForWouldChangeOwningShardInfo
conca sortedNodes[116]: RegisterErrorExtraInfoForStaleConfigInfo
conca sortedNodes[117]: RegisterErrorExtraInfoForResolvedView
conca sortedNodes[118]: RegisterErrorExtraInfoForErrorExtraInfoExample
conca sortedNodes[119]: default
conca sortedNodes[120]: addToExpressionParserMap_floor
conca sortedNodes[121]: addToGranularityRounderMap_R80
conca sortedNodes[122]: addToExpressionParserMap_max
conca sortedNodes[123]: addToExpressionParserMap_setEquals
conca sortedNodes[124]: addToExpressionParserMap_meta
conca sortedNodes[125]: CreateSASLServerMechanismRegistry
conca sortedNodes[126]: class mongo::SCRAMServerFactory<class mongo::SaslSCRAMServerMechanism<struct mongo::SCRAMSHA1Policy> >
conca sortedNodes[127]: fsyncLockedForWriting
conca sortedNodes[128]: addToExpressionParserMap_abs
conca sortedNodes[129]: setSSLManagerType
conca sortedNodes[130]: addToExpressionParserMap__internalJsEmit
conca sortedNodes[131]: addToExpressionParserMap_cmp
conca sortedNodes[132]: addToDocSourceParserMap_collStats
conca sortedNodes[133]: addToExpressionParserMap_eq
conca sortedNodes[134]: addToExpressionParserMap_split
conca sortedNodes[135]: RegisterTestCommand_StageDebugCmd
conca sortedNodes[136]: addToExpressionParserMap_atan
conca sortedNodes[137]: addToExpressionParserMap_toString
conca sortedNodes[138]: addToGranularityRounderMap_R40
conca sortedNodes[139]: SSLManager
conca sortedNodes[140]: SSLManagerLogger
conca sortedNodes[141]: CreateDiagnosticDataCommand
conca sortedNodes[142]: ModifierTable
conca sortedNodes[143]: RegisterTestCommand_EchoCommand
conca sortedNodes[144]: addToExpressionParserMap_dateFromParts
conca sortedNodes[145]: addToAccumulatorFactoryMap_first
conca sortedNodes[146]: SecureAllocator
conca sortedNodes[147]: addToExpressionParserMap_strLenCP
conca sortedNodes[148]: RegisterTestCommand_FaultInjectCmd
conca sortedNodes[149]: InitializeSchannelGetServerIdentityFn
2025-04-21T21:03:42.987+0800 D1 CONTROL [main] Loading library: Schannel.dll
conca sortedNodes[150]: addToDocSourceParserMap_set
conca sortedNodes[151]: addToExpressionParserMap_toDouble
conca sortedNodes[152]: addToAccumulatorFactoryMap_stdDevPop
conca sortedNodes[153]: addAliasToDocSourceParserMap_changeStream
conca sortedNodes[154]: addToExpressionParserMap_regexMatch
conca sortedNodes[155]: addToDocSourceParserMap_planCacheStats
conca sortedNodes[156]: addToExpressionParserMap_ifNull
conca sortedNodes[157]: addToExpressionParserMap_const
conca sortedNodes[158]: addToExpressionParserMap_year
conca sortedNodes[159]: addToExpressionParserMap_gt
conca sortedNodes[160]: Behaviors_Win32
conca sortedNodes[161]: addToGranularityRounderMap_E24
conca sortedNodes[162]: addToExpressionParserMap_not
conca sortedNodes[163]: addToExpressionParserMap_sin
conca sortedNodes[164]: addToExpressionParserMap_concat
conca sortedNodes[165]: EnsureIosBaseInitConstructedV2
conca sortedNodes[166]: RegisterTestCommand_EmptyCapped
conca sortedNodes[167]: RegisterStorageClientObserverConstructor
conca sortedNodes[168]: addToDocSourceParserMap_facet
conca sortedNodes[169]: addToExpressionParserMap_cos
conca sortedNodes[170]: addToExpressionParserMap_mergeObjects
conca sortedNodes[171]: addToExpressionParserMap_switch
conca sortedNodes[172]: RegisterBiggieEngine
conca sortedNodes[173]: addToExpressionParserMap_size
conca sortedNodes[174]: SnappyMessageCompressorInit
conca sortedNodes[175]: addToDocSourceParserMap_lookup
conca sortedNodes[176]: addToDocSourceParserMap_addFields
conca sortedNodes[177]: addToDocSourceParserMap_currentOp
conca sortedNodes[178]: addToExpressionParserMap_toLong
conca sortedNodes[179]: ImplicitDisableTLS10Warning
2025-04-21T21:03:43.047+0800 I CONTROL [main] Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none'
conca sortedNodes[180]: addToExpressionParserMap_acos
conca sortedNodes[181]: addToExpressionParserMap_tan
conca sortedNodes[182]: addToExpressionParserMap_degreesToRadians
conca sortedNodes[183]: addToExpressionParserMap_isoWeek
conca sortedNodes[184]: addAliasToDocSourceParserMap_sortByCount
conca sortedNodes[185]: RegisterTestCommand_ReapLogicalSessionCacheNowCommand
conca sortedNodes[186]: addToDocSourceParserMap_listSessions
conca sortedNodes[187]: addToExpressionParserMap_cond
conca sortedNodes[188]: EnsureIosBaseInitConstructed
conca sortedNodes[189]: AuthzClientObserver
conca sortedNodes[190]: RegisterTopCommand
conca sortedNodes[191]: addToGranularityRounderMap_E96
conca sortedNodes[192]: addToAccumulatorFactoryMap_last
conca sortedNodes[193]: addToExpressionParserMap_filter
conca sortedNodes[194]: addToDocSourceParserMap_bucketAuto
conca sortedNodes[195]: addToDocSourceParserMap_unset
conca sortedNodes[196]: MatchExpressionParser
conca sortedNodes[197]: addToExpressionParserMap_rtrim
conca sortedNodes[198]: InitializeShardedConnectionPool
conca sortedNodes[199]: addToGranularityRounderMap_E48
conca sortedNodes[200]: RegisterTestCommand_DbCheckCmd
conca sortedNodes[201]: addToDocSourceParserMap_internalOutToDifferentDB
conca sortedNodes[202]: addToExpressionParserMap_type
conca sortedNodes[203]: JavascriptPrintDomain
conca sortedNodes[204]: addToDocSourceParserMap_redact
conca sortedNodes[205]: addToDocSourceParserMap_limit
conca sortedNodes[206]: RegisterTestCommand_CPULoadCommand
conca sortedNodes[207]: addToDocSourceParserMap_replaceRoot
conca sortedNodes[208]: addToAccumulatorFactoryMap_stdDevSamp
conca sortedNodes[209]: SetWiredTigerCustomizationHooks
conca sortedNodes[210]: CursorManagerRegisterer
conca sortedNodes[211]: InterruptibleWaitListener
conca sortedNodes[212]: addToAccumulatorFactoryMap_avg
conca sortedNodes[213]: addToDocSourceParserMap_merge
conca sortedNodes[214]: InitializeGlobalConnectionPool
conca sortedNodes[215]: addToAccumulatorFactoryMap_mergeObjects
conca sortedNodes[216]: addToExpressionParserMap_regexFind
conca sortedNodes[217]: SetupIndexFilterCommands
conca sortedNodes[218]: RegisterDevNullEngine
conca sortedNodes[219]: addToExpressionParserMap_month
conca sortedNodes[220]: PdhInit
conca sortedNodes[221]: ZstdMessageCompressorInit
conca sortedNodes[222]: RegisterEphemeralForTestEngine
conca sortedNodes[223]: Init32TimeSupport
conca sortedNodes[224]: FilterAllowedIndexFieldNames
conca sortedNodes[225]: addToExpressionParserMap_substrBytes
conca sortedNodes[226]: addToExpressionParserMap_reverseArray
conca sortedNodes[227]: addToExpressionParserMap_setUnion
conca sortedNodes[228]: addToDocSourceParserMap_skip
conca sortedNodes[229]: addToExpressionParserMap_toDate
conca sortedNodes[230]: addToExpressionParserMap_asin
conca sortedNodes[231]: class mongo::SCRAMServerFactory<class mongo::SaslSCRAMServerMechanism<struct mongo::SCRAMSHA256Policy> >
conca sortedNodes[232]: addToExpressionParserMap_asinh
conca sortedNodes[233]: addToExpressionParserMap_anyElementTrue
conca sortedNodes[234]: addToExpressionParserMap_lte
conca sortedNodes[235]: class mongo::PLAINServerFactory
conca sortedNodes[236]: addToExpressionParserMap_map
conca sortedNodes[237]: ThreadNameInitializer
conca sortedNodes[238]: addToExpressionParserMap_log
conca sortedNodes[239]: addToExpressionParserMap_multiply
conca sortedNodes[240]: addToExpressionParserMap_isArray
conca sortedNodes[241]: addToExpressionParserMap_pow
conca sortedNodes[242]: addToExpressionParserMap_range
conca sortedNodes[243]: addToExpressionParserMap_indexOfArray
conca sortedNodes[244]: addToExpressionParserMap_atanh
conca sortedNodes[245]: SetupInternalSecurityUser
conca sortedNodes[246]: CreateAuthorizationManager
conca sortedNodes[247]: addToExpressionParserMap_hour
conca sortedNodes[248]: addToDocSourceParserMap_mergeCursors
conca sortedNodes[249]: addToGranularityRounderMap_R20
conca sortedNodes[250]: addToDocSourceParserMap_out
conca sortedNodes[251]: RegisterShortCircuitExitHandler
conca sortedNodes[252]: addToGranularityRounderMap_E192
conca sortedNodes[253]: LoadTimeZoneDB
conca sortedNodes[254]: addToAccumulatorFactoryMap_sum
conca sortedNodes[255]: RegisterTestCommand_CmdHashElt
conca sortedNodes[256]: addToExpressionParserMap_acosh
conca sortedNodes[257]: addToExpressionParserMap_mod
conca sortedNodes[258]: addToExpressionParserMap_log10
conca sortedNodes[259]: addToExpressionParserMap_arrayElemAt
conca sortedNodes[260]: addToExpressionParserMap_and
conca sortedNodes[261]: GenerateInstanceId
conca sortedNodes[262]: AuthorizationBuiltinRoles
conca sortedNodes[263]: addToExpressionParserMap_sqrt
conca sortedNodes[264]: addToExpressionParserMap_ne
conca sortedNodes[265]: addToExpressionParserMap_indexOfBytes
conca sortedNodes[266]: addToExpressionParserMap_toInt
conca sortedNodes[267]: addToExpressionParserMap_min
conca sortedNodes[268]: addToExpressionParserMap_dateToString
conca sortedNodes[269]: addToExpressionParserMap_second
conca sortedNodes[270]: RegisterTestCommand_CapTrunc
conca sortedNodes[271]: addToExpressionParserMap_literal
conca sortedNodes[272]: addToExpressionParserMap_dayOfYear
conca sortedNodes[273]: RegisterTestCommand_CmdHttpClient
conca sortedNodes[274]: addToAccumulatorFactoryMap_addToSet
conca sortedNodes[275]: SetupDottedNamesV2
conca sortedNodes[276]: addToExpressionParserMap_dateFromString
conca sortedNodes[277]: addToExpressionParserMap_week
conca sortedNodes[278]: addToDocSourceParserMap_match
conca sortedNodes[279]: addAliasToDocSourceParserMap_bucket
conca sortedNodes[280]: RegisterTestCommand_RestartCatalogCmd
conca sortedNodes[281]: CollectionShardingStateFactory
conca sortedNodes[282]: PathlessOperatorMap
conca sortedNodes[283]: addToDocSourceParserMap_group
conca sortedNodes[284]: addToExpressionParserMap_slice
conca sortedNodes[285]: addToAccumulatorFactoryMap_max
conca sortedNodes[286]: addToExpressionParserMap_toDecimal
conca sortedNodes[287]: RegisterTestCommand_CmdReplSetTest
conca sortedNodes[288]: addToExpressionParserMap_toLower
conca sortedNodes[289]: addToExpressionParserMap_dateToParts
conca sortedNodes[290]: addToExpressionParserMap_ltrim
conca sortedNodes[291]: addToExpressionParserMap_strcasecmp
conca sortedNodes[292]: addToExpressionParserMap_gte
conca sortedNodes[293]: addToExpressionParserMap_trunc
conca sortedNodes[294]: addToExpressionParserMap_avg
conca sortedNodes[295]: SaslClientAuthenticateFunction
conca sortedNodes[296]: RegisterAppendOpLogNoteCmd
conca sortedNodes[297]: RegisterTestCommand_GodInsert
conca sortedNodes[298]: addToExpressionParserMap_arrayToObject
conca sortedNodes[299]: addToExpressionParserMap_let
conca sortedNodes[300]: addToDocSourceParserMap_listCachedAndActiveUsers
conca sortedNodes[301]: addToExpressionParserMap_in
conca sortedNodes[302]: addToExpressionParserMap_isNumber
conca sortedNodes[303]: SetupDBClientBaseWithConnection
conca sortedNodes[304]: addToDocSourceParserMap_graphLookup
conca sortedNodes[305]: addToExpressionParserMap_stdDevPop
conca sortedNodes[306]: addToExpressionParserMap_dayOfMonth
conca sortedNodes[307]: addToExpressionParserMap_strLenBytes
conca sortedNodes[308]: addToExpressionParserMap_toBool
conca sortedNodes[309]: addToExpressionParserMap_substrCP
conca sortedNodes[310]: addToExpressionParserMap_toUpper
conca sortedNodes[311]: NativeSaslClientContext
conca sortedNodes[312]: ZlibMessageCompressorInit
conca sortedNodes[313]: NoopMessageCompressorInit
conca sortedNodes[314]: AllCompressorsRegistered
conca sortedNodes[315]: addToExpressionParserMap_sinh
conca sortedNodes[316]: addToExpressionParserMap_exp
conca sortedNodes[317]: SetupPlanCacheCommands
conca sortedNodes[318]: ClusterBalancerControlCommands
conca sortedNodes[319]: RegisterTestCommand_ClearLogCmd
conca sortedNodes[320]: addToExpressionParserMap_tanh
conca sortedNodes[321]: addToDocSourceParserMap__internalSplitPipeline
conca sortedNodes[322]: addToDocSourceParserMap_sort
conca sortedNodes[323]: SetupDottedNames
conca sortedNodes[324]: addToExpressionParserMap_round
conca sortedNodes[325]: RegisterTestCommand_CmdSetCommittedSnapshot
conca sortedNodes[326]: PreSaslCommands
conca sortedNodes[327]: DynamicLinkWin32Poll
conca sortedNodes[328]: FTSIndexFormat
conca sortedNodes[329]: addToExpressionParserMap_sum
conca sortedNodes[330]: addToExpressionParserMap_divide
conca sortedNodes[331]: addToGranularityRounderMap_R10
conca sortedNodes[332]: addToGranularityRounderMap_R5
conca sortedNodes[333]: addToExpressionParserMap_allElementsTrue
conca sortedNodes[334]: addToGranularityRounderMap_E6
conca sortedNodes[335]: addToDocSourceParserMap_replaceWith
conca sortedNodes[336]: RegisterTestCommand_CmdMakeSnapshot
conca sortedNodes[337]: RamLogCatalog
conca sortedNodes[338]: addToExpressionParserMap_concatArrays
conca sortedNodes[339]: addToAccumulatorFactoryMap_push
conca sortedNodes[340]: SessionCatalogD
conca sortedNodes[341]: WiredTigerEngineInit
conca sortedNodes[342]: addToExpressionParserMap_indexOfCP
conca sortedNodes[343]: addToExpressionParserMap_binarySize
conca sortedNodes[344]: AuthIndexKeyPatterns
conca sortedNodes[345]: addToExpressionParserMap_or
conca sortedNodes[346]: addToExpressionParserMap_add
conca sortedNodes[347]: addToExpressionParserMap_cosh
conca sortedNodes[348]: addToExpressionParserMap_trim
conca sortedNodes[349]: InitializeAdvanceClusterTimePrivilegeVector
conca sortedNodes[350]: LogstreamBuilder
conca sortedNodes[351]: RegisterTestCommand_CmdWhatsMySNI
conca sortedNodes[352]: addToExpressionParserMap_stdDevSamp
conca sortedNodes[353]: addToExpressionParserMap_millisecond
conca sortedNodes[354]: addToExpressionParserMap_setDifference
conca sortedNodes[355]: addToExpressionParserMap_subtract
conca sortedNodes[356]: addToDocSourceParserMap_indexStats
conca sortedNodes[357]: addToExpressionParserMap_ln
conca sortedNodes[358]: addToExpressionParserMap_isoWeekYear
conca sortedNodes[359]: addToExpressionParserMap_reduce
conca sortedNodes[360]: addToDocSourceParserMap_geoNear
conca sortedNodes[361]: addToExpressionParserMap_radiansToDegrees
conca sortedNodes[362]: LockListener
conca sortedNodes[363]: StopWords
conca sortedNodes[364]: RegisterTestCommand_RefreshLogicalSessionCacheNowCommand
conca sortedNodes[365]: addToExpressionParserMap_setIsSubset
conca sortedNodes[366]: addToExpressionParserMap_setIntersection
conca sortedNodes[367]: ExtractSOMap
conca sortedNodes[368]: RegisterWaitForOngoingChunkSplitsCommand
conca sortedNodes[369]: RegisterIsSelfCommand
conca sortedNodes[370]: addToDocSourceParserMap__internalInhibitOptimization
conca sortedNodes[371]: addAliasToDocSourceParserMap_count
conca sortedNodes[372]: initialSyncOplogBuffer
conca sortedNodes[373]: addToDocSourceParserMap_project
conca sortedNodes[374]: addToAccumulatorFactoryMap_min
conca sortedNodes[375]: CreateCollatorFactory
conca sortedNodes[376]: addToAccumulatorFactoryMap__internalJsReduce
conca sortedNodes[377]: addToExpressionParserMap_atan2
conca sortedNodes[378]: addToExpressionParserMap_substr
conca sortedNodes[379]: addToExpressionParserMap_lt
conca sortedNodes[380]: SystemTickSourceInit
conca sortedNodes[381]: addToGranularityRounderMap_1_2_5
conca sortedNodes[382]: addToExpressionParserMap_objectToArray
conca sortedNodes[383]: addToExpressionParserMap_zip
conca sortedNodes[384]: addToExpressionParserMap_dayOfWeek
conca sortedNodes[385]: addToExpressionParserMap_toObjectId
conca sortedNodes[386]: addToDocSourceParserMap_unwind
conca sortedNodes[387]: RamLogCatalogV2
conca sortedNodes[388]: addToExpressionParserMap_ceil
conca sortedNodes[389]: addToGranularityRounderMap_POWERSOF2
conca sortedNodes[390]: addToExpressionParserMap_convert
conca sortedNodes[391]: addToExpressionParserMap_regexFindAll
conca sortedNodes[392]: addToGranularityRounderMap_E12
conca sortedNodes[393]: IntializeSymbolHandler
conca sortedNodes[394]: addToExpressionParserMap_minute
conca sortedNodes[395]: addToExpressionParserMap__internalJs
conca sortedNodes[396]: addToExpressionParserMap_isoDayOfWeek
conca sortedNodes[397]: ShouldAlwaysRecordTraffic
conca sortedNodes[398]: addToDocSourceParserMap_sample
conca sortedNodes[399]: addToDocSourceParserMap_listLocalSessions
conca sortedNodes[400]: RegisterTestCommand_CmdSleep
2025-04-21T21:03:44.139+0800 I CONTROL [initandlisten] MongoDB starting : pid=1884 port=27017 dbpath=C:\me\studyhome\mongodb\mongo-r4.0.7\data 64-bit host=LAPTOP-78C0012V
2025-04-21T21:03:44.139+0800 I CONTROL [initandlisten] targetMinOS: Windows 7/Windows Server 2008 R2
2025-04-21T21:03:44.140+0800 I CONTROL [initandlisten] db version v4.0.7
2025-04-21T21:03:44.141+0800 I CONTROL [initandlisten] git version: nogitversion
2025-04-21T21:03:44.142+0800 I CONTROL [initandlisten] allocator: tcmalloc
2025-04-21T21:03:44.142+0800 I CONTROL [initandlisten] modules: none
2025-04-21T21:03:44.143+0800 I CONTROL [initandlisten] build environment:
2025-04-21T21:03:44.147+0800 I CONTROL [initandlisten] distarch: x86_64
2025-04-21T21:03:44.154+0800 I CONTROL [initandlisten] target_arch: x86_64
2025-04-21T21:03:44.155+0800 I CONTROL [initandlisten] options: { storage: { dbPath: "C:\me\studyhome\mongodb\mongo-r4.0.7\data" }, systemLog: { verbosity: 1 } }
2025-04-21T21:03:44.161+0800 I STORAGE [initandlisten] Detected data files in C:\me\studyhome\mongodb\mongo-r4.0.7\data created by the 'wiredTiger' storage engine, so setting the active storage engine to 'wiredTiger'.
2025-04-21T21:03:44.162+0800 I STORAGE [initandlisten] wiredtiger_open config: create,cache_size=7607M,cache_overflow=(file_max=0M),session_max=33000,eviction=(threads_min=4,threads_max=4),config_base=false,statistics=(fast),log=(enabled=true,archive=true,path=journal,compressor=snappy),file_manager=(close_idle_time=100000,close_scan_interval=10,close_handle_minimum=250),statistics_log=(wait=0),verbose=[recovery_progress,checkpoint_progress,compact_progress],
2025-04-21T21:03:44.211+0800 I STORAGE [initandlisten] WiredTiger message [1745240624:210493][1884:140719663569040], txn-recover: Recovering log 37 through 38
2025-04-21T21:03:44.356+0800 I STORAGE [initandlisten] WiredTiger message [1745240624:355109][1884:140719663569040], txn-recover: Recovering log 38 through 38
2025-04-21T21:03:44.482+0800 I STORAGE [initandlisten] WiredTiger message [1745240624:482283][1884:140719663569040], txn-recover: Main recovery loop: starting at 37/4736 to 38/256
2025-04-21T21:03:44.642+0800 I STORAGE [initandlisten] WiredTiger message [1745240624:641853][1884:140719663569040], txn-recover: Recovering log 37 through 38
2025-04-21T21:03:44.722+0800 I STORAGE [initandlisten] WiredTiger message [1745240624:721181][1884:140719663569040], txn-recover: Recovering log 38 through 38
2025-04-21T21:03:44.791+0800 I STORAGE [initandlisten] WiredTiger message [1745240624:790995][1884:140719663569040], txn-recover: Set global recovery timestamp: (0,0)
2025-04-21T21:03:44.806+0800 I RECOVERY [initandlisten] WiredTiger recoveryTimestamp. Ts: Timestamp(0, 0)
2025-04-21T21:03:44.809+0800 D1 COMMAND [WTIdleSessionSweeper] BackgroundJob starting: WTIdleSessionSweeper
2025-04-21T21:03:44.809+0800 D1 STORAGE [WTIdleSessionSweeper] starting WTIdleSessionSweeper thread
2025-04-21T21:03:44.818+0800 D1 STORAGE [initandlisten] Registering collection admin.system.version with UUID a76860e7-84c4-4a43-8deb-42358f491495
2025-04-21T21:03:44.819+0800 D1 STORAGE [initandlisten] Registering collection local.startup_log with UUID 1e5195da-81b3-4f93-ba61-da40cbdccf67
2025-04-21T21:03:44.820+0800 D1 STORAGE [initandlisten] Registering collection config.system.sessions with UUID 0a2b2726-f110-4c84-a01a-3c5ccae550a7
2025-04-21T21:03:44.826+0800 D1 STORAGE [initandlisten] Registering collection db.user with UUID 3085070b-fc6c-4a15-bd83-57d650b71ff8
2025-04-21T21:03:44.827+0800 D1 COMMAND [WTJournalFlusher] BackgroundJob starting: WTJournalFlusher
2025-04-21T21:03:44.830+0800 D1 STORAGE [WTJournalFlusher] starting WTJournalFlusher thread
2025-04-21T21:03:44.830+0800 D1 COMMAND [WTCheckpointThread] BackgroundJob starting: WTCheckpointThread
2025-04-21T21:03:44.830+0800 I STORAGE [initandlisten] Timestamp monitor starting
2025-04-21T21:03:44.835+0800 D1 STORAGE [WTCheckpointThread] starting WTCheckpointThread thread
2025-04-21T21:03:44.839+0800 I CONTROL [initandlisten]
2025-04-21T21:03:44.840+0800 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
2025-04-21T21:03:44.840+0800 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
2025-04-21T21:03:44.843+0800 I CONTROL [initandlisten]
2025-04-21T21:03:44.850+0800 I CONTROL [initandlisten] ** WARNING: This server is bound to localhost.
2025-04-21T21:03:44.851+0800 I CONTROL [initandlisten] ** Remote systems will be unable to connect to this server.
2025-04-21T21:03:44.851+0800 I CONTROL [initandlisten] ** Start the server with --bind_ip <address> to specify which IP
2025-04-21T21:03:44.852+0800 I CONTROL [initandlisten] ** addresses it should serve responses from, or with --bind_ip_all to
2025-04-21T21:03:44.852+0800 I CONTROL [initandlisten] ** bind to all interfaces. If this behavior is desired, start the
2025-04-21T21:03:44.853+0800 I CONTROL [initandlisten] ** server with --bind_ip 127.0.0.1 to disable this warning.
2025-04-21T21:03:44.853+0800 I CONTROL [initandlisten]
2025-04-21T21:03:44.858+0800 D1 STORAGE [initandlisten] admin.system.version: clearing plan cache - collection info cache reset
2025-04-21T21:03:44.861+0800 D1 - [initandlisten] reloading view catalog for database admin
2025-04-21T21:03:44.866+0800 D1 STORAGE [initandlisten] config.system.sessions: clearing plan cache - collection info cache reset
2025-04-21T21:03:44.867+0800 D1 - [initandlisten] reloading view catalog for database config
2025-04-21T21:03:44.869+0800 D1 STORAGE [initandlisten] db.user: clearing plan cache - collection info cache reset
2025-04-21T21:03:44.869+0800 D1 - [initandlisten] reloading view catalog for database db
2025-04-21T21:03:44.870+0800 D1 STORAGE [initandlisten] local.startup_log: clearing plan cache - collection info cache reset
2025-04-21T21:03:44.870+0800 D1 - [initandlisten] reloading view catalog for database local
2025-04-21T21:03:44.876+0800 I SHARDING [initandlisten] Marking collection local.system.replset as collection version: <unsharded>
2025-04-21T21:03:44.879+0800 D1 STORAGE [initandlisten] Recovering database: admin
2025-04-21T21:03:44.887+0800 D1 STORAGE [initandlisten] Recovering database: config
2025-04-21T21:03:44.887+0800 D1 STORAGE [initandlisten] Recovering database: db
2025-04-21T21:03:44.888+0800 D1 STORAGE [initandlisten] Recovering database: local
2025-04-21T21:03:44.888+0800 D1 STORAGE [initandlisten] done repairDatabases
2025-04-21T21:03:44.889+0800 I STORAGE [initandlisten] Flow Control is enabled on this deployment.
mongo/util/options_parser/options_parser_init.cpp,解析函数是通过宏定义MONGO_STARTUP_OPTIONS_PARSE实现的。parser.run是具体执行的解析参数方法。
MONGO_STARTUP_OPTIONS_PARSE(StartupOptions)(InitializerContext* context) {
std::cout << "conca parser.run. options_parser_init.cpp" << std::endl;
OptionsParser parser;
Status ret = parser.run(startupOptions, context->args(), context->env(), &startupOptionsParsed);
if (!ret.isOK()) {
std::cerr << ret.reason() << std::endl;
// TODO: Figure out if there's a use case for this help message ever being different
std::cerr << "try '" << context->args()[0] << " --help' for more information" << std::endl;
quickExit(EXIT_BADOPTIONS);
}
return Status::OK();
}
mongo/util/options_parser/options_parser.cppOptionsParser
类的 run
方法,其核心功能是解析 MongoDB 的启动选项,这些选项可以通过命令行参数和配置文件来指定
/**
* Run the OptionsParser
*
* Overview:
*
* 1. Parse argc and argv using the given OptionSection as a description of expected options
* 2. Check for a "config" argument
* 3. If "config" found, read config file
* 4. Detect config file type (YAML or INI)
* 5. Parse config file using the given OptionSection as a description of expected options
* 6. Add the results to the output Environment in the proper order to ensure correct precedence
*/
Status OptionsParser::run(const OptionSection& options,
const std::vector<std::string>& argvOriginal,
const std::map<std::string, std::string>& env, // XXX: Currently unused
Environment* environment) {
Environment commandLineEnvironment;
Environment configEnvironment;
Environment composedEnvironment;
auto swTransform = transformImplicitOptions(options, argvOriginal);
if (!swTransform.isOK()) {
return swTransform.getStatus();
}
std::vector<std::string> argvTransformed = std::move(swTransform.getValue());
Status ret = parseCommandLine(options, argvTransformed, &commandLineEnvironment);
if (!ret.isOK()) {
return ret;
}
Value config_value;
ret = commandLineEnvironment.get(Key("config"), &config_value);
// We had an error other than "config" not existing in our environment
if (!ret.isOK() && ret != ErrorCodes::NoSuchKey) {
return ret;
}
// "config" exists in our environment
else if (ret.isOK()) {
// Environment::get returns a bad status if config was not set
std::string config_filename;
ret = config_value.get(&config_filename);
if (!ret.isOK()) {
return ret;
}
auto swExpand = parseConfigExpand(commandLineEnvironment);
if (!swExpand.isOK()) {
return swExpand.getStatus();
}
auto configExpand = std::move(swExpand.getValue());
std::string config_file;
ret = readConfigFile(config_filename, &config_file, configExpand);
if (!ret.isOK()) {
return ret;
}
ret = parseConfigFile(options, config_file, &configEnvironment, configExpand);
if (!ret.isOK()) {
return ret;
}
}
// Adds the values for all our options that were registered as composable to the composed
// environment. addCompositions doesn't override the values like "setAll" on our
// environment. Instead it aggregates the values in the result environment.
// NOTE: We must add our configEnvironment compositions first since we have a StringMap type
// in which some options can be overridden by the command line.
ret = addCompositions(options, configEnvironment, &composedEnvironment);
if (!ret.isOK()) {
return ret;
}
ret = addCompositions(options, commandLineEnvironment, &composedEnvironment);
if (!ret.isOK()) {
return ret;
}
// Add the default values to our resulting environment
ret = addDefaultValues(options, environment);
if (!ret.isOK()) {
return ret;
}
// Add the values to our result in the order of override
// NOTE: This should not fail validation as we haven't called environment->validate() yet
ret = environment->setAll(configEnvironment);
if (!ret.isOK()) {
return ret;
}
ret = environment->setAll(commandLineEnvironment);
if (!ret.isOK()) {
return ret;
}
// Add this last because it has all the composable options aggregated over different
// sources. For example, if we have a StringMap type with some values set on the command
// line and some values set in config files, we want to make sure to get them all. This
// should not override any non composable options, since composedEnvironment should not have
// them set. See the addCompositions function for more details.
ret = environment->setAll(composedEnvironment);
if (!ret.isOK()) {
return ret;
}
// Add the constraints from our options to the result environment
ret = addConstraints(options, environment);
if (!ret.isOK()) {
return ret;
}
return Status::OK();
}
隐式选项转换transformImplicitOptions(options, argvOriginal);处理像 --port 27017 转为 --port=27017 这样的隐式格式转换
命令行解析parseCommandLine(options, argvTransformed, &commandLineEnvironment);
从命令行中读取--config配置文件处理commandLineEnvironment.get(Key("config"), &config_value);
读取配置文件ret = readConfigFile(config_filename, &config_file, configExpand);
解析配置文件 ret = parseConfigFile(options, config_file, &configEnvironment, configExpand);
配置组合策略ret = addCompositions(options, configEnvironment, &composedEnvironment);ret = addCompositions(options, commandLineEnvironment, &composedEnvironment);
按优先级合并配置源
ret = environment->setAll(configEnvironment); // 配置文件mongod.conf
ret = environment->setAll(commandLineEnvironment); // 命令行
ret = environment->setAll(composedEnvironment); // 最后应用组合配置
确保未设置的选项有默认值ret = addDefaultValues(options, environment);
mongod参数(端口、数据路径dbpath 等)可以在多个地方设置,mongod到底以哪个优先级高?哪个起作用呢?
优先级是:应用组合配置 > 命令行 >配置文件mongod.conf
扩展思路:MONGO_STARTUP_OPTIONS_PARSE怎么来的?宏定义怎么到parser.run?
mongo/util/options_parser/startup_option_init.h,这些宏定义了 MongoDB 启动选项的处理流程,展示了 MongoDB 如何通过初始化系统管理启动选项的注册、解析、验证和存储过程。
#define MONGO_GENERAL_STARTUP_OPTIONS_REGISTER(fname) \
MONGO_STARTUP_OPTION_IN_GROUP_(fname, _Register, GeneralStartupOptionRegistration)
#define MONGO_MODULE_STARTUP_OPTIONS_REGISTER(fname) \
MONGO_STARTUP_OPTION_IN_GROUP_(fname, _Register, ModuleStartupOptionRegistration)
#define MONGO_STARTUP_OPTIONS_PARSE(fname) \
MONGO_STARTUP_OPTION_IN_GROUP_(fname, _Parse, StartupOptionParsing)
#define MONGO_STARTUP_OPTIONS_VALIDATE(fname) \
MONGO_STARTUP_OPTION_IN_GROUP_(fname, _Validate, StartupOptionValidation)
#define MONGO_STARTUP_OPTIONS_STORE(fname) \
MONGO_STARTUP_OPTION_IN_GROUP_(fname, _Store, StartupOptionStorage)
#define MONGO_STARTUP_OPTIONS_POST(fname) \
MONGO_STARTUP_OPTION_IN_GROUP_(fname, _Post, PostStartupOptionStorage)
#define MONGO_STARTUP_OPTION_IN_GROUP_(fname, suffix, group) \
MONGO_INITIALIZER_GENERAL(fname##suffix, ("Begin" #group), ("End" #group))
这个基础宏MONGO_INITIALIZER_GENERAL将所有启动选项处理函数包装为初始化器:将函数名fname和suffix拼接,指定初始化器位于特定组的开始和结束标记之间,
使用 MONGO_INITIALIZER_GENERAL 注册为通用初始化器,MONGO_INITIALIZER_GENERAL 是怎么初始化的?400个函数是怎么增加到树形链接节点中的?
mongo/base/init.h
#define MONGO_INITIALIZER_GENERAL(NAME, PREREQUISITES, DEPENDENTS) \
::mongo::Status MONGO_INITIALIZER_FUNCTION_NAME_(NAME)(::mongo::InitializerContext*); \
namespace { \
::mongo::GlobalInitializerRegisterer _mongoInitializerRegisterer_##NAME( \
std::string(#NAME), \
mongo::InitializerFunction(MONGO_INITIALIZER_FUNCTION_NAME_(NAME)), \
mongo::DeinitializerFunction(nullptr), \
std::vector<std::string>{MONGO_INITIALIZER_STRIP_PARENS_ PREREQUISITES}, \
std::vector<std::string>{MONGO_INITIALIZER_STRIP_PARENS_ DEPENDENTS}); \
} \
::mongo::Status MONGO_INITIALIZER_FUNCTION_NAME_(NAME)
mongo/base/global_initializer_registerer.cpp,注册入口
GlobalInitializerRegisterer::GlobalInitializerRegisterer(std::string name,
InitializerFunction initFn,
DeinitializerFunction deinitFn,
std::vector<std::string> prerequisites,
std::vector<std::string> dependents) {
Status status = getGlobalInitializer().getInitializerDependencyGraph().addInitializer(
std::move(name),
std::move(initFn),
std::move(deinitFn),
std::move(prerequisites),
std::move(dependents));
if (Status::OK() != status) {
std::cerr << "Attempt to add global initializer failed, status: " << status << std::endl;
::abort();
}
}
mongo/base/initializer_dependency_graph.cpp,放到node节点中
Status InitializerDependencyGraph::addInitializer(std::string name,
InitializerFunction initFn,
DeinitializerFunction deinitFn,
std::vector<std::string> prerequisites,
std::vector<std::string> dependents) {
if (!initFn)
return Status(ErrorCodes::BadValue, "Illegal to supply a NULL function");
InitializerDependencyNode& newNode = _nodes[name];
if (newNode.initFn) {
return Status(ErrorCodes::Error(50999), name);
}
newNode.initFn = std::move(initFn);
newNode.deinitFn = std::move(deinitFn);
for (size_t i = 0; i < prerequisites.size(); ++i) {
newNode.prerequisites.insert(prerequisites[i]);
}
for (size_t i = 0; i < dependents.size(); ++i) {
_nodes[dependents[i]].prerequisites.insert(name);
}
return Status::OK();
}