diff options
author | Gregory Wlodarek <gregory.wlodarek@mongodb.com> | 2018-11-01 18:51:15 -0400 |
---|---|---|
committer | Gregory Wlodarek <gregory.wlodarek@mongodb.com> | 2018-11-08 18:35:00 -0500 |
commit | aff889b39301472bd2143967938a3dba468dfc63 (patch) | |
tree | 2ee4fcec926d96a674690e390d5b916b4b9c7a3b /src/mongo/embedded/embedded.cpp | |
parent | 4fb38d9c10123321dada6fe1be477f9cb99732a7 (diff) | |
download | mongo-aff889b39301472bd2143967938a3dba468dfc63.tar.gz |
SERVER-36473 Make a dedicated RAII class to manage Client lifetime
Diffstat (limited to 'src/mongo/embedded/embedded.cpp')
-rw-r--r-- | src/mongo/embedded/embedded.cpp | 52 |
1 files changed, 24 insertions, 28 deletions
diff --git a/src/mongo/embedded/embedded.cpp b/src/mongo/embedded/embedded.cpp index 7589bb22a44..5c54a5609a3 100644 --- a/src/mongo/embedded/embedded.cpp +++ b/src/mongo/embedded/embedded.cpp @@ -139,41 +139,37 @@ using std::endl; void shutdown(ServiceContext* srvContext) { - Client::initThreadIfNotAlready(); - auto const client = Client::getCurrent(); - auto const serviceContext = client->getServiceContext(); - invariant(srvContext == serviceContext); - - serviceContext->setKillAllOperations(); - - // We should always be able to acquire the global lock at shutdown. - // Close all open databases, shutdown storage engine and run all deinitializers. - auto shutdownOpCtx = serviceContext->makeOperationContext(client); { - UninterruptibleLockGuard noInterrupt(shutdownOpCtx->lockState()); - Lock::GlobalLock lk(shutdownOpCtx.get(), MODE_X); - DatabaseHolder::getDatabaseHolder().closeAll(shutdownOpCtx.get(), "shutdown"); + ThreadClient tc(srvContext); + auto const client = Client::getCurrent(); + auto const serviceContext = client->getServiceContext(); - LogicalSessionCache::set(serviceContext, nullptr); + serviceContext->setKillAllOperations(); - // Shut down the background periodic task runner - if (auto runner = serviceContext->getPeriodicRunner()) { - runner->shutdown(); - } + // We should always be able to acquire the global lock at shutdown. + // Close all open databases, shutdown storage engine and run all deinitializers. + auto shutdownOpCtx = serviceContext->makeOperationContext(client); + { + UninterruptibleLockGuard noInterrupt(shutdownOpCtx->lockState()); + Lock::GlobalLock lk(shutdownOpCtx.get(), MODE_X); + DatabaseHolder::getDatabaseHolder().closeAll(shutdownOpCtx.get(), "shutdown"); - // Global storage engine may not be started in all cases before we exit - if (serviceContext->getStorageEngine()) { - shutdownGlobalStorageEngineCleanly(serviceContext); - } + LogicalSessionCache::set(serviceContext, nullptr); - Status status = mongo::runGlobalDeinitializers(); - uassertStatusOKWithContext(status, "Global deinitilization failed"); - } - shutdownOpCtx.reset(); + // Shut down the background periodic task runner + if (auto runner = serviceContext->getPeriodicRunner()) { + runner->shutdown(); + } - if (Client::getCurrent()) - Client::destroy(); + // Global storage engine may not be started in all cases before we exit + if (serviceContext->getStorageEngine()) { + shutdownGlobalStorageEngineCleanly(serviceContext); + } + Status status = mongo::runGlobalDeinitializers(); + uassertStatusOKWithContext(status, "Global deinitilization failed"); + } + } setGlobalServiceContext(nullptr); log(LogComponent::kControl) << "now exiting"; |