summaryrefslogtreecommitdiff
path: root/src/mongo/embedded/embedded.cpp
diff options
context:
space:
mode:
authorGregory Wlodarek <gregory.wlodarek@mongodb.com>2018-11-01 18:51:15 -0400
committerGregory Wlodarek <gregory.wlodarek@mongodb.com>2018-11-08 18:35:00 -0500
commitaff889b39301472bd2143967938a3dba468dfc63 (patch)
tree2ee4fcec926d96a674690e390d5b916b4b9c7a3b /src/mongo/embedded/embedded.cpp
parent4fb38d9c10123321dada6fe1be477f9cb99732a7 (diff)
downloadmongo-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.cpp52
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";