summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorA. Jesse Jiryu Davis <jesse@mongodb.com>2020-08-01 08:50:55 -0400
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-08-01 13:08:49 +0000
commiteee49c64cdeb8fa95704b9a316b779eb5eb9800c (patch)
tree3fc48de236fe61f68143080eb9be77452f4ec9c8 /src
parent12e5de609fff3086168681a15133656509ccf42b (diff)
downloadmongo-eee49c64cdeb8fa95704b9a316b779eb5eb9800c.tar.gz
SERVER-48518 Fix rollback via refetch anomaly
Diffstat (limited to 'src')
-rw-r--r--src/mongo/db/repl/replication_coordinator_impl.cpp16
-rw-r--r--src/mongo/db/storage/storage_engine_impl.cpp1
-rw-r--r--src/mongo/db/storage/storage_engine_impl.h1
-rw-r--r--src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.cpp4
-rw-r--r--src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.h2
5 files changed, 16 insertions, 8 deletions
diff --git a/src/mongo/db/repl/replication_coordinator_impl.cpp b/src/mongo/db/repl/replication_coordinator_impl.cpp
index 0140ba94d06..83fe6464888 100644
--- a/src/mongo/db/repl/replication_coordinator_impl.cpp
+++ b/src/mongo/db/repl/replication_coordinator_impl.cpp
@@ -4991,6 +4991,22 @@ void ReplicationCoordinatorImpl::finishRecoveryIfEligible(OperationContext* opCt
return;
}
+ // Rolling back with eMRC false, we set initialDataTimestamp to max(local oplog top, source's
+ // oplog top), then rollback via refetch. Data is inconsistent until lastApplied >=
+ // initialDataTimestamp.
+ auto initialTs = opCtx->getServiceContext()->getStorageEngine()->getInitialDataTimestamp();
+ if (lastApplied.getTimestamp() < initialTs) {
+ invariant(!serverGlobalParams.enableMajorityReadConcern);
+ LOGV2_DEBUG(4851800,
+ 2,
+ "We cannot transition to SECONDARY state because our 'lastApplied' optime is "
+ "less than the initial data timestamp and enableMajorityReadConcern = false",
+ "minValid"_attr = minValid,
+ "lastApplied"_attr = lastApplied,
+ "initialDataTimestamp"_attr = initialTs);
+ return;
+ }
+
// Execute the transition to SECONDARY.
auto status = setFollowerMode(MemberState::RS_SECONDARY);
if (!status.isOK()) {
diff --git a/src/mongo/db/storage/storage_engine_impl.cpp b/src/mongo/db/storage/storage_engine_impl.cpp
index 37264db0224..45bf7d03dd2 100644
--- a/src/mongo/db/storage/storage_engine_impl.cpp
+++ b/src/mongo/db/storage/storage_engine_impl.cpp
@@ -852,7 +852,6 @@ void StorageEngineImpl::setStableTimestamp(Timestamp stableTimestamp, bool force
}
void StorageEngineImpl::setInitialDataTimestamp(Timestamp initialDataTimestamp) {
- _initialDataTimestamp = initialDataTimestamp;
_engine->setInitialDataTimestamp(initialDataTimestamp);
}
diff --git a/src/mongo/db/storage/storage_engine_impl.h b/src/mongo/db/storage/storage_engine_impl.h
index 316a02c3042..a00ff2b2369 100644
--- a/src/mongo/db/storage/storage_engine_impl.h
+++ b/src/mongo/db/storage/storage_engine_impl.h
@@ -404,7 +404,6 @@ private:
const bool _supportsDocLocking;
const bool _supportsCappedCollections;
- Timestamp _initialDataTimestamp = Timestamp::kAllowUnstableCheckpointsSentinel;
std::unique_ptr<RecordStore> _catalogRecordStore;
std::unique_ptr<DurableCatalogImpl> _catalog;
diff --git a/src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.cpp b/src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.cpp
index d59a0e8cd8b..476f1cd6ccb 100644
--- a/src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.cpp
+++ b/src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.cpp
@@ -2415,10 +2415,6 @@ Timestamp WiredTigerKVEngine::getCheckpointTimestamp() const {
return Timestamp(_getCheckpointTimestamp());
}
-Timestamp WiredTigerKVEngine::getInitialDataTimestamp() const {
- return Timestamp(_initialDataTimestamp.load());
-}
-
std::uint64_t WiredTigerKVEngine::_getCheckpointTimestamp() const {
char buf[(2 * 8 /*bytes in hex*/) + 1 /*nul terminator*/];
invariantWTOK(_conn->query_timestamp(_conn, buf, "get=last_checkpoint"));
diff --git a/src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.h b/src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.h
index df0dccc4373..09152ec80fe 100644
--- a/src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.h
+++ b/src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.h
@@ -323,8 +323,6 @@ public:
Timestamp getOldestTimestamp() const override;
Timestamp getCheckpointTimestamp() const override;
- Timestamp getInitialDataTimestamp() const;
-
/**
* Returns the data file path associated with an ident on disk. Returns boost::none if the data
* file can not be found. This will attempt to locate a file even if the storage engine's own