summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Midvidy <amidvidy@gmail.com>2016-01-20 11:49:55 -0500
committerAdam Midvidy <amidvidy@gmail.com>2016-01-20 19:29:10 -0500
commitdafe72f68c482ee0fdbd737ff8e404b3b39df27a (patch)
treef2f551048f93a99a71a82e3a778d2f2d42d99669
parent3648b01e9352a38de6ee312244700aebe8b2cd64 (diff)
downloadmongo-dafe72f68c482ee0fdbd737ff8e404b3b39df27a.tar.gz
SERVER-22245 implement storage engine API changes for readOnly mode
-rw-r--r--jstests/noPassthrough/read_only_command_line.js10
-rw-r--r--src/mongo/db/operation_context.h7
-rw-r--r--src/mongo/db/service_context_d.cpp8
-rw-r--r--src/mongo/db/storage/SConscript4
-rw-r--r--src/mongo/db/storage/ephemeral_for_test/SConscript3
-rw-r--r--src/mongo/db/storage/kv/SConscript2
-rw-r--r--src/mongo/db/storage/mmap_v1/SConscript3
-rw-r--r--src/mongo/db/storage/mmap_v1/mmap_v1_init.cpp4
-rw-r--r--src/mongo/db/storage/storage_engine.h11
9 files changed, 44 insertions, 8 deletions
diff --git a/jstests/noPassthrough/read_only_command_line.js b/jstests/noPassthrough/read_only_command_line.js
index c7eb52a1de3..9da9b559e98 100644
--- a/jstests/noPassthrough/read_only_command_line.js
+++ b/jstests/noPassthrough/read_only_command_line.js
@@ -12,8 +12,10 @@
assert(!mongod.getDB("admin").serverStatus().storageEngine.readOnly);
MongoRunner.stopMongod(mongod);
- mongod = MongoRunner.runMongod({readOnly: ""});
- assert(mongod.getDB("admin").isMaster().readOnly);
- assert(mongod.getDB("admin").serverStatus().storageEngine.readOnly);
- MongoRunner.stopMongod(mongod);
+ // TODO: uncomment when readOnly mode is implemented in mmapv1.
+ //
+ // mongod = MongoRunner.runMongod({readOnly: ""});
+ // assert(mongod.getDB("admin").isMaster().readOnly);
+ // assert(mongod.getDB("admin").serverStatus().storageEngine.readOnly);
+ // MongoRunner.stopMongod(mongod);
}());
diff --git a/src/mongo/db/operation_context.h b/src/mongo/db/operation_context.h
index 3a7e3165dda..249b89bdf37 100644
--- a/src/mongo/db/operation_context.h
+++ b/src/mongo/db/operation_context.h
@@ -30,8 +30,9 @@
#include "mongo/base/disallow_copying.h"
#include "mongo/base/status.h"
-#include "mongo/db/storage/recovery_unit.h"
#include "mongo/db/concurrency/d_concurrency.h"
+#include "mongo/db/storage/recovery_unit.h"
+#include "mongo/db/storage/storage_options.h"
#include "mongo/db/write_concern_options.h"
#include "mongo/platform/atomic_word.h"
#include "mongo/util/decorable.h"
@@ -239,6 +240,9 @@ public:
: _txn(txn),
_committed(false),
_toplevel(txn->_ruState == OperationContext::kNotInUnitOfWork) {
+ uassert(ErrorCodes::IllegalOperation,
+ "Cannot execute a write operation in read-only mode",
+ !storageGlobalParams.readOnly);
_txn->lockState()->beginWriteUnitOfWork();
if (_toplevel) {
_txn->recoveryUnit()->beginUnitOfWork(_txn);
@@ -247,6 +251,7 @@ public:
}
~WriteUnitOfWork() {
+ dassert(!storageGlobalParams.readOnly);
if (!_committed) {
invariant(_txn->_ruState != OperationContext::kNotInUnitOfWork);
if (_toplevel) {
diff --git a/src/mongo/db/service_context_d.cpp b/src/mongo/db/service_context_d.cpp
index aa3a0181165..0a5965c03b8 100644
--- a/src/mongo/db/service_context_d.cpp
+++ b/src/mongo/db/service_context_d.cpp
@@ -140,6 +140,14 @@ void ServiceContextMongoD::initializeGlobalStorageEngine() {
<< 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);
// Validate options in metadata against current startup options.
diff --git a/src/mongo/db/storage/SConscript b/src/mongo/db/storage/SConscript
index 1215d5afbbd..d0468f266e1 100644
--- a/src/mongo/db/storage/SConscript
+++ b/src/mongo/db/storage/SConscript
@@ -95,6 +95,7 @@ env.Library(
'sorted_data_interface_test_unindex.cpp',
],
LIBDEPS=[
+ '$BUILD_DIR/mongo/db/storage/storage_options',
'$BUILD_DIR/mongo/db/service_context',
'$BUILD_DIR/mongo/unittest/unittest',
'index_entry_comparison',
@@ -128,8 +129,9 @@ env.Library(
'record_store_test_validate.cpp',
],
LIBDEPS=[
- '$BUILD_DIR/mongo/unittest/unittest',
'$BUILD_DIR/mongo/db/service_context',
+ '$BUILD_DIR/mongo/db/storage/storage_options',
+ '$BUILD_DIR/mongo/unittest/unittest',
],
LIBDEPS_TAGS=[
# Depends on newHarnessHelper, which does not have a unique definition
diff --git a/src/mongo/db/storage/ephemeral_for_test/SConscript b/src/mongo/db/storage/ephemeral_for_test/SConscript
index 0b4c4729200..7d535228988 100644
--- a/src/mongo/db/storage/ephemeral_for_test/SConscript
+++ b/src/mongo/db/storage/ephemeral_for_test/SConscript
@@ -66,7 +66,8 @@ env.CppUnitTest(
source=['ephemeral_for_test_engine_test.cpp',
],
LIBDEPS=[
- 'storage_ephemeral_for_test_core',
'$BUILD_DIR/mongo/db/storage/kv/kv_engine_test_harness',
+ '$BUILD_DIR/mongo/db/storage/storage_options',
+ 'storage_ephemeral_for_test_core',
],
)
diff --git a/src/mongo/db/storage/kv/SConscript b/src/mongo/db/storage/kv/SConscript
index de8e5d25d64..a9d538dca46 100644
--- a/src/mongo/db/storage/kv/SConscript
+++ b/src/mongo/db/storage/kv/SConscript
@@ -41,6 +41,7 @@ env.Library(
LIBDEPS=[
'$BUILD_DIR/mongo/base',
'$BUILD_DIR/mongo/db/storage/kv/kv_engine_core',
+ '$BUILD_DIR/mongo/db/storage/storage_options',
'kv_database_catalog_entry_core',
],
)
@@ -71,6 +72,7 @@ env.Library(
'kv_database_catalog_entry_get_index_mock.cpp'
],
LIBDEPS=[
+ '$BUILD_DIR/mongo/db/storage/storage_options',
'kv_database_catalog_entry_core',
'kv_engine_core',
'kv_storage_engine',
diff --git a/src/mongo/db/storage/mmap_v1/SConscript b/src/mongo/db/storage/mmap_v1/SConscript
index 42832eb115a..8f8d4343300 100644
--- a/src/mongo/db/storage/mmap_v1/SConscript
+++ b/src/mongo/db/storage/mmap_v1/SConscript
@@ -118,11 +118,12 @@ env.Library(
'record_store_v1_simple_iterator.cpp',
],
LIBDEPS= [
- 'extent',
'$BUILD_DIR/mongo/db/commands/server_status_core',
'$BUILD_DIR/mongo/db/service_context',
+ '$BUILD_DIR/mongo/db/storage/storage_options',
'$BUILD_DIR/mongo/util/concurrency/spin_lock',
'$BUILD_DIR/mongo/util/progress_meter',
+ 'extent',
]
)
diff --git a/src/mongo/db/storage/mmap_v1/mmap_v1_init.cpp b/src/mongo/db/storage/mmap_v1/mmap_v1_init.cpp
index 88667959dd3..832cc059ec8 100644
--- a/src/mongo/db/storage/mmap_v1/mmap_v1_init.cpp
+++ b/src/mongo/db/storage/mmap_v1/mmap_v1_init.cpp
@@ -68,6 +68,10 @@ public:
builder.appendBool("directoryPerDB", params.directoryperdb);
return builder.obj();
}
+
+ bool supportsReadOnly() const override {
+ return true;
+ }
};
} // namespace
diff --git a/src/mongo/db/storage/storage_engine.h b/src/mongo/db/storage/storage_engine.h
index 1cedafc2ba8..b31a296ac89 100644
--- a/src/mongo/db/storage/storage_engine.h
+++ b/src/mongo/db/storage/storage_engine.h
@@ -122,6 +122,17 @@ public:
* on restart.
*/
virtual BSONObj createMetadataOptions(const StorageGlobalParams& params) const = 0;
+
+ /**
+ * Returns whether the engine supports read-only mode. If read-only mode is enabled, the
+ * engine may be started on a read-only filesystem (either mounted read-only or with
+ * read-only permissions). If readOnly mode is enabled, it is undefined behavior to call
+ * methods that write data (e.g. insertRecord). This method is provided on the Factory
+ * because it must be called before the storageEngine is instantiated.
+ */
+ virtual bool supportsReadOnly() const {
+ return false;
+ }
};
/**