diff options
-rw-r--r-- | jstests/libs/check_log.js | 4 | ||||
-rw-r--r-- | jstests/replsets/initial_sync_oplog_visibility.js | 14 | ||||
-rw-r--r-- | src/mongo/db/repl/oplogreader.h | 6 | ||||
-rw-r--r-- | src/mongo/db/repl/rs_initialsync.cpp | 2 |
4 files changed, 21 insertions, 5 deletions
diff --git a/jstests/libs/check_log.js b/jstests/libs/check_log.js index edfd8b1d5cf..23b9b91b227 100644 --- a/jstests/libs/check_log.js +++ b/jstests/libs/check_log.js @@ -29,7 +29,7 @@ var checkLog; * the provided 'msg' is found in the logs, or 5 minutes have elapsed. Throws an exception * on timeout. */ - var contains = function(conn, msg) { + var contains = function(conn, msg, timeoutSeconds = 5 * 60) { assert.soon( function() { var logMessages = getGlobalLog(conn); @@ -44,7 +44,7 @@ var checkLog; return false; }, 'Could not find log entries containing the following message: ' + msg, - 5 * 60 * 1000, + timeoutSeconds * 1000, 300); }; diff --git a/jstests/replsets/initial_sync_oplog_visibility.js b/jstests/replsets/initial_sync_oplog_visibility.js index 9002a5f9b23..06eadc861b3 100644 --- a/jstests/replsets/initial_sync_oplog_visibility.js +++ b/jstests/replsets/initial_sync_oplog_visibility.js @@ -11,6 +11,8 @@ replTest.startSet(); replTest.initiate(); var primary = replTest.getPrimary(); + assert.commandWorked( + primary.adminCommand({setParameter: 1, logComponentVerbosity: {query: 3}})); var firstColl = "hangColl"; var secondColl = "secondColl"; @@ -48,5 +50,17 @@ awaitInsertShell(); replTest.awaitSecondaryNodes(); + // The oplog visibility query should use an oplog-optimized plan. Check vaguely for this by + // awaiting a characteristic log message for each storage engine - we at least know that *some* + // query used the optimal plan around the time of the visibility query. + const timeoutSeconds = 30; + if (primary.adminCommand("serverStatus").storageEngine.name === "wiredTiger") { + jsTestLog("Checking for log message about 'direct oplog seek' query plan."); + checkLog.contains(primary, "Using direct oplog seek", timeoutSeconds); + } else if (primary.adminCommand("serverStatus").storageEngine.name === "mmapv1") { + jsTestLog("Checking for log message about 'Using OplogStart stage'."); + checkLog.contains(primary, "Using OplogStart stage", timeoutSeconds); + } + replTest.stopSet(); })();
\ No newline at end of file diff --git a/src/mongo/db/repl/oplogreader.h b/src/mongo/db/repl/oplogreader.h index 3c983b007fc..3aeb5b7293d 100644 --- a/src/mongo/db/repl/oplogreader.h +++ b/src/mongo/db/repl/oplogreader.h @@ -84,8 +84,10 @@ public: DBClientConnection* conn() { return _conn.get(); } - BSONObj findOne(const char* ns, const Query& q) { - return conn()->findOne(ns, q, 0, QueryOption_SlaveOk); + BSONObj findOne(const char* ns, + const Query& q, + QueryOptions options = static_cast<QueryOptions>(0)) { + return conn()->findOne(ns, q, 0, QueryOption_SlaveOk | options); } BSONObj getLastOp(const std::string& ns) { return findOne(ns.c_str(), Query().sort(reverseNaturalObj)); diff --git a/src/mongo/db/repl/rs_initialsync.cpp b/src/mongo/db/repl/rs_initialsync.cpp index 3f8ff685de9..42a230e3d8a 100644 --- a/src/mongo/db/repl/rs_initialsync.cpp +++ b/src/mongo/db/repl/rs_initialsync.cpp @@ -368,7 +368,7 @@ Status _initialSync() { BSONObjBuilder queryBob; queryBob.append("ts", gte.done()); const BSONObj& query = queryBob.done(); - BSONObj lastOpConfirm = r.findOne(rsOplogName.c_str(), query); + BSONObj lastOpConfirm = r.findOne(rsOplogName.c_str(), query, QueryOption_OplogReplay); invariant(!lastOpConfirm.isEmpty()); OpTime lastOpConfirmTime = fassertStatusOK(40421, OpTime::parseFromOplogEntry(lastOpConfirm)); |