summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--jstests/noPassthrough/standalone_replication_recovery.js57
-rw-r--r--jstests/replsets/clean_shutdown_oplog_state.js3
-rw-r--r--jstests/replsets/temp_namespace_restart_as_standalone.js7
-rw-r--r--src/mongo/db/mongod_options.cpp13
-rw-r--r--src/mongo/db/repl/repl_settings.cpp18
-rw-r--r--src/mongo/db/repl/repl_settings.h9
-rw-r--r--src/mongo/db/repl/replication_coordinator_impl.cpp4
-rw-r--r--src/mongo/db/storage/wiredtiger/wiredtiger_index.cpp4
-rw-r--r--src/mongo/db/storage/wiredtiger/wiredtiger_record_store.cpp4
9 files changed, 73 insertions, 46 deletions
diff --git a/jstests/noPassthrough/standalone_replication_recovery.js b/jstests/noPassthrough/standalone_replication_recovery.js
index 18b19dc1b6f..67a5da61170 100644
--- a/jstests/noPassthrough/standalone_replication_recovery.js
+++ b/jstests/noPassthrough/standalone_replication_recovery.js
@@ -15,10 +15,6 @@
const collName = 'srr_coll';
const logLevel = tojson({storage: {recovery: 2}});
- // We must explicitly set the flag to null each time because ReplSetTest remembers options.
- const on = "";
- const off = null;
-
const rst = new ReplSetTest({
nodes: 2,
});
@@ -37,7 +33,8 @@
}
jsTestLog("Test that an empty standalone fails trying to recover.");
- assert.throws(() => rst.start(0, {noReplSet: true, recoverFromOplogAsStandalone: on}));
+ assert.throws(
+ () => rst.start(0, {noReplSet: true, setParameter: {recoverFromOplogAsStandalone: true}}));
jsTestLog("Initiating as a replica set.");
// Restart as a replica set node without the flag so we can add operations to the oplog.
@@ -76,49 +73,81 @@
assertDocsInColl(node, [3, 4, 5]);
jsTestLog("Test that a replica set node cannot start up with the parameter set.");
- assert.throws(() => rst.restart(0, {recoverFromOplogAsStandalone: on}));
+ assert.throws(() => rst.restart(0, {
+ setParameter: {recoverFromOplogAsStandalone: true, logComponentVerbosity: logLevel}
+ }));
jsTestLog("Test that on restart as a standalone we only see committed writes by default.");
- node = rst.start(node, {noReplSet: true}, true);
+ node =
+ rst.start(node, {noReplSet: true, setParameter: {logComponentVerbosity: logLevel}}, true);
reconnect(node);
assertDocsInColl(node, []);
jsTestLog("Test that on restart with the flag set we play recovery.");
- node = rst.restart(node, {noReplSet: true, recoverFromOplogAsStandalone: on});
+ node = rst.restart(node, {
+ noReplSet: true,
+ setParameter: {recoverFromOplogAsStandalone: true, logComponentVerbosity: logLevel}
+ });
reconnect(node);
assertDocsInColl(node, [3, 4, 5]);
jsTestLog("Test that we go into read-only mode.");
assert.commandFailedWithCode(getColl(node).insert({_id: 1}), ErrorCodes.IllegalOperation);
+ jsTestLog("Test that we cannot set the parameter during standalone runtime.");
+ assert.commandFailed(node.adminCommand({setParameter: 1, recoverFromOplogAsStandalone: true}));
+ assert.commandFailed(node.adminCommand({setParameter: 1, recoverFromOplogAsStandalone: false}));
+
jsTestLog("Test that on restart after standalone recovery we do not see replicated writes.");
- node = rst.restart(node, {noReplSet: true, recoverFromOplogAsStandalone: off});
+ node = rst.restart(node, {
+ noReplSet: true,
+ setParameter: {recoverFromOplogAsStandalone: false, logComponentVerbosity: logLevel}
+ });
reconnect(node);
assertDocsInColl(node, []);
assert.commandWorked(getColl(node).insert({_id: 6}));
assertDocsInColl(node, [6]);
- node = rst.restart(node, {noReplSet: true, recoverFromOplogAsStandalone: on});
+ node = rst.restart(node, {
+ noReplSet: true,
+ setParameter: {recoverFromOplogAsStandalone: true, logComponentVerbosity: logLevel}
+ });
reconnect(node);
assertDocsInColl(node, [3, 4, 5, 6]);
jsTestLog("Test that we can restart again as a replica set node.");
- node = rst.restart(node, {noReplSet: false, recoverFromOplogAsStandalone: off});
+ node = rst.restart(node, {
+ noReplSet: false,
+ setParameter: {recoverFromOplogAsStandalone: false, logComponentVerbosity: logLevel}
+ });
reconnect(node);
assert.eq(rst.getPrimary(), node);
assertDocsInColl(node, [3, 4, 5, 6]);
+ jsTestLog("Test that we cannot set the parameter during replica set runtime.");
+ assert.commandFailed(node.adminCommand({setParameter: 1, recoverFromOplogAsStandalone: true}));
+ assert.commandFailed(node.adminCommand({setParameter: 1, recoverFromOplogAsStandalone: false}));
+
jsTestLog("Test that we can still recover as a standalone.");
assert.commandWorked(getColl(node).insert({_id: 7}));
assertDocsInColl(node, [3, 4, 5, 6, 7]);
- node = rst.restart(node, {noReplSet: true, recoverFromOplogAsStandalone: off});
+ node = rst.restart(node, {
+ noReplSet: true,
+ setParameter: {recoverFromOplogAsStandalone: false, logComponentVerbosity: logLevel}
+ });
reconnect(node);
assertDocsInColl(node, [6]);
- node = rst.restart(node, {noReplSet: true, recoverFromOplogAsStandalone: on});
+ node = rst.restart(node, {
+ noReplSet: true,
+ setParameter: {recoverFromOplogAsStandalone: true, logComponentVerbosity: logLevel}
+ });
reconnect(node);
assertDocsInColl(node, [3, 4, 5, 6, 7]);
jsTestLog("Restart as a replica set node so that the test can complete successfully.");
- node = rst.restart(node, {noReplSet: false, recoverFromOplogAsStandalone: off});
+ node = rst.restart(node, {
+ noReplSet: false,
+ setParameter: {recoverFromOplogAsStandalone: false, logComponentVerbosity: logLevel}
+ });
reconnect(node);
assert.eq(rst.getPrimary(), node);
assertDocsInColl(node, [3, 4, 5, 6, 7]);
diff --git a/jstests/replsets/clean_shutdown_oplog_state.js b/jstests/replsets/clean_shutdown_oplog_state.js
index 6aec7f6dce3..2bd4be04439 100644
--- a/jstests/replsets/clean_shutdown_oplog_state.js
+++ b/jstests/replsets/clean_shutdown_oplog_state.js
@@ -60,7 +60,8 @@
var storageEngine = jsTest.options().storageEngine || "wiredTiger";
if (storageEngine === "wiredTiger") {
- options.recoverFromOplogAsStandalone = "";
+ options.setParameter = options.setParameter || {};
+ options.setParameter.recoverFromOplogAsStandalone = true;
}
var conn = MongoRunner.runMongod(options);
diff --git a/jstests/replsets/temp_namespace_restart_as_standalone.js b/jstests/replsets/temp_namespace_restart_as_standalone.js
index 8c91465882c..d6453576bb8 100644
--- a/jstests/replsets/temp_namespace_restart_as_standalone.js
+++ b/jstests/replsets/temp_namespace_restart_as_standalone.js
@@ -57,8 +57,11 @@
var storageEngine = jsTest.options().storageEngine || "wiredTiger";
if (storageEngine === "wiredTiger") {
- secondaryConn = MongoRunner.runMongod(
- {dbpath: secondaryConn.dbpath, noCleanData: true, recoverFromOplogAsStandalone: ""});
+ secondaryConn = MongoRunner.runMongod({
+ dbpath: secondaryConn.dbpath,
+ noCleanData: true,
+ setParameter: {recoverFromOplogAsStandalone: true}
+ });
} else {
secondaryConn = MongoRunner.runMongod({dbpath: secondaryConn.dbpath, noCleanData: true});
}
diff --git a/src/mongo/db/mongod_options.cpp b/src/mongo/db/mongod_options.cpp
index 61a1df60860..2b7dbce436d 100644
--- a/src/mongo/db/mongod_options.cpp
+++ b/src/mongo/db/mongod_options.cpp
@@ -364,15 +364,6 @@ Status addMongodOptions(moe::OptionSection* options) {
"size to use (in MB) for replication op log. default is 5% of disk space "
"(i.e. large is good)");
- replication_options
- .addOptionChaining("replication.recoverFromOplogAsStandalone",
- "recoverFromOplogAsStandalone",
- moe::Switch,
- "specifies that a standalone should execute replication recovery")
- .hidden()
- .incompatibleWith("replication.replSet")
- .incompatibleWith("replication.replSetName");
-
rs_options
.addOptionChaining("replication.replSet",
"replSet",
@@ -1071,10 +1062,6 @@ Status storeMongodOptions(const moe::Environment& params) {
replSettings.setOplogSizeBytes(x * 1024 * 1024);
invariant(replSettings.getOplogSizeBytes() > 0);
}
- if (params.count("replication.recoverFromOplogAsStandalone")) {
- replSettings.setShouldRecoverFromOplogAsStandalone(
- params["replication.recoverFromOplogAsStandalone"].as<bool>());
- }
if (params.count("cacheSize")) {
long x = params["cacheSize"].as<long>();
diff --git a/src/mongo/db/repl/repl_settings.cpp b/src/mongo/db/repl/repl_settings.cpp
index bf64b2bf057..6fe0e23c101 100644
--- a/src/mongo/db/repl/repl_settings.cpp
+++ b/src/mongo/db/repl/repl_settings.cpp
@@ -31,11 +31,21 @@
#include "mongo/platform/basic.h"
#include "mongo/db/repl/repl_settings.h"
+#include "mongo/db/server_parameters.h"
#include "mongo/util/log.h"
namespace mongo {
namespace repl {
+namespace {
+
+// Tells the server to perform replication recovery as a standalone.
+constexpr bool recoverFromOplogAsStandaloneDefault = false;
+MONGO_EXPORT_STARTUP_SERVER_PARAMETER(recoverFromOplogAsStandalone,
+ bool,
+ recoverFromOplogAsStandaloneDefault);
+
+} // namespace
std::string ReplSettings::ourSetName() const {
size_t sl = _replSetString.find('/');
@@ -60,8 +70,8 @@ std::string ReplSettings::getReplSetString() const {
return _replSetString;
}
-bool ReplSettings::getShouldRecoverFromOplogAsStandalone() const {
- return _shouldRecoverFromOplogAsStandalone;
+bool ReplSettings::shouldRecoverFromOplogAsStandalone() {
+ return recoverFromOplogAsStandalone;
}
ReplSettings::IndexPrefetchConfig ReplSettings::getPrefetchIndexMode() const {
@@ -84,10 +94,6 @@ void ReplSettings::setReplSetString(std::string replSetString) {
_replSetString = replSetString;
}
-void ReplSettings::setShouldRecoverFromOplogAsStandalone(bool shouldRecover) {
- _shouldRecoverFromOplogAsStandalone = shouldRecover;
-}
-
void ReplSettings::setPrefetchIndexMode(std::string prefetchIndexModeString) {
if (prefetchIndexModeString.empty()) {
_prefetchIndexMode = IndexPrefetchConfig::UNINITIALIZED;
diff --git a/src/mongo/db/repl/repl_settings.h b/src/mongo/db/repl/repl_settings.h
index 9f75c10d712..12853505a05 100644
--- a/src/mongo/db/repl/repl_settings.h
+++ b/src/mongo/db/repl/repl_settings.h
@@ -56,7 +56,11 @@ public:
*/
long long getOplogSizeBytes() const;
std::string getReplSetString() const;
- bool getShouldRecoverFromOplogAsStandalone() const;
+
+ /**
+ * Static getter for the 'recoverFromOplogAsStandalone' server parameter.
+ */
+ static bool shouldRecoverFromOplogAsStandalone();
/**
* Note: _prefetchIndexMode is initialized to UNINITIALIZED by default.
@@ -76,15 +80,12 @@ public:
void setOplogSizeBytes(long long oplogSizeBytes);
void setReplSetString(std::string replSetString);
void setPrefetchIndexMode(std::string prefetchIndexModeString);
- void setShouldRecoverFromOplogAsStandalone(bool shouldRecover);
private:
long long _oplogSizeBytes = 0; // --oplogSize
std::string _replSetString; // --replSet[/<seedlist>]
- bool _shouldRecoverFromOplogAsStandalone = false; // --shouldRecoverFromOplogAsStandalone
-
// --indexPrefetch
IndexPrefetchConfig _prefetchIndexMode = IndexPrefetchConfig::UNINITIALIZED;
};
diff --git a/src/mongo/db/repl/replication_coordinator_impl.cpp b/src/mongo/db/repl/replication_coordinator_impl.cpp
index c11f221f245..5ee1c69554c 100644
--- a/src/mongo/db/repl/replication_coordinator_impl.cpp
+++ b/src/mongo/db/repl/replication_coordinator_impl.cpp
@@ -736,7 +736,7 @@ void ReplicationCoordinatorImpl::_startDataReplication(OperationContext* opCtx,
void ReplicationCoordinatorImpl::startup(OperationContext* opCtx) {
if (!isReplEnabled()) {
- if (_settings.getShouldRecoverFromOplogAsStandalone()) {
+ if (ReplSettings::shouldRecoverFromOplogAsStandalone()) {
if (!_storage->supportsRecoverToStableTimestamp(opCtx->getServiceContext())) {
severe() << "Cannot use 'recoverFromOplogAsStandalone' with a storage engine that "
"does not support recover to stable timestamp.";
@@ -763,7 +763,7 @@ void ReplicationCoordinatorImpl::startup(OperationContext* opCtx) {
return;
}
invariant(_settings.usingReplSets());
- invariant(!_settings.getShouldRecoverFromOplogAsStandalone());
+ invariant(!ReplSettings::shouldRecoverFromOplogAsStandalone());
{
stdx::lock_guard<stdx::mutex> lk(_mutex);
diff --git a/src/mongo/db/storage/wiredtiger/wiredtiger_index.cpp b/src/mongo/db/storage/wiredtiger/wiredtiger_index.cpp
index 29010468711..7abac5b1855 100644
--- a/src/mongo/db/storage/wiredtiger/wiredtiger_index.cpp
+++ b/src/mongo/db/storage/wiredtiger/wiredtiger_index.cpp
@@ -248,7 +248,7 @@ StatusWith<std::string> WiredTigerIndex::generateCreateString(const std::string&
ss << generateAppMetadataString(desc);
bool replicatedWrites = getGlobalReplSettings().usingReplSets() ||
- getGlobalReplSettings().getShouldRecoverFromOplogAsStandalone();
+ repl::ReplSettings::shouldRecoverFromOplogAsStandalone();
if (WiredTigerUtil::useTableLogging(NamespaceString(desc.parentNS()), replicatedWrites)) {
ss << "log=(enabled=true)";
} else {
@@ -306,7 +306,7 @@ WiredTigerIndex::WiredTigerIndex(OperationContext* ctx,
if (!isReadOnly) {
bool replicatedWrites = getGlobalReplSettings().usingReplSets() ||
- getGlobalReplSettings().getShouldRecoverFromOplogAsStandalone();
+ repl::ReplSettings::shouldRecoverFromOplogAsStandalone();
uassertStatusOK(WiredTigerUtil::setTableLogging(
ctx,
uri,
diff --git a/src/mongo/db/storage/wiredtiger/wiredtiger_record_store.cpp b/src/mongo/db/storage/wiredtiger/wiredtiger_record_store.cpp
index 78ca842d694..cc6caed4705 100644
--- a/src/mongo/db/storage/wiredtiger/wiredtiger_record_store.cpp
+++ b/src/mongo/db/storage/wiredtiger/wiredtiger_record_store.cpp
@@ -596,7 +596,7 @@ StatusWith<std::string> WiredTigerRecordStore::generateCreateString(
ss << ")";
bool replicatedWrites = getGlobalReplSettings().usingReplSets() ||
- getGlobalReplSettings().getShouldRecoverFromOplogAsStandalone();
+ repl::ReplSettings::shouldRecoverFromOplogAsStandalone();
if (WiredTigerUtil::useTableLogging(NamespaceString(ns), replicatedWrites)) {
ss << ",log=(enabled=true)";
} else {
@@ -649,7 +649,7 @@ WiredTigerRecordStore::WiredTigerRecordStore(WiredTigerKVEngine* kvEngine,
if (!params.isReadOnly) {
bool replicatedWrites = getGlobalReplSettings().usingReplSets() ||
- getGlobalReplSettings().getShouldRecoverFromOplogAsStandalone();
+ repl::ReplSettings::shouldRecoverFromOplogAsStandalone();
uassertStatusOK(WiredTigerUtil::setTableLogging(
ctx, _uri, WiredTigerUtil::useTableLogging(NamespaceString(ns()), replicatedWrites)));
}