summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Midvidy <amidvidy@gmail.com>2016-01-19 14:59:46 -0500
committerAdam Midvidy <amidvidy@gmail.com>2016-01-20 16:50:40 -0500
commit3648b01e9352a38de6ee312244700aebe8b2cd64 (patch)
tree1e8df28c398477b2edf7651061a632670ca85348
parentf210ee304a3b6eeb85a67305e6a97a32e1df3c81 (diff)
downloadmongo-3648b01e9352a38de6ee312244700aebe8b2cd64.tar.gz
SERVER-22230 add command-line setting for readOnly mode
-rw-r--r--jstests/noPassthrough/read_only_command_line.js19
-rw-r--r--src/mongo/db/mongod_options.cpp13
-rw-r--r--src/mongo/db/repl/replication_info.cpp1
-rw-r--r--src/mongo/db/storage/storage_init.cpp3
-rw-r--r--src/mongo/db/storage/storage_options.h2
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;