diff options
Diffstat (limited to 'src')
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 |