summaryrefslogtreecommitdiff
path: root/src/mongo/db/service_context_d_test_fixture.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/service_context_d_test_fixture.cpp')
-rw-r--r--src/mongo/db/service_context_d_test_fixture.cpp91
1 files changed, 29 insertions, 62 deletions
diff --git a/src/mongo/db/service_context_d_test_fixture.cpp b/src/mongo/db/service_context_d_test_fixture.cpp
index ae0e39a2ab4..3ae23161235 100644
--- a/src/mongo/db/service_context_d_test_fixture.cpp
+++ b/src/mongo/db/service_context_d_test_fixture.cpp
@@ -1,5 +1,5 @@
/**
- * Copyright (C) 2016 MongoDB Inc.
+ * Copyright (C) 2016-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,
@@ -30,48 +30,40 @@
#include "mongo/db/service_context_d_test_fixture.h"
+#include <memory>
+
#include "mongo/base/checked_cast.h"
-#include "mongo/db/catalog/database.h"
-#include "mongo/db/catalog/database_holder.h"
+#include "mongo/db/catalog/catalog_control.h"
#include "mongo/db/catalog/uuid_catalog.h"
-#include "mongo/db/client.h"
-#include "mongo/db/concurrency/write_conflict_exception.h"
-#include "mongo/db/curop.h"
-#include "mongo/db/db_raii.h"
+#include "mongo/db/concurrency/d_concurrency.h"
#include "mongo/db/logical_clock.h"
-#include "mongo/db/op_observer_noop.h"
#include "mongo/db/op_observer_registry.h"
-#include "mongo/db/service_context_d.h"
+#include "mongo/db/service_entry_point_mongod.h"
#include "mongo/db/storage/storage_engine_init.h"
#include "mongo/db/storage/storage_options.h"
-#include "mongo/stdx/memory.h"
#include "mongo/unittest/temp_dir.h"
#include "mongo/util/assert_util.h"
-#include "mongo/util/scopeguard.h"
namespace mongo {
-void ServiceContextMongoDTest::setUp() {
- Test::setUp();
- Client::initThread(getThreadName());
+ServiceContextMongoDTest::ServiceContextMongoDTest()
+ : ServiceContextMongoDTest("ephemeralForTest") {}
- auto const serviceContext = getServiceContext();
+ServiceContextMongoDTest::ServiceContextMongoDTest(std::string engine) {
- auto logicalClock = stdx::make_unique<LogicalClock>(serviceContext);
+ _stashedStorageParams.engine = std::exchange(storageGlobalParams.engine, std::move(engine));
+ _stashedStorageParams.engineSetByUser =
+ std::exchange(storageGlobalParams.engineSetByUser, true);
+
+ auto const serviceContext = getServiceContext();
+ serviceContext->setServiceEntryPoint(std::make_unique<ServiceEntryPointMongod>(serviceContext));
+ auto logicalClock = std::make_unique<LogicalClock>(serviceContext);
LogicalClock::set(serviceContext, std::move(logicalClock));
- if (!serviceContext->getStorageEngine()) {
- // When using the "ephemeralForTest" storage engine, it is fine for the temporary directory
- // to go away after the global storage engine is initialized.
- unittest::TempDir tempDir("service_context_d_test_fixture");
- storageGlobalParams.dbpath = tempDir.path();
- storageGlobalParams.engine = "ephemeralForTest";
- storageGlobalParams.engineSetByUser = true;
+ unittest::TempDir tempDir("service_context_d_test_fixture");
+ storageGlobalParams.dbpath = tempDir.path();
- createLockFile(serviceContext);
- initializeStorageEngine(serviceContext, StorageEngineInitFlags::kNone);
- serviceContext->setOpObserver(stdx::make_unique<OpObserverNoop>());
- }
+ initializeStorageEngine(serviceContext, StorageEngineInitFlags::kNone);
// Set up UUID Catalog observer. This is necessary because the Collection destructor contains an
// invariant to ensure the UUID corresponding to that Collection object is no longer associated
@@ -79,44 +71,19 @@ void ServiceContextMongoDTest::setUp() {
// directly in certain code paths, but they can only be removed from the UUIDCatalog via a
// UUIDCatalogObserver. It is therefore necessary to install the observer to ensure the
// invariant in the Collection destructor is not triggered.
- auto observerRegistry = stdx::make_unique<OpObserverRegistry>();
- observerRegistry->addObserver(stdx::make_unique<UUIDCatalogObserver>());
- serviceContext->setOpObserver(std::unique_ptr<OpObserver>(observerRegistry.release()));
-}
-
-void ServiceContextMongoDTest::tearDown() {
- ON_BLOCK_EXIT([&] { Client::destroy(); });
- auto opCtx = cc().makeOperationContext();
- _dropAllDBs(opCtx.get());
- Test::tearDown();
+ auto observerRegistry = checked_cast<OpObserverRegistry*>(serviceContext->getOpObserver());
+ observerRegistry->addObserver(std::make_unique<UUIDCatalogObserver>());
}
-ServiceContext* ServiceContextMongoDTest::getServiceContext() {
- return getGlobalServiceContext();
-}
-
-void ServiceContextMongoDTest::_doTest() {
- MONGO_UNREACHABLE;
-}
-
-void ServiceContextMongoDTest::_dropAllDBs(OperationContext* opCtx) {
- Database::dropAllDatabasesExceptLocal(opCtx);
-
- Lock::GlobalWrite lk(opCtx);
- AutoGetDb autoDBLocal(opCtx, "local", MODE_X);
- const auto localDB = autoDBLocal.getDb();
- if (localDB) {
- writeConflictRetry(opCtx, "_dropAllDBs", "local", [&] {
- // Do not wrap in a WriteUnitOfWork until SERVER-17103 is addressed.
- autoDBLocal.getDb()->dropDatabase(opCtx, localDB);
- });
+ServiceContextMongoDTest::~ServiceContextMongoDTest() {
+ {
+ auto opCtx = getClient()->makeOperationContext();
+ Lock::GlobalLock glk(opCtx.get(), MODE_X);
+ catalog::closeCatalog(opCtx.get());
}
-
- // Database::dropAllDatabasesExceptLocal() does not close empty databases. However the holder
- // still allocates resources to track these empty databases. These resources not released by
- // Database::dropAllDatabasesExceptLocal() will be leaked at exit unless we call
- // DatabaseHolder::closeAll.
- DatabaseHolder::getDatabaseHolder().closeAll(opCtx, "all databases dropped");
+ shutdownGlobalStorageEngineCleanly(getGlobalServiceContext());
+ std::swap(storageGlobalParams.engine, _stashedStorageParams.engine);
+ std::swap(storageGlobalParams.engineSetByUser, _stashedStorageParams.engineSetByUser);
}
} // namespace mongo