summaryrefslogtreecommitdiff
path: root/src/mongo/db/repl/oplog_fetcher.cpp
diff options
context:
space:
mode:
authorLingzhi Deng <lingzhi.deng@mongodb.com>2023-08-11 02:36:14 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2023-08-22 20:09:42 +0000
commit425a0454d12f2664f9e31002bbe4a386a25345b5 (patch)
tree9436e8346346e00d0e605e7cb2ab76553fb0ce1e /src/mongo/db/repl/oplog_fetcher.cpp
parent9db2af46617eedca6bcf1d8c0851cfad04061f5c (diff)
SERVER-79885: Oplog fetching getMore should only set null lastKnownCommittedOpTime for exhaust cursorsr7.0.1-rc0r7.0.1release-7.0.1
(cherry picked from commit eeac78cd8de74ca1cffb18eb4b798b8392df6192)
Diffstat (limited to 'src/mongo/db/repl/oplog_fetcher.cpp')
-rw-r--r--src/mongo/db/repl/oplog_fetcher.cpp17
1 files changed, 15 insertions, 2 deletions
diff --git a/src/mongo/db/repl/oplog_fetcher.cpp b/src/mongo/db/repl/oplog_fetcher.cpp
index d4687970b8d..eb6d92abecc 100644
--- a/src/mongo/db/repl/oplog_fetcher.cpp
+++ b/src/mongo/db/repl/oplog_fetcher.cpp
@@ -712,8 +712,21 @@ StatusWith<OplogFetcher::Documents> OplogFetcher::_getNextBatch() {
auto lastCommittedWithCurrentTerm =
_dataReplicatorExternalState->getCurrentTermAndLastCommittedOpTime();
if (lastCommittedWithCurrentTerm.value != OpTime::kUninitializedTerm) {
- _cursor->setCurrentTermAndLastCommittedOpTime(lastCommittedWithCurrentTerm.value,
- lastCommittedWithCurrentTerm.opTime);
+ if (!_cursor->isExhaust() && lastCommittedWithCurrentTerm.opTime.isNull()) {
+ // For non-exhaust cursors, only set the lastKnownCommittedOpTime when it is not
+ // a null opTime. This is to avoid sending null opTime again and again and
+ // triggering oplog empty batches every single time in case we can't advance our
+ // commit point (e.g. during initial sync).
+ _cursor->setCurrentTermAndLastCommittedOpTime(
+ lastCommittedWithCurrentTerm.value, boost::none);
+ } else {
+ // For exhaust cursors, it is safe to set a null lastKnownCommittedOpTime in the
+ // initial getMore because the sync source will update the exhaust cursor's
+ // lastKnownCommittedOpTime to the commit point sent in the last response after
+ // each oplog batch.
+ _cursor->setCurrentTermAndLastCommittedOpTime(
+ lastCommittedWithCurrentTerm.value, lastCommittedWithCurrentTerm.opTime);
+ }
}
_cursor->more();
}