diff options
author | Adam Midvidy <amidvidy@gmail.com> | 2016-01-20 11:49:55 -0500 |
---|---|---|
committer | Adam Midvidy <amidvidy@gmail.com> | 2016-01-20 19:29:10 -0500 |
commit | dafe72f68c482ee0fdbd737ff8e404b3b39df27a (patch) | |
tree | f2f551048f93a99a71a82e3a778d2f2d42d99669 | |
parent | 3648b01e9352a38de6ee312244700aebe8b2cd64 (diff) | |
download | mongo-dafe72f68c482ee0fdbd737ff8e404b3b39df27a.tar.gz |
SERVER-22245 implement storage engine API changes for readOnly mode
-rw-r--r-- | jstests/noPassthrough/read_only_command_line.js | 10 | ||||
-rw-r--r-- | src/mongo/db/operation_context.h | 7 | ||||
-rw-r--r-- | src/mongo/db/service_context_d.cpp | 8 | ||||
-rw-r--r-- | src/mongo/db/storage/SConscript | 4 | ||||
-rw-r--r-- | src/mongo/db/storage/ephemeral_for_test/SConscript | 3 | ||||
-rw-r--r-- | src/mongo/db/storage/kv/SConscript | 2 | ||||
-rw-r--r-- | src/mongo/db/storage/mmap_v1/SConscript | 3 | ||||
-rw-r--r-- | src/mongo/db/storage/mmap_v1/mmap_v1_init.cpp | 4 | ||||
-rw-r--r-- | src/mongo/db/storage/storage_engine.h | 11 |
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; + } }; /** |