From 2ebea0648a4bd2d31abb5251d66b2b7925bb06a8 Mon Sep 17 00:00:00 2001 From: Lingzhi Deng Date: Tue, 13 Oct 2020 15:13:29 -0400 Subject: SERVER-47898: Advancing lastDurable should advance lastApplied --- src/mongo/db/repl/member_data.cpp | 15 ++++++++------- 1 file 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; -- cgit v1.2.1