From 92c166d289478bb3d40cdb08d8c7e41f083dd66d Mon Sep 17 00:00:00 2001 From: Samy Lanka Date: Thu, 30 Aug 2018 19:33:18 -0400 Subject: SERVER-36382 Only snapshot, lineariable and afterClusterTime reads block on prepare conflicts --- src/mongo/db/read_concern.cpp | 7 ++++++- src/mongo/db/storage/wiredtiger/wiredtiger_recovery_unit.cpp | 3 ++- src/mongo/db/storage/wiredtiger/wiredtiger_snapshot_manager.cpp | 4 ++-- src/mongo/db/storage/wiredtiger/wiredtiger_snapshot_manager.h | 3 ++- 4 files changed, 12 insertions(+), 5 deletions(-) (limited to 'src/mongo') diff --git a/src/mongo/db/read_concern.cpp b/src/mongo/db/read_concern.cpp index cb8df144d25..53372e23878 100644 --- a/src/mongo/db/read_concern.cpp +++ b/src/mongo/db/read_concern.cpp @@ -334,7 +334,12 @@ Status waitForReadConcern(OperationContext* opCtx, LOG(debugLevel) << "Using 'committed' snapshot: " << CurOp::get(opCtx)->opDescription(); } - if (readConcernArgs.getLevel() == repl::ReadConcernLevel::kAvailableReadConcern) { + // Only snapshot, linearizable and afterClusterTime reads should block on prepared transactions. + // We don't ignore prepare conflicts if we are in a direct client in case this overrides + // behavior set by a higher-level operation. + if (readConcernArgs.getLevel() != repl::ReadConcernLevel::kSnapshotReadConcern && + readConcernArgs.getLevel() != repl::ReadConcernLevel::kLinearizableReadConcern && + !afterClusterTime && !atClusterTime && !opCtx->getClient()->isInDirectClient()) { opCtx->recoveryUnit()->setIgnorePrepared(true); } diff --git a/src/mongo/db/storage/wiredtiger/wiredtiger_recovery_unit.cpp b/src/mongo/db/storage/wiredtiger/wiredtiger_recovery_unit.cpp index d73a1e1faf0..1cc671dcf56 100644 --- a/src/mongo/db/storage/wiredtiger/wiredtiger_recovery_unit.cpp +++ b/src/mongo/db/storage/wiredtiger/wiredtiger_recovery_unit.cpp @@ -358,7 +358,8 @@ void WiredTigerRecoveryUnit::_txnOpen() { // We reset _majorityCommittedSnapshot to the actual read timestamp used when the // transaction was started. _majorityCommittedSnapshot = - _sessionCache->snapshotManager().beginTransactionOnCommittedSnapshot(session); + _sessionCache->snapshotManager().beginTransactionOnCommittedSnapshot( + session, _ignorePrepared); break; } case ReadSource::kLastApplied: { diff --git a/src/mongo/db/storage/wiredtiger/wiredtiger_snapshot_manager.cpp b/src/mongo/db/storage/wiredtiger/wiredtiger_snapshot_manager.cpp index 77b6d875a59..011db3e3566 100644 --- a/src/mongo/db/storage/wiredtiger/wiredtiger_snapshot_manager.cpp +++ b/src/mongo/db/storage/wiredtiger/wiredtiger_snapshot_manager.cpp @@ -68,8 +68,8 @@ boost::optional WiredTigerSnapshotManager::getMinSnapshotForNextCommi } Timestamp WiredTigerSnapshotManager::beginTransactionOnCommittedSnapshot( - WT_SESSION* session) const { - WiredTigerBeginTxnBlock txnOpen(session); + WT_SESSION* session, WiredTigerBeginTxnBlock::IgnorePrepared ignorePrepared) const { + WiredTigerBeginTxnBlock txnOpen(session, ignorePrepared); stdx::lock_guard lock(_committedSnapshotMutex); uassert(ErrorCodes::ReadConcernMajorityNotAvailableYet, diff --git a/src/mongo/db/storage/wiredtiger/wiredtiger_snapshot_manager.h b/src/mongo/db/storage/wiredtiger/wiredtiger_snapshot_manager.h index 493e8dfb1ee..b0592cf9986 100644 --- a/src/mongo/db/storage/wiredtiger/wiredtiger_snapshot_manager.h +++ b/src/mongo/db/storage/wiredtiger/wiredtiger_snapshot_manager.h @@ -62,7 +62,8 @@ public: * * Throws if there is currently no committed snapshot. */ - Timestamp beginTransactionOnCommittedSnapshot(WT_SESSION* session) const; + Timestamp beginTransactionOnCommittedSnapshot( + WT_SESSION* session, WiredTigerBeginTxnBlock::IgnorePrepared ignorePrepared) const; /** * Starts a transaction on the last stable local timestamp, set by setLocalSnapshot. -- cgit v1.2.1