diff options
author | Benety Goh <benety@mongodb.com> | 2015-01-07 16:46:58 -0500 |
---|---|---|
committer | Benety Goh <benety@mongodb.com> | 2015-01-09 14:17:31 -0500 |
commit | 354fcc2846cdef3666ed8aab7247193e2f665317 (patch) | |
tree | 20e3cfd56061043858c9903e64b81b15b255c729 /src/mongo/db/storage/storage_engine_metadata.cpp | |
parent | aee446a97d7c3d7b6129348de6957d8e178864b2 (diff) | |
download | mongo-354fcc2846cdef3666ed8aab7247193e2f665317.tar.gz |
SERVER-16567 added StorageEngineMetadata support for optional storage engine BSON document
Diffstat (limited to 'src/mongo/db/storage/storage_engine_metadata.cpp')
-rw-r--r-- | src/mongo/db/storage/storage_engine_metadata.cpp | 65 |
1 files changed, 55 insertions, 10 deletions
diff --git a/src/mongo/db/storage/storage_engine_metadata.cpp b/src/mongo/db/storage/storage_engine_metadata.cpp index b83cfa3ce8e..8360418f112 100644 --- a/src/mongo/db/storage/storage_engine_metadata.cpp +++ b/src/mongo/db/storage/storage_engine_metadata.cpp @@ -1,5 +1,3 @@ -// storage_engine_metadata.cpp - /** * Copyright (C) 2014 MongoDB Inc. * @@ -64,14 +62,17 @@ namespace { } // namespace // static - void StorageEngineMetadata::validate(const std::string& dbpath, - const std::string& storageEngine) { + std::auto_ptr<StorageEngineMetadata> StorageEngineMetadata::validate( + const std::string& dbpath, + const std::string& storageEngine) { + + std::auto_ptr<StorageEngineMetadata> metadata; std::string previousStorageEngine; if (boost::filesystem::exists(boost::filesystem::path(dbpath) / kMetadataBasename)) { - StorageEngineMetadata metadata(dbpath); - Status status = metadata.read(); + metadata.reset(new StorageEngineMetadata(dbpath)); + Status status = metadata->read(); if (status.isOK()) { - previousStorageEngine = metadata.getStorageEngine(); + previousStorageEngine = metadata->getStorageEngine(); } else { // The storage metadata file is present but there was an issue @@ -82,12 +83,11 @@ namespace { } else if (containsMMapV1LocalNsFile(dbpath)) { previousStorageEngine = "mmapv1"; - } else { // Directory contains neither metadata nor mmapv1 files. // Allow validation to succeed. - return; + return metadata; } uassert(28574, str::stream() @@ -95,6 +95,8 @@ namespace { << " created by storage engine '" << previousStorageEngine << "'. The configured storage engine is '" << storageEngine << "'.", previousStorageEngine == storageEngine); + + return metadata; } // static @@ -126,16 +128,25 @@ namespace { void StorageEngineMetadata::reset() { _storageEngine.clear(); + _storageEngineOptions = BSONObj(); } const std::string& StorageEngineMetadata::getStorageEngine() const { return _storageEngine; } + const BSONObj& StorageEngineMetadata::getStorageEngineOptions() const { + return _storageEngineOptions; + } + void StorageEngineMetadata::setStorageEngine(const std::string& storageEngine) { _storageEngine = storageEngine; } + void StorageEngineMetadata::setStorageEngineOptions(const BSONObj& storageEngineOptions) { + _storageEngineOptions = storageEngineOptions.getOwned(); + } + Status StorageEngineMetadata::read() { reset(); @@ -204,6 +215,18 @@ namespace { "The 'storage.engine' field in metadata cannot be empty string."); } _storageEngine = storageEngine; + + // Read storage engine options generated by storage engine factory from startup options. + BSONElement storageEngineOptionsElement = obj.getFieldDotted("storage.options"); + if (!storageEngineOptionsElement.eoo()) { + if (!storageEngineOptionsElement.isABSONObj()) { + return Status(ErrorCodes::FailedToParse, str::stream() + << "The 'storage.options' field in metadata must be a string: " + << storageEngineOptionsElement.toString()); + } + setStorageEngineOptions(storageEngineOptionsElement.Obj()); + } + return Status::OK(); } @@ -223,7 +246,8 @@ namespace { << "Failed to write metadata to " << filenameTemp); } - BSONObj obj = BSON("storage" << BSON("engine" << _storageEngine)); + BSONObj obj = BSON("storage" + << BSON("engine" << _storageEngine << "options" << _storageEngineOptions)); ofs.write(obj.objdata(), obj.objsize()); if (!ofs) { return Status(ErrorCodes::InternalError, str::stream() @@ -247,4 +271,25 @@ namespace { return Status::OK(); } + template <> + Status StorageEngineMetadata::validateStorageEngineOption<bool>(const StringData& fieldName, + bool expectedValue) const { + BSONElement element = _storageEngineOptions.getField(fieldName); + if (element.eoo()) { + return Status::OK(); + } + if (!element.isBoolean()) { + return Status(ErrorCodes::FailedToParse, str::stream() + << "Expected boolean field " << fieldName << " but got " + << typeName(element.type()) << " instead: " << element); + } + if (element.boolean() == expectedValue) { + return Status::OK(); + } + return Status(ErrorCodes::InvalidOptions, str::stream() + << "Metadata contains unexpected value storage engine option for " << fieldName + << "Expected " << (expectedValue ? "true" : "false") << " but got " + << (element.boolean() ? "true" : "false") << "instead"); + } + } // namespace mongo |