diff options
author | A. Jesse Jiryu Davis <jesse@mongodb.com> | 2020-06-26 17:04:01 -0400 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2020-07-11 23:55:48 +0000 |
commit | 74ab0cdac56e1cc62fc96d3ca3be3ddfa54f2bcb (patch) | |
tree | 77d0347dc607247ac8ec1c64ee7e593de3fbbeea /src/mongo/db | |
parent | 4b918b3f7693c42ad74dfa5030e7cf2ffc3d1ddb (diff) | |
download | mongo-74ab0cdac56e1cc62fc96d3ca3be3ddfa54f2bcb.tar.gz |
SERVER-48518 Fix rollback via refetch anomaly
Diffstat (limited to 'src/mongo/db')
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 0a85a178ac7..ed9a5753956 100644 --- a/src/mongo/db/repl/replication_coordinator_impl.cpp +++ b/src/mongo/db/repl/replication_coordinator_impl.cpp @@ -5122,6 +5122,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 bcded20bb6d..1e3977ee532 100644 --- a/src/mongo/db/storage/storage_engine_impl.cpp +++ b/src/mongo/db/storage/storage_engine_impl.cpp @@ -778,7 +778,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 6ef1a605992..7f658ba910b 100644 --- a/src/mongo/db/storage/storage_engine_impl.h +++ b/src/mongo/db/storage/storage_engine_impl.h @@ -398,7 +398,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 3fa21ec4f8d..7d98f3c7205 100644 --- a/src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.cpp +++ b/src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.cpp @@ -2400,10 +2400,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 |