diff options
author | Samy Lanka <samy.lanka@mongodb.com> | 2018-08-30 19:33:18 -0400 |
---|---|---|
committer | Samy Lanka <samy.lanka@mongodb.com> | 2018-09-05 14:10:18 -0400 |
commit | 92c166d289478bb3d40cdb08d8c7e41f083dd66d (patch) | |
tree | 7edb55a9d5def3a943e4158e0d5d659a40473778 /src/mongo | |
parent | d9b5ba2d1710d7f52536ab9c53c3a68329f61b90 (diff) | |
download | mongo-92c166d289478bb3d40cdb08d8c7e41f083dd66d.tar.gz |
SERVER-36382 Only snapshot, lineariable and afterClusterTime reads block on prepare conflicts
Diffstat (limited to 'src/mongo')
4 files changed, 12 insertions, 5 deletions
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<Timestamp> 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<stdx::mutex> 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. |