summaryrefslogtreecommitdiff
path: root/src/mongo
diff options
context:
space:
mode:
authorSamy Lanka <samy.lanka@mongodb.com>2018-08-30 19:33:18 -0400
committerSamy Lanka <samy.lanka@mongodb.com>2018-09-05 14:10:18 -0400
commit92c166d289478bb3d40cdb08d8c7e41f083dd66d (patch)
tree7edb55a9d5def3a943e4158e0d5d659a40473778 /src/mongo
parentd9b5ba2d1710d7f52536ab9c53c3a68329f61b90 (diff)
downloadmongo-92c166d289478bb3d40cdb08d8c7e41f083dd66d.tar.gz
SERVER-36382 Only snapshot, lineariable and afterClusterTime reads block on prepare conflicts
Diffstat (limited to 'src/mongo')
-rw-r--r--src/mongo/db/read_concern.cpp7
-rw-r--r--src/mongo/db/storage/wiredtiger/wiredtiger_recovery_unit.cpp3
-rw-r--r--src/mongo/db/storage/wiredtiger/wiredtiger_snapshot_manager.cpp4
-rw-r--r--src/mongo/db/storage/wiredtiger/wiredtiger_snapshot_manager.h3
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.