diff options
author | Andy Schwerin <schwerin@mongodb.com> | 2018-04-24 18:44:21 -0400 |
---|---|---|
committer | Andy Schwerin <schwerin@mongodb.com> | 2018-05-02 17:10:28 -0400 |
commit | 970ace98679d499f8821c8775dee875d3070d79f (patch) | |
tree | e0d71af365887a0d16f0521c68d02ad908ed6000 /src | |
parent | 8ee6a9c1993acf7981d4d7a0ac8ba6f808c23b60 (diff) | |
download | mongo-970ace98679d499f8821c8775dee875d3070d79f.tar.gz |
SERVER-34794 Construct the global ServiceContext inside a MONGO_INITIALIZER
Diffstat (limited to 'src')
30 files changed, 142 insertions, 184 deletions
diff --git a/src/mongo/base/deinitializer_context.h b/src/mongo/base/deinitializer_context.h index 0db3d773c05..f2a4c927cf2 100644 --- a/src/mongo/base/deinitializer_context.h +++ b/src/mongo/base/deinitializer_context.h @@ -42,18 +42,8 @@ namespace mongo { */ class DeinitializerContext { public: - explicit DeinitializerContext(ServiceContext* serviceContext) - : _serviceContext(serviceContext) {} - DeinitializerContext(DeinitializerContext const&) = delete; DeinitializerContext& operator=(DeinitializerContext const&) = delete; - - ServiceContext* serviceContext() const { - return _serviceContext; - } - -private: - ServiceContext* _serviceContext; }; } // namespace mongo diff --git a/src/mongo/base/initializer.cpp b/src/mongo/base/initializer.cpp index 34625b7cd65..579fb6ef6da 100644 --- a/src/mongo/base/initializer.cpp +++ b/src/mongo/base/initializer.cpp @@ -25,13 +25,17 @@ * then also delete it in the license file. */ +#include "mongo/platform/basic.h" + #include "mongo/base/initializer.h" +#include <iostream> + #include "mongo/base/deinitializer_context.h" #include "mongo/base/global_initializer.h" +#include "mongo/base/initializer_context.h" #include "mongo/util/assert_util.h" #include "mongo/util/quick_exit.h" -#include <iostream> namespace mongo { @@ -39,14 +43,13 @@ Initializer::Initializer() {} Initializer::~Initializer() {} Status Initializer::executeInitializers(const InitializerContext::ArgumentVector& args, - const InitializerContext::EnvironmentMap& env, - ServiceContext* serviceContext) { + const InitializerContext::EnvironmentMap& env) { std::vector<std::string> sortedNodes; Status status = _graph.topSort(&sortedNodes); if (Status::OK() != status) return status; - InitializerContext context(args, env, serviceContext); + InitializerContext context(args, env); for (size_t i = 0; i < sortedNodes.size(); ++i) { InitializerDependencyNode* node = _graph.getInitializerNode(sortedNodes[i]); @@ -76,13 +79,13 @@ Status Initializer::executeInitializers(const InitializerContext::ArgumentVector return Status::OK(); } -Status Initializer::executeDeinitializers(ServiceContext* serviceContext) { +Status Initializer::executeDeinitializers() { std::vector<std::string> sortedNodes; Status status = _graph.topSort(&sortedNodes); if (Status::OK() != status) return status; - DeinitializerContext context(serviceContext); + DeinitializerContext context{}; // Execute deinitialization in reverse order from initialization. for (auto it = sortedNodes.rbegin(), end = sortedNodes.rend(); it != end; ++it) { @@ -105,15 +108,11 @@ Status Initializer::executeDeinitializers(ServiceContext* serviceContext) { } Status runGlobalInitializers(const InitializerContext::ArgumentVector& args, - const InitializerContext::EnvironmentMap& env, - ServiceContext* serviceContext) { - return getGlobalInitializer().executeInitializers(args, env, serviceContext); + const InitializerContext::EnvironmentMap& env) { + return getGlobalInitializer().executeInitializers(args, env); } -Status runGlobalInitializers(int argc, - const char* const* argv, - const char* const* envp, - ServiceContext* serviceContext) { +Status runGlobalInitializers(int argc, const char* const* argv, const char* const* envp) { InitializerContext::ArgumentVector args(argc); std::copy(argv, argv + argc, args.begin()); @@ -129,18 +128,15 @@ Status runGlobalInitializers(int argc, } } - return runGlobalInitializers(args, env, serviceContext); + return runGlobalInitializers(args, env); } -Status runGlobalDeinitializers(ServiceContext* serviceContext) { - return getGlobalInitializer().executeDeinitializers(serviceContext); +Status runGlobalDeinitializers() { + return getGlobalInitializer().executeDeinitializers(); } -void runGlobalInitializersOrDie(int argc, - const char* const* argv, - const char* const* envp, - ServiceContext* serviceContext) { - Status status = runGlobalInitializers(argc, argv, envp, serviceContext); +void runGlobalInitializersOrDie(int argc, const char* const* argv, const char* const* envp) { + Status status = runGlobalInitializers(argc, argv, envp); if (!status.isOK()) { std::cerr << "Failed global initialization: " << status << std::endl; quickExit(1); diff --git a/src/mongo/base/initializer.h b/src/mongo/base/initializer.h index 924569ab138..904356fdbef 100644 --- a/src/mongo/base/initializer.h +++ b/src/mongo/base/initializer.h @@ -66,10 +66,9 @@ public: * and the thing being initialized should be considered dead in the water. */ Status executeInitializers(const InitializerContext::ArgumentVector& args, - const InitializerContext::EnvironmentMap& env, - ServiceContext* serviceContext); + const InitializerContext::EnvironmentMap& env); - Status executeDeinitializers(ServiceContext* serviceContext); + Status executeDeinitializers(); private: InitializerDependencyGraph _graph; @@ -85,22 +84,15 @@ private: * should probably arrange to terminate the process themselves. */ Status runGlobalInitializers(const InitializerContext::ArgumentVector& args, - const InitializerContext::EnvironmentMap& env, - ServiceContext* serviceContext); + const InitializerContext::EnvironmentMap& env); -Status runGlobalInitializers(int argc, - const char* const* argv, - const char* const* envp, - ServiceContext* serviceContext); +Status runGlobalInitializers(int argc, const char* const* argv, const char* const* envp); /** * Same as runGlobalInitializers(), except prints a brief message to std::cerr * and terminates the process on failure. */ -void runGlobalInitializersOrDie(int argc, - const char* const* argv, - const char* const* envp, - ServiceContext* serviceContext); +void runGlobalInitializersOrDie(int argc, const char* const* argv, const char* const* envp); /** * Run the global deinitializers. They will execute in reverse order from initialization. @@ -111,6 +103,6 @@ void runGlobalInitializersOrDie(int argc, * This means that the few initializers that might want to terminate the program by failing * should probably arrange to terminate the process themselves. */ -Status runGlobalDeinitializers(ServiceContext* serviceContext); +Status runGlobalDeinitializers(); } // namespace mongo diff --git a/src/mongo/base/initializer_context.h b/src/mongo/base/initializer_context.h index b1a9ab329e9..ee3df192803 100644 --- a/src/mongo/base/initializer_context.h +++ b/src/mongo/base/initializer_context.h @@ -47,10 +47,8 @@ public: typedef std::vector<std::string> ArgumentVector; typedef std::map<std::string, std::string> EnvironmentMap; - InitializerContext(const ArgumentVector& args, - const EnvironmentMap& env, - ServiceContext* serviceContext) - : _args(args), _env(env), _serviceContext(serviceContext) {} + InitializerContext(const ArgumentVector& args, const EnvironmentMap& env) + : _args(args), _env(env) {} const ArgumentVector& args() const { return _args; @@ -59,14 +57,9 @@ public: return _env; } - ServiceContext* serviceContext() const { - return _serviceContext; - } - private: ArgumentVector _args; EnvironmentMap _env; - ServiceContext* _serviceContext; }; } // namespace mongo diff --git a/src/mongo/base/initializer_test.cpp b/src/mongo/base/initializer_test.cpp index 31b87f5771d..9be5f0eb6f5 100644 --- a/src/mongo/base/initializer_test.cpp +++ b/src/mongo/base/initializer_test.cpp @@ -160,8 +160,8 @@ TEST(InitializerTest, SuccessfulInitialization) { set7, set8); clearCounts(); - ASSERT_OK(initializer.executeInitializers( - InitializerContext::ArgumentVector(), InitializerContext::EnvironmentMap(), nullptr)); + ASSERT_OK(initializer.executeInitializers(InitializerContext::ArgumentVector(), + InitializerContext::EnvironmentMap())); for (int i = 0; i < 9; ++i) ASSERT_EQUALS(1, globalCounts[i]); } @@ -181,8 +181,7 @@ TEST(InitializerTest, Step5Misimplemented) { clearCounts(); ASSERT_EQUALS(ErrorCodes::UnknownError, initializer.executeInitializers(InitializerContext::ArgumentVector(), - InitializerContext::EnvironmentMap(), - nullptr)); + InitializerContext::EnvironmentMap())); ASSERT_EQUALS(1, globalCounts[0]); ASSERT_EQUALS(1, globalCounts[1]); ASSERT_EQUALS(1, globalCounts[2]); diff --git a/src/mongo/client/embedded/embedded.cpp b/src/mongo/client/embedded/embedded.cpp index 580843414ea..19cfa77374b 100644 --- a/src/mongo/client/embedded/embedded.cpp +++ b/src/mongo/client/embedded/embedded.cpp @@ -102,7 +102,7 @@ GlobalInitializerRegisterer replicationManagerInitializer( "CreateReplicationManager", {"SSLManager", "default"}, [](InitializerContext* context) { - auto serviceContext = context->serviceContext(); + auto serviceContext = getGlobalServiceContext(); repl::StorageInterface::set(serviceContext, std::make_unique<repl::StorageInterfaceImpl>()); auto logicalClock = stdx::make_unique<LogicalClock>(serviceContext); @@ -114,7 +114,7 @@ GlobalInitializerRegisterer replicationManagerInitializer( return Status::OK(); }, [](DeinitializerContext* context) { - auto serviceContext = context->serviceContext(); + auto serviceContext = getGlobalServiceContext(); repl::ReplicationCoordinator::set(serviceContext, nullptr); LogicalClock::set(serviceContext, nullptr); @@ -159,7 +159,7 @@ void shutdown(ServiceContext* srvContext) { serviceContext->shutdownGlobalStorageEngineCleanly(); } - Status status = mongo::runGlobalDeinitializers(serviceContext); + Status status = mongo::runGlobalDeinitializers(); uassertStatusOKWithContext(status, "Global deinitilization failed"); } shutdownOpCtx.reset(); @@ -176,14 +176,11 @@ void shutdown(ServiceContext* srvContext) { ServiceContext* initialize(const char* yaml_config) { srand(static_cast<unsigned>(curTimeMicros64())); - setGlobalServiceContext(createServiceContext()); - // yaml_config is passed to the options parser through the argc/argv interface that already // existed. If it is nullptr then use 0 count which will be interpreted as empty string. const char* argv[2] = {yaml_config, nullptr}; - Status status = - mongo::runGlobalInitializers(yaml_config ? 1 : 0, argv, nullptr, getGlobalServiceContext()); + Status status = mongo::runGlobalInitializers(yaml_config ? 1 : 0, argv, nullptr); uassertStatusOKWithContext(status, "Global initilization failed"); Client::initThread("initandlisten"); diff --git a/src/mongo/db/auth/authorization_manager_global.cpp b/src/mongo/db/auth/authorization_manager_global.cpp index 39505fab014..9738f7b2932 100644 --- a/src/mongo/db/auth/authorization_manager_global.cpp +++ b/src/mongo/db/auth/authorization_manager_global.cpp @@ -1,30 +1,30 @@ /** -* Copyright (C) 2013 10gen Inc. -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU Affero General Public License, version 3, -* as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU Affero General Public License for more details. -* -* You should have received a copy of the GNU Affero General Public License -* along with this program. If not, see <http://www.gnu.org/licenses/>. -* -* As a special exception, the copyright holders give permission to link the -* code of portions of this program with the OpenSSL library under certain -* conditions as described in each individual source file and distribute -* linked combinations including the program with the OpenSSL library. You -* must comply with the GNU Affero General Public License in all respects for -* all of the code used other than as permitted herein. If you modify file(s) -* with this exception, you may extend this exception to your version of the -* file(s), but you are not obligated to do so. If you do not wish to do so, -* delete this exception statement from your version. If you delete this -* exception statement from all source files in the program, then also delete -* it in the license file. -*/ + * Copyright (C) 2013 10gen Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * As a special exception, the copyright holders give permission to link the + * code of portions of this program with the OpenSSL library under certain + * conditions as described in each individual source file and distribute + * linked combinations including the program with the OpenSSL library. You + * must comply with the GNU Affero General Public License in all respects for + * all of the code used other than as permitted herein. If you modify file(s) + * with this exception, you may extend this exception to your version of the + * file(s), but you are not obligated to do so. If you do not wish to do so, + * delete this exception statement from your version. If you delete this + * exception statement from all source files in the program, then also delete + * it in the license file. + */ #include "mongo/platform/basic.h" @@ -95,18 +95,19 @@ GlobalInitializerRegisterer authorizationManagerInitializer( {"SetupInternalSecurityUser", "OIDGeneration", "CreateAuthorizationExternalStateFactory", - "EndStartupOptionStorage"}, + "EndStartupOptionStorage", + "ServiceContext"}, [](InitializerContext* context) { auto authzManager = stdx::make_unique<AuthorizationManager>(AuthzManagerExternalState::create()); authzManager->setAuthEnabled(serverGlobalParams.authState == ServerGlobalParams::AuthState::kEnabled); authzManager->setShouldValidateAuthSchemaOnStartup(startupAuthSchemaValidation); - AuthorizationManager::set(context->serviceContext(), std::move(authzManager)); + AuthorizationManager::set(getGlobalServiceContext(), std::move(authzManager)); return Status::OK(); }, [](DeinitializerContext* context) { - AuthorizationManager::set(context->serviceContext(), nullptr); + AuthorizationManager::set(getGlobalServiceContext(), nullptr); return Status::OK(); }); diff --git a/src/mongo/db/auth/sasl_mechanism_registry.cpp b/src/mongo/db/auth/sasl_mechanism_registry.cpp index 6bd5417b288..4daebdb5542 100644 --- a/src/mongo/db/auth/sasl_mechanism_registry.cpp +++ b/src/mongo/db/auth/sasl_mechanism_registry.cpp @@ -126,6 +126,7 @@ bool SASLServerMechanismRegistry::_mechanismSupportedByConfig(StringData mechNam GlobalInitializerRegisterer SASLServerMechanismRegistryInitializer( "CreateSASLServerMechanismRegistry", + {"ServiceContext"}, [](InitializerContext* context) { if (saslGlobalParams.hostName.empty()) saslGlobalParams.hostName = getHostNameCached(); @@ -133,11 +134,11 @@ GlobalInitializerRegisterer SASLServerMechanismRegistryInitializer( saslGlobalParams.serviceName = "mongodb"; auto registry = stdx::make_unique<SASLServerMechanismRegistry>(); - SASLServerMechanismRegistry::set(context->serviceContext(), std::move(registry)); + SASLServerMechanismRegistry::set(getGlobalServiceContext(), std::move(registry)); return Status::OK(); }, [](DeinitializerContext* context) { - SASLServerMechanismRegistry::set(context->serviceContext(), nullptr); + SASLServerMechanismRegistry::set(getGlobalServiceContext(), nullptr); return Status::OK(); }); diff --git a/src/mongo/db/db.cpp b/src/mongo/db/db.cpp index e22cf803e4b..ce59dfe90f8 100644 --- a/src/mongo/db/db.cpp +++ b/src/mongo/db/db.cpp @@ -772,7 +772,8 @@ auto makeReplicationExecutor(ServiceContext* serviceContext) { executor::makeNetworkInterface("Replication", nullptr, std::move(hookList))); } -MONGO_INITIALIZER_WITH_PREREQUISITES(CreateReplicationManager, ("SSLManager", "default")) +MONGO_INITIALIZER_WITH_PREREQUISITES(CreateReplicationManager, + ("SSLManager", "ServiceContext", "default")) (InitializerContext* context) { auto serviceContext = getGlobalServiceContext(); repl::StorageInterface::set(serviceContext, stdx::make_unique<repl::StorageInterfaceImpl>()); @@ -953,8 +954,7 @@ int mongoDbMain(int argc, char* argv[], char** envp) { srand(static_cast<unsigned>(curTimeMicros64())); - setGlobalServiceContext(createServiceContext()); - Status status = mongo::runGlobalInitializers(argc, argv, envp, getGlobalServiceContext()); + Status status = mongo::runGlobalInitializers(argc, argv, envp); if (!status.isOK()) { severe(LogComponent::kControl) << "Failed global initialization: " << status; quickExit(EXIT_FAILURE); diff --git a/src/mongo/db/query/collation/collator_factory_icu_decoration.cpp b/src/mongo/db/query/collation/collator_factory_icu_decoration.cpp index e37ce036511..c2a4922071f 100644 --- a/src/mongo/db/query/collation/collator_factory_icu_decoration.cpp +++ b/src/mongo/db/query/collation/collator_factory_icu_decoration.cpp @@ -37,7 +37,7 @@ namespace mongo { namespace { -MONGO_INITIALIZER_WITH_PREREQUISITES(CreateCollatorFactory, ("LoadICUData")) +MONGO_INITIALIZER_WITH_PREREQUISITES(CreateCollatorFactory, ("ServiceContext", "LoadICUData")) (InitializerContext* context) { CollatorFactoryInterface::set(getGlobalServiceContext(), stdx::make_unique<CollatorFactoryICU>()); diff --git a/src/mongo/db/query/datetime/init_timezone_data.cpp b/src/mongo/db/query/datetime/init_timezone_data.cpp index 0c17cca0457..18a842f231c 100644 --- a/src/mongo/db/query/datetime/init_timezone_data.cpp +++ b/src/mongo/db/query/datetime/init_timezone_data.cpp @@ -39,8 +39,8 @@ namespace mongo { -MONGO_INITIALIZER_WITH_PREREQUISITES(LoadTimeZoneDB, - ("GlobalLogManager", "EndStartupOptionStorage")) +MONGO_INITIALIZER_WITH_PREREQUISITES( + LoadTimeZoneDB, ("GlobalLogManager", "EndStartupOptionStorage", "ServiceContext")) (InitializerContext* context) { auto serviceContext = getGlobalServiceContext(); if (!serverGlobalParams.timeZoneInfoPath.empty()) { diff --git a/src/mongo/db/service_context_registrar.cpp b/src/mongo/db/service_context_registrar.cpp index 26aa48ac15b..061936c98ec 100644 --- a/src/mongo/db/service_context_registrar.cpp +++ b/src/mongo/db/service_context_registrar.cpp @@ -1,33 +1,36 @@ /** -* Copyright (C) 2018 MongoDB Inc. -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU Affero General Public License, version 3, -* as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU Affero General Public License for more details. -* -* You should have received a copy of the GNU Affero General Public License -* along with this program. If not, see <http://www.gnu.org/licenses/>. -* -* As a special exception, the copyright holders give permission to link the -* code of portions of this program with the OpenSSL library under certain -* conditions as described in each individual source file and distribute -* linked combinations including the program with the OpenSSL library. You -* must comply with the GNU Affero General Public License in all respects for -* all of the code used other than as permitted herein. If you modify file(s) -* with this exception, you may extend this exception to your version of the -* file(s), but you are not obligated to do so. If you do not wish to do so, -* delete this exception statement from your version. If you delete this -* exception statement from all source files in the program, then also delete -* it in the license file. -*/ + * Copyright (C) 2018 MongoDB Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * As a special exception, the copyright holders give permission to link the + * code of portions of this program with the OpenSSL library under certain + * conditions as described in each individual source file and distribute + * linked combinations including the program with the OpenSSL library. You + * must comply with the GNU Affero General Public License in all respects for + * all of the code used other than as permitted herein. If you modify file(s) + * with this exception, you may extend this exception to your version of the + * file(s), but you are not obligated to do so. If you do not wish to do so, + * delete this exception statement from your version. If you delete this + * exception statement from all source files in the program, then also delete + * it in the license file. + */ + +#include "mongo/platform/basic.h" #include "mongo/db/service_context_registrar.h" +#include "mongo/base/init.h" #include "mongo/db/service_context.h" namespace mongo { @@ -36,19 +39,32 @@ std::function<std::unique_ptr<ServiceContext>()>& getServiceContextFactory() { static std::function<std::unique_ptr<ServiceContext>()> factory; return factory; } -} + +// clang-format off +GlobalInitializerRegisterer registerCreateServiceContext{ + "ServiceContext", + {"default"}, + [](InitializerContext* context) { + // Set the global service context if a service context factory was previously registered. + if (getServiceContextFactory()) { + setGlobalServiceContext(getServiceContextFactory()()); + } + return Status::OK(); + }, + [](DeinitializerContext* context) { + // For now, deregistration is done manually after all deinitializers run, in case any + // erroneously access the globalServiceContext without expressing a dependency. + return Status::OK(); + } +}; +// clang-format on + +} // namespace ServiceContextRegistrar::ServiceContextRegistrar( std::function<std::unique_ptr<ServiceContext>()> fn) { - invariant(!hasServiceContextFactory()); + invariant(!getServiceContextFactory()); getServiceContextFactory() = std::move(fn); } -bool hasServiceContextFactory() { - return getServiceContextFactory() ? true : false; -} - -std::unique_ptr<ServiceContext> createServiceContext() { - return getServiceContextFactory()(); -} } // namespace mongo diff --git a/src/mongo/db/service_context_registrar.h b/src/mongo/db/service_context_registrar.h index 2317d8862f6..72f6e6ea2dd 100644 --- a/src/mongo/db/service_context_registrar.h +++ b/src/mongo/db/service_context_registrar.h @@ -43,6 +43,4 @@ public: explicit ServiceContextRegistrar(std::function<std::unique_ptr<ServiceContext>()> fn); }; -bool hasServiceContextFactory(); -std::unique_ptr<ServiceContext> createServiceContext(); } // namespace mongo diff --git a/src/mongo/db/storage/devnull/devnull_init.cpp b/src/mongo/db/storage/devnull/devnull_init.cpp index dff10077427..c3df87cda3e 100644 --- a/src/mongo/db/storage/devnull/devnull_init.cpp +++ b/src/mongo/db/storage/devnull/devnull_init.cpp @@ -64,7 +64,7 @@ public: }; } // namespace -MONGO_INITIALIZER(DevNullEngineInit) +MONGO_INITIALIZER_WITH_PREREQUISITES(DevNullEngineInit, ("ServiceContext")) (InitializerContext* context) { getGlobalServiceContext()->registerStorageEngine("devnull", new DevNullStorageEngineFactory()); return Status::OK(); diff --git a/src/mongo/db/storage/encryption_hooks.cpp b/src/mongo/db/storage/encryption_hooks.cpp index bb5c60a29b8..ffa7f319a06 100644 --- a/src/mongo/db/storage/encryption_hooks.cpp +++ b/src/mongo/db/storage/encryption_hooks.cpp @@ -43,12 +43,13 @@ namespace mongo { /* Make a EncryptionHooks pointer a decoration on the global ServiceContext */ GlobalInitializerRegisterer encryptionHooksInitializer( "SetEncryptionHooks", + {"ServiceContext"}, [](InitializerContext* context) { - EncryptionHooks::set(context->serviceContext(), stdx::make_unique<EncryptionHooks>()); + EncryptionHooks::set(getGlobalServiceContext(), stdx::make_unique<EncryptionHooks>()); return Status::OK(); }, [](DeinitializerContext* context) { - EncryptionHooks::set(context->serviceContext(), nullptr); + EncryptionHooks::set(getGlobalServiceContext(), nullptr); return Status::OK(); }); diff --git a/src/mongo/db/storage/ephemeral_for_test/ephemeral_for_test_init.cpp b/src/mongo/db/storage/ephemeral_for_test/ephemeral_for_test_init.cpp index 1c5fff52e8b..8922776255f 100644 --- a/src/mongo/db/storage/ephemeral_for_test/ephemeral_for_test_init.cpp +++ b/src/mongo/db/storage/ephemeral_for_test/ephemeral_for_test_init.cpp @@ -70,7 +70,7 @@ public: } // namespace -MONGO_INITIALIZER(EphemeralForTestEngineInit) +MONGO_INITIALIZER_WITH_PREREQUISITES(EphemeralForTestEngineInit, ("ServiceContext")) (InitializerContext* context) { getGlobalServiceContext()->registerStorageEngine("ephemeralForTest", new EphemeralForTestFactory()); diff --git a/src/mongo/db/storage/mmap_v1/mmap_v1_init.cpp b/src/mongo/db/storage/mmap_v1/mmap_v1_init.cpp index 08f586f2035..3bce0e22fba 100644 --- a/src/mongo/db/storage/mmap_v1/mmap_v1_init.cpp +++ b/src/mongo/db/storage/mmap_v1/mmap_v1_init.cpp @@ -76,7 +76,7 @@ public: } // namespace -MONGO_INITIALIZER(MMAPV1EngineInit) +MONGO_INITIALIZER_WITH_PREREQUISITES(MMAPV1EngineInit, ("ServiceContext")) (InitializerContext* context) { getGlobalServiceContext()->registerStorageEngine("mmapv1", new MMAPV1Factory()); return Status::OK(); diff --git a/src/mongo/db/storage/mobile/mobile_init.cpp b/src/mongo/db/storage/mobile/mobile_init.cpp index c9d895d0332..edadad22887 100644 --- a/src/mongo/db/storage/mobile/mobile_init.cpp +++ b/src/mongo/db/storage/mobile/mobile_init.cpp @@ -72,8 +72,9 @@ public: GlobalInitializerRegisterer mobileKVEngineInitializer( "MobileKVEngineInit", + {"ServiceContext"}, [](InitializerContext* context) { - context->serviceContext()->registerStorageEngine("mobile", new MobileFactory()); + getGlobalServiceContext()->registerStorageEngine("mobile", new MobileFactory()); return Status::OK(); }, [](DeinitializerContext* const) { return Status::OK(); }); diff --git a/src/mongo/db/storage/wiredtiger/wiredtiger_customization_hooks.cpp b/src/mongo/db/storage/wiredtiger/wiredtiger_customization_hooks.cpp index dfc59b26f3f..3d4d7ccb3cf 100644 --- a/src/mongo/db/storage/wiredtiger/wiredtiger_customization_hooks.cpp +++ b/src/mongo/db/storage/wiredtiger/wiredtiger_customization_hooks.cpp @@ -39,7 +39,7 @@ namespace mongo { /* Make a WiredTigerCustomizationHooks pointer a decoration on the global ServiceContext */ -MONGO_INITIALIZER(SetWiredTigerCustomizationHooks) +MONGO_INITIALIZER_WITH_PREREQUISITES(SetWiredTigerCustomizationHooks, ("ServiceContext")) (InitializerContext* context) { auto customizationHooks = stdx::make_unique<WiredTigerCustomizationHooks>(); WiredTigerCustomizationHooks::set(getGlobalServiceContext(), std::move(customizationHooks)); diff --git a/src/mongo/db/storage/wiredtiger/wiredtiger_extensions.cpp b/src/mongo/db/storage/wiredtiger/wiredtiger_extensions.cpp index b0149c0b5aa..b2df3f8c99c 100644 --- a/src/mongo/db/storage/wiredtiger/wiredtiger_extensions.cpp +++ b/src/mongo/db/storage/wiredtiger/wiredtiger_extensions.cpp @@ -38,7 +38,7 @@ namespace mongo { -MONGO_INITIALIZER(SetWiredTigerExtensions) +MONGO_INITIALIZER_WITH_PREREQUISITES(SetWiredTigerExtensions, ("ServiceContext")) (InitializerContext* context) { auto configHooks = stdx::make_unique<WiredTigerExtensions>(); WiredTigerExtensions::set(getGlobalServiceContext(), std::move(configHooks)); diff --git a/src/mongo/db/storage/wiredtiger/wiredtiger_init.cpp b/src/mongo/db/storage/wiredtiger/wiredtiger_init.cpp index 3419b3a93e3..26ce1200659 100644 --- a/src/mongo/db/storage/wiredtiger/wiredtiger_init.cpp +++ b/src/mongo/db/storage/wiredtiger/wiredtiger_init.cpp @@ -180,7 +180,7 @@ public: }; } // namespace -MONGO_INITIALIZER(WiredTigerEngineInit) +MONGO_INITIALIZER_WITH_PREREQUISITES(WiredTigerEngineInit, ("ServiceContext")) (InitializerContext* context) { getGlobalServiceContext()->registerStorageEngine(kWiredTigerEngineName, new WiredTigerFactory()); diff --git a/src/mongo/dbtests/dbtests.cpp b/src/mongo/dbtests/dbtests.cpp index 53ecaaa74e9..91d32f7e032 100644 --- a/src/mongo/dbtests/dbtests.cpp +++ b/src/mongo/dbtests/dbtests.cpp @@ -132,8 +132,7 @@ int dbtestsMain(int argc, char** argv, char** envp) { ::mongo::setupSynchronousSignalHandlers(); mongo::dbtests::initWireSpec(); - setGlobalServiceContext(createServiceContext()); - mongo::runGlobalInitializersOrDie(argc, argv, envp, getGlobalServiceContext()); + mongo::runGlobalInitializersOrDie(argc, argv, envp); serverGlobalParams.featureCompatibility.setVersion( ServerGlobalParams::FeatureCompatibility::Version::kFullyUpgradedTo40); repl::ReplSettings replSettings; diff --git a/src/mongo/s/server.cpp b/src/mongo/s/server.cpp index b35b3ed28ab..627cdf44a3c 100644 --- a/src/mongo/s/server.cpp +++ b/src/mongo/s/server.cpp @@ -581,8 +581,7 @@ ExitCode mongoSMain(int argc, char* argv[], char** envp) { setupSignalHandlers(); - setGlobalServiceContext(createServiceContext()); - Status status = runGlobalInitializers(argc, argv, envp, getGlobalServiceContext()); + Status status = runGlobalInitializers(argc, argv, envp); if (!status.isOK()) { severe(LogComponent::kDefault) << "Failed global initialization: " << status; return EXIT_ABRUPT; diff --git a/src/mongo/shell/dbshell.cpp b/src/mongo/shell/dbshell.cpp index 81d4ecdc85d..9155154a4dd 100644 --- a/src/mongo/shell/dbshell.cpp +++ b/src/mongo/shell/dbshell.cpp @@ -741,8 +741,7 @@ int _main(int argc, char* argv[], char** envp) { mongo::shell_utils::RecordMyLocation(argv[0]); - setGlobalServiceContext(createServiceContext()); - mongo::runGlobalInitializersOrDie(argc, argv, envp, getGlobalServiceContext()); + mongo::runGlobalInitializersOrDie(argc, argv, envp); // TODO This should use a TransportLayerManager or TransportLayerFactory auto serviceContext = getGlobalServiceContext(); diff --git a/src/mongo/tools/bridge.cpp b/src/mongo/tools/bridge.cpp index 7d4a1f10e8c..876f178fd40 100644 --- a/src/mongo/tools/bridge.cpp +++ b/src/mongo/tools/bridge.cpp @@ -413,8 +413,7 @@ int bridgeMain(int argc, char** argv, char** envp) { }); setupSignalHandlers(); - setGlobalServiceContext(createServiceContext()); - runGlobalInitializersOrDie(argc, argv, envp, getGlobalServiceContext()); + runGlobalInitializersOrDie(argc, argv, envp); startSignalProcessingThread(LogFileStatus::kNoLogFileToRotate); auto serviceContext = getGlobalServiceContext(); diff --git a/src/mongo/transport/transport_layer_egress_init.cpp b/src/mongo/transport/transport_layer_egress_init.cpp index 279bd05b6ce..628cf6c2dfc 100644 --- a/src/mongo/transport/transport_layer_egress_init.cpp +++ b/src/mongo/transport/transport_layer_egress_init.cpp @@ -38,7 +38,7 @@ namespace mongo { namespace { // Linking with this file will configure an egress-only TransportLayer on a ServiceContextNoop. // Use this for unit/integration tests that require only egress networking. -MONGO_INITIALIZER(ConfigureEgressTransportLayer) +MONGO_INITIALIZER_WITH_PREREQUISITES(ConfigureEgressTransportLayer, ("ServiceContext")) (InitializerContext* context) { auto sc = getGlobalServiceContext(); invariant(!sc->getTransportLayer()); diff --git a/src/mongo/unittest/SConscript b/src/mongo/unittest/SConscript index dbc75f2f62f..dbc359e6787 100644 --- a/src/mongo/unittest/SConscript +++ b/src/mongo/unittest/SConscript @@ -21,8 +21,7 @@ env.Library(target="unittest", env.Library("unittest_main", ['unittest_main.cpp'], LIBDEPS=[ 'unittest', - '$BUILD_DIR/mongo/db/service_context', - ]) + ]) env.Library(target="integration_test_main", source=[ @@ -48,7 +47,6 @@ bmEnv.Library( ], LIBDEPS=[ '$BUILD_DIR/mongo/base', - '$BUILD_DIR/mongo/db/service_context', '$BUILD_DIR/third_party/shim_benchmark', ], ) diff --git a/src/mongo/unittest/benchmark_main.cpp b/src/mongo/unittest/benchmark_main.cpp index 3d43c5d6ab4..a29168ad5d5 100644 --- a/src/mongo/unittest/benchmark_main.cpp +++ b/src/mongo/unittest/benchmark_main.cpp @@ -34,8 +34,6 @@ #include "mongo/base/initializer.h" #include "mongo/config.h" -#include "mongo/db/service_context.h" -#include "mongo/db/service_context_registrar.h" #include "mongo/util/log.h" #include "mongo/util/signal_handlers_synchronous.h" @@ -44,12 +42,7 @@ int main(int argc, char** argv, char** envp) { ::mongo::clearSignalMask(); ::mongo::setupSynchronousSignalHandlers(); - ::mongo::ServiceContext* serviceContext = nullptr; - if (::mongo::hasServiceContextFactory()) { - ::mongo::setGlobalServiceContext(::mongo::createServiceContext()); - serviceContext = ::mongo::getGlobalServiceContext(); - } - ::mongo::runGlobalInitializersOrDie(argc, argv, envp, serviceContext); + ::mongo::runGlobalInitializersOrDie(argc, argv, envp); // Copied from the BENCHMARK_MAIN macro. ::benchmark::Initialize(&argc, argv); diff --git a/src/mongo/unittest/integration_test_main.cpp b/src/mongo/unittest/integration_test_main.cpp index 382ea69b087..b4087176542 100644 --- a/src/mongo/unittest/integration_test_main.cpp +++ b/src/mongo/unittest/integration_test_main.cpp @@ -71,14 +71,7 @@ ConnectionString getFixtureConnectionString() { int main(int argc, char** argv, char** envp) { setupSynchronousSignalHandlers(); - - ::mongo::ServiceContext* serviceContext = nullptr; - if (::mongo::hasServiceContextFactory()) { - ::mongo::setGlobalServiceContext(::mongo::createServiceContext()); - serviceContext = ::mongo::getGlobalServiceContext(); - } - runGlobalInitializersOrDie(argc, argv, envp, serviceContext); - + runGlobalInitializersOrDie(argc, argv, envp); quickExit(unittest::Suite::run(std::vector<std::string>(), "", 1)); } diff --git a/src/mongo/unittest/unittest_main.cpp b/src/mongo/unittest/unittest_main.cpp index 496221a87f9..f3f0e63754d 100644 --- a/src/mongo/unittest/unittest_main.cpp +++ b/src/mongo/unittest/unittest_main.cpp @@ -33,8 +33,6 @@ #include "mongo/base/initializer.h" #include "mongo/base/status.h" -#include "mongo/db/service_context.h" -#include "mongo/db/service_context_registrar.h" #include "mongo/unittest/unittest.h" #include "mongo/util/options_parser/environment.h" #include "mongo/util/options_parser/option_section.h" @@ -47,12 +45,7 @@ int main(int argc, char** argv, char** envp) { ::mongo::clearSignalMask(); ::mongo::setupSynchronousSignalHandlers(); - ::mongo::ServiceContext* serviceContext = nullptr; - if (::mongo::hasServiceContextFactory()) { - ::mongo::setGlobalServiceContext(::mongo::createServiceContext()); - serviceContext = ::mongo::getGlobalServiceContext(); - } - ::mongo::runGlobalInitializersOrDie(argc, argv, envp, serviceContext); + ::mongo::runGlobalInitializersOrDie(argc, argv, envp); namespace moe = ::mongo::optionenvironment; moe::OptionsParser parser; |