summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLingzhi Deng <lingzhi.deng@mongodb.com>2020-10-13 15:13:29 -0400
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-10-15 19:16:42 +0000
commit2ebea0648a4bd2d31abb5251d66b2b7925bb06a8 (patch)
tree9f8f74c44345c1771174ccb09bb5f091f76ca488
parent9f52be8cf511d4fe0b2aa8eb20e18c47a5bf097d (diff)
downloadmongo-2ebea0648a4bd2d31abb5251d66b2b7925bb06a8.tar.gz
SERVER-47898: Advancing lastDurable should advance lastApplied
-rw-r--r--src/mongo/db/repl/member_data.cpp15
1 files changed, 8 insertions, 7 deletions
diff --git a/src/mongo/db/repl/member_data.cpp b/src/mongo/db/repl/member_data.cpp
index aa5c5d3e850..87d526bf8c5 100644
--- a/src/mongo/db/repl/member_data.cpp
+++ b/src/mongo/db/repl/member_data.cpp
@@ -152,12 +152,14 @@ void MemberData::setLastDurableOpTimeAndWallTime(OpTimeAndWallTime opTime, Date_
invariant(opTime.opTime.isNull() || opTime.wallTime > Date_t());
_lastUpdate = now;
_lastUpdateStale = false;
+
// Since _lastDurableOpTime is set asynchronously from _lastAppliedOpTime, it is possible that
- // 'opTime' is ahead of _lastAppliedOpTime.
- if (_lastAppliedOpTime >= opTime.opTime) {
- _lastDurableOpTime = opTime.opTime;
- _lastDurableWallTime = opTime.wallTime;
- }
+ // 'opTime' is ahead of _lastAppliedOpTime. When we attempt to advance _lastDurableOpTime beyond
+ // _lastAppliedOpTime, we should also _lastAppliedOpTime.
+ advanceLastAppliedOpTimeAndWallTime(opTime, now);
+
+ _lastDurableOpTime = opTime.opTime;
+ _lastDurableWallTime = opTime.wallTime;
}
bool MemberData::advanceLastAppliedOpTimeAndWallTime(OpTimeAndWallTime opTime, Date_t now) {
@@ -176,8 +178,7 @@ bool MemberData::advanceLastDurableOpTimeAndWallTime(OpTimeAndWallTime opTime, D
_lastUpdate = now;
_lastUpdateStale = false;
if (_lastDurableOpTime < opTime.opTime) {
- _lastDurableOpTime = opTime.opTime;
- _lastDurableWallTime = opTime.wallTime;
+ setLastDurableOpTimeAndWallTime(opTime, now);
return true;
}
return false;