summaryrefslogtreecommitdiff
path: root/src/mongo/db/storage/storage_engine_metadata.cpp
diff options
context:
space:
mode:
authorBenety Goh <benety@mongodb.com>2015-01-07 16:46:58 -0500
committerBenety Goh <benety@mongodb.com>2015-01-09 14:17:31 -0500
commit354fcc2846cdef3666ed8aab7247193e2f665317 (patch)
tree20e3cfd56061043858c9903e64b81b15b255c729 /src/mongo/db/storage/storage_engine_metadata.cpp
parentaee446a97d7c3d7b6129348de6957d8e178864b2 (diff)
downloadmongo-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.cpp65
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