diff options
author | Adam Midvidy <amidvidy@gmail.com> | 2016-01-19 14:59:46 -0500 |
---|---|---|
committer | Adam Midvidy <amidvidy@gmail.com> | 2016-01-20 16:50:40 -0500 |
commit | 3648b01e9352a38de6ee312244700aebe8b2cd64 (patch) | |
tree | 1e8df28c398477b2edf7651061a632670ca85348 | |
parent | f210ee304a3b6eeb85a67305e6a97a32e1df3c81 (diff) | |
download | mongo-3648b01e9352a38de6ee312244700aebe8b2cd64.tar.gz |
SERVER-22230 add command-line setting for readOnly mode
-rw-r--r-- | jstests/noPassthrough/read_only_command_line.js | 19 | ||||
-rw-r--r-- | src/mongo/db/mongod_options.cpp | 13 | ||||
-rw-r--r-- | src/mongo/db/repl/replication_info.cpp | 1 | ||||
-rw-r--r-- | src/mongo/db/storage/storage_init.cpp | 3 | ||||
-rw-r--r-- | src/mongo/db/storage/storage_options.h | 2 |
5 files changed, 37 insertions, 1 deletions
diff --git a/jstests/noPassthrough/read_only_command_line.js b/jstests/noPassthrough/read_only_command_line.js new file mode 100644 index 00000000000..c7eb52a1de3 --- /dev/null +++ b/jstests/noPassthrough/read_only_command_line.js @@ -0,0 +1,19 @@ +// Test that setting readOnly mode on the command line causes readOnly to be properly set in both +// isMaster and serverStatus output. +(function() { + "use strict"; + + var mongod = MongoRunner.runMongod(); + + // ensure dbpath gets set up. + assert.writeOK(mongod.getDB("foo").x.insert({x:1})); + + assert(!mongod.getDB("admin").isMaster().readOnly); + 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); +}()); diff --git a/src/mongo/db/mongod_options.cpp b/src/mongo/db/mongod_options.cpp index 22aa06653b4..8d4e22b8bfa 100644 --- a/src/mongo/db/mongod_options.cpp +++ b/src/mongo/db/mongod_options.cpp @@ -204,6 +204,14 @@ Status addMongodOptions(moe::OptionSection* options) { moe::Switch, "each database will be stored in a separate directory"); + storage_options.addOptionChaining( + "storage.readOnly", + "readOnly", + moe::Switch, + "enable read-only mode - if true the server will not accept writes.") + .setSources(moe::SourceAll); + + general_options.addOptionChaining( "noIndexBuildRetry", "noIndexBuildRetry", @@ -1016,6 +1024,11 @@ Status storeMongodOptions(const moe::Environment& params, const std::vector<std: if (params.count("storage.directoryPerDB")) { storageGlobalParams.directoryperdb = params["storage.directoryPerDB"].as<bool>(); } + + if (params.count("storage.readOnly")) { + storageGlobalParams.readOnly = params["storage.readOnly"].as<bool>(); + } + if (params.count("cpu")) { serverGlobalParams.cpu = params["cpu"].as<bool>(); } diff --git a/src/mongo/db/repl/replication_info.cpp b/src/mongo/db/repl/replication_info.cpp index 273deaa3bd9..211ba0ff89a 100644 --- a/src/mongo/db/repl/replication_info.cpp +++ b/src/mongo/db/repl/replication_info.cpp @@ -239,6 +239,7 @@ public: result.appendDate("localTime", jsTime()); result.append("maxWireVersion", WireSpec::instance().maxWireVersionIncoming); result.append("minWireVersion", WireSpec::instance().minWireVersionIncoming); + result.append("readOnly", storageGlobalParams.readOnly); return true; } } cmdismaster; diff --git a/src/mongo/db/storage/storage_init.cpp b/src/mongo/db/storage/storage_init.cpp index a90ddecfe25..bb4470e7ba4 100644 --- a/src/mongo/db/storage/storage_init.cpp +++ b/src/mongo/db/storage/storage_init.cpp @@ -55,7 +55,8 @@ public: virtual BSONObj generateSection(OperationContext* txn, const BSONElement& configElement) const { auto engine = txn->getClient()->getServiceContext()->getGlobalStorageEngine(); return BSON("name" << storageGlobalParams.engine << "supportsCommittedReads" - << bool(engine->getSnapshotManager())); + << bool(engine->getSnapshotManager()) << "readOnly" + << storageGlobalParams.readOnly); } } storageSSS; diff --git a/src/mongo/db/storage/storage_options.h b/src/mongo/db/storage/storage_options.h index ba20d76dd78..2e4f936e60e 100644 --- a/src/mongo/db/storage/storage_options.h +++ b/src/mongo/db/storage/storage_options.h @@ -99,6 +99,8 @@ struct StorageGlobalParams { // Do not set this value on production systems. // In almost every situation, you should use the default setting. AtomicDouble syncdelay{60.0}; // seconds between fsyncs + + bool readOnly = false; }; extern StorageGlobalParams storageGlobalParams; |