summaryrefslogtreecommitdiff
path: root/src/mongo/db/repl/oplog_fetcher.cpp
diff options
context:
space:
mode:
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();
}