summaryrefslogtreecommitdiff
path: root/src/mongo/db/service_context_d.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/service_context_d.cpp')
-rw-r--r--src/mongo/db/service_context_d.cpp208
1 files changed, 0 insertions, 208 deletions
diff --git a/src/mongo/db/service_context_d.cpp b/src/mongo/db/service_context_d.cpp
index ca500ce6abe..b4595b97c98 100644
--- a/src/mongo/db/service_context_d.cpp
+++ b/src/mongo/db/service_context_d.cpp
@@ -43,7 +43,6 @@
#include "mongo/db/storage/storage_engine_lock_file.h"
#include "mongo/db/storage/storage_engine_metadata.h"
#include "mongo/db/storage/storage_options.h"
-#include "mongo/db/unclean_shutdown.h"
#include "mongo/stdx/memory.h"
#include "mongo/util/log.h"
#include "mongo/util/map_util.h"
@@ -70,213 +69,6 @@ ServiceContextMongoD::ServiceContextMongoD() = default;
ServiceContextMongoD::~ServiceContextMongoD() = default;
-void ServiceContextMongoD::createLockFile() {
- try {
- _lockFile.reset(new StorageEngineLockFile(storageGlobalParams.dbpath));
- } catch (const std::exception& ex) {
- uassert(28596,
- str::stream() << "Unable to determine status of lock file in the data directory "
- << storageGlobalParams.dbpath
- << ": "
- << ex.what(),
- false);
- }
- bool wasUnclean = _lockFile->createdByUncleanShutdown();
- auto openStatus = _lockFile->open();
- if (storageGlobalParams.readOnly && openStatus == ErrorCodes::IllegalOperation) {
- _lockFile.reset();
- } else {
- uassertStatusOK(openStatus);
- }
-
- if (wasUnclean) {
- if (storageGlobalParams.readOnly) {
- severe() << "Attempted to open dbpath in readOnly mode, but the server was "
- "previously not shut down cleanly.";
- fassertFailedNoTrace(34416);
- }
- warning() << "Detected unclean shutdown - " << _lockFile->getFilespec() << " is not empty.";
- startingAfterUncleanShutdown(this) = true;
- }
-}
-
-void ServiceContextMongoD::initializeGlobalStorageEngine() {
- // This should be set once.
- invariant(!getStorageEngine());
-
- // We should have a _lockFile or be in read-only mode. Confusingly, we can still have a lockFile
- // if we are in read-only mode. This can happen if the server is started in read-only mode on a
- // writable dbpath.
- invariant(_lockFile || storageGlobalParams.readOnly);
-
- const std::string dbpath = storageGlobalParams.dbpath;
- if (auto existingStorageEngine = StorageEngineMetadata::getStorageEngineForPath(dbpath)) {
- if (*existingStorageEngine == "mmapv1" ||
- (storageGlobalParams.engineSetByUser && storageGlobalParams.engine == "mmapv1")) {
- log() << startupWarningsLog;
- log() << "** WARNING: Support for MMAPV1 storage engine has been deprecated and will be"
- << startupWarningsLog;
- log() << "** removed in version 4.2. Please plan to migrate to the wiredTiger"
- << startupWarningsLog;
- log() << "** storage engine." << startupWarningsLog;
- log() << "** See http://dochub.mongodb.org/core/deprecated-mmapv1";
- log() << startupWarningsLog;
- }
-
- if (storageGlobalParams.engineSetByUser) {
- // Verify that the name of the user-supplied storage engine matches the contents of
- // the metadata file.
- const StorageEngine::Factory* factory =
- mapFindWithDefault(_storageFactories,
- storageGlobalParams.engine,
- static_cast<const StorageEngine::Factory*>(nullptr));
-
- if (factory) {
- uassert(28662,
- str::stream() << "Cannot start server. Detected data files in " << dbpath
- << " created by"
- << " the '"
- << *existingStorageEngine
- << "' storage engine, but the"
- << " specified storage engine was '"
- << factory->getCanonicalName()
- << "'.",
- factory->getCanonicalName() == *existingStorageEngine);
- }
- } else {
- // Otherwise set the active storage engine as the contents of the metadata file.
- log() << "Detected data files in " << dbpath << " created by the '"
- << *existingStorageEngine << "' storage engine, so setting the active"
- << " storage engine to '" << *existingStorageEngine << "'.";
- storageGlobalParams.engine = *existingStorageEngine;
- }
- } else if (!storageGlobalParams.engineSetByUser) {
- // Ensure the default storage engine is available with this build of mongod.
- uassert(28663,
- str::stream()
- << "Cannot start server. The default storage engine '"
- << storageGlobalParams.engine
- << "' is not available with this build of mongod. Please specify a different"
- << " storage engine explicitly, e.g. --storageEngine=mmapv1.",
- isRegisteredStorageEngine(storageGlobalParams.engine));
- } else if (storageGlobalParams.engineSetByUser && storageGlobalParams.engine == "mmapv1") {
- log() << startupWarningsLog;
- log() << "** WARNING: You have explicitly specified 'MMAPV1' storage engine in your"
- << startupWarningsLog;
- log() << "** config file or as a command line option. Support for the MMAPV1"
- << startupWarningsLog;
- log() << "** storage engine has been deprecated and will be removed in"
- << startupWarningsLog;
- log() << "** version 4.2. See http://dochub.mongodb.org/core/deprecated-mmapv1";
- log() << startupWarningsLog;
- }
-
- const std::string repairpath = storageGlobalParams.repairpath;
- uassert(40311,
- str::stream() << "Cannot start server. The command line option '--repairpath'"
- << " is only supported by the mmapv1 storage engine",
- repairpath.empty() || repairpath == dbpath || storageGlobalParams.engine == "mmapv1");
-
- const StorageEngine::Factory* factory = _storageFactories[storageGlobalParams.engine];
-
- uassert(18656,
- str::stream() << "Cannot start server with an unknown storage engine: "
- << storageGlobalParams.engine,
- factory);
-
- if (storageGlobalParams.readOnly) {
- uassert(34368,
- str::stream()
- << "Server was started in read-only mode, but the configured storage engine, "
- << storageGlobalParams.engine
- << ", does not support read-only operation",
- factory->supportsReadOnly());
- }
-
- std::unique_ptr<StorageEngineMetadata> metadata = StorageEngineMetadata::forPath(dbpath);
-
- if (storageGlobalParams.readOnly) {
- uassert(34415,
- "Server was started in read-only mode, but the storage metadata file was not"
- " found.",
- metadata.get());
- }
-
- // Validate options in metadata against current startup options.
- if (metadata.get()) {
- uassertStatusOK(factory->validateMetadata(*metadata, storageGlobalParams));
- }
-
- ScopeGuard guard = MakeGuard([&] {
- if (_lockFile) {
- _lockFile->close();
- }
- });
-
- setStorageEngine(
- std::unique_ptr<StorageEngine>(factory->create(storageGlobalParams, _lockFile.get())));
- getStorageEngine()->finishInit();
-
- if (_lockFile) {
- uassertStatusOK(_lockFile->writePid());
- }
-
- // Write a new metadata file if it is not present.
- if (!metadata.get()) {
- invariant(!storageGlobalParams.readOnly);
- metadata.reset(new StorageEngineMetadata(storageGlobalParams.dbpath));
- metadata->setStorageEngine(factory->getCanonicalName().toString());
- metadata->setStorageEngineOptions(factory->createMetadataOptions(storageGlobalParams));
- uassertStatusOK(metadata->write());
- }
-
- guard.Dismiss();
-
- _supportsDocLocking = getStorageEngine()->supportsDocLocking();
-}
-
-void ServiceContextMongoD::shutdownGlobalStorageEngineCleanly() {
- invariant(getStorageEngine());
- getStorageEngine()->cleanShutdown();
- if (_lockFile) {
- _lockFile->clearPidAndUnlock();
- }
-}
-
-void ServiceContextMongoD::registerStorageEngine(const std::string& name,
- const StorageEngine::Factory* factory) {
- // No double-registering.
- invariant(0 == _storageFactories.count(name));
-
- // Some sanity checks: the factory must exist,
- invariant(factory);
-
- // and all factories should be added before we pick a storage engine.
- invariant(!getStorageEngine());
-
- _storageFactories[name] = factory;
-}
-
-bool ServiceContextMongoD::isRegisteredStorageEngine(const std::string& name) {
- return _storageFactories.count(name);
-}
-
-StorageFactoriesIterator* ServiceContextMongoD::makeStorageFactoriesIterator() {
- return new StorageFactoriesIteratorMongoD(_storageFactories.begin(), _storageFactories.end());
-}
-
-StorageFactoriesIteratorMongoD::StorageFactoriesIteratorMongoD(const FactoryMapIterator& begin,
- const FactoryMapIterator& end)
- : _curr(begin), _end(end) {}
-
-bool StorageFactoriesIteratorMongoD::more() const {
- return _curr != _end;
-}
-
-const StorageEngine::Factory* StorageFactoriesIteratorMongoD::next() {
- return _curr++->second;
-}
-
std::unique_ptr<OperationContext> ServiceContextMongoD::_newOpCtx(Client* client, unsigned opId) {
invariant(&cc() == client);
auto opCtx = stdx::make_unique<OperationContext>(client, opId);