diff options
-rw-r--r-- | jstests/noPassthrough/standalone_replication_recovery.js | 57 | ||||
-rw-r--r-- | jstests/replsets/clean_shutdown_oplog_state.js | 3 | ||||
-rw-r--r-- | jstests/replsets/temp_namespace_restart_as_standalone.js | 7 | ||||
-rw-r--r-- | src/mongo/db/mongod_options.cpp | 13 | ||||
-rw-r--r-- | src/mongo/db/repl/repl_settings.cpp | 18 | ||||
-rw-r--r-- | src/mongo/db/repl/repl_settings.h | 9 | ||||
-rw-r--r-- | src/mongo/db/repl/replication_coordinator_impl.cpp | 4 | ||||
-rw-r--r-- | src/mongo/db/storage/wiredtiger/wiredtiger_index.cpp | 4 | ||||
-rw-r--r-- | src/mongo/db/storage/wiredtiger/wiredtiger_record_store.cpp | 4 |
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))); } |