summaryrefslogtreecommitdiff
path: root/src/mongo/db/shard_role.cpp
diff options
context:
space:
mode:
authorKaloian Manassiev <kaloian.manassiev@mongodb.com>2023-05-16 16:41:18 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2023-05-16 18:32:05 +0000
commit6d34f15ca68a6c3e7ec67e5c75cce4d6bbf51aee (patch)
tree0396966229a982120b228972638c7a162d63a4fd /src/mongo/db/shard_role.cpp
parent7d5b3ce7bbd430a8d9cb231befa9233e372c66cb (diff)
downloadmongo-6d34f15ca68a6c3e7ec67e5c75cce4d6bbf51aee.tar.gz
SERVER-77123 Make the readConcern for TransactionResources come from prerequisites
Diffstat (limited to 'src/mongo/db/shard_role.cpp')
-rw-r--r--src/mongo/db/shard_role.cpp59
1 files changed, 32 insertions, 27 deletions
diff --git a/src/mongo/db/shard_role.cpp b/src/mongo/db/shard_role.cpp
index 0041ebe9355..4e5707931e3 100644
--- a/src/mongo/db/shard_role.cpp
+++ b/src/mongo/db/shard_role.cpp
@@ -60,11 +60,9 @@ auto getTransactionResources = OperationContext::declareDecoration<
std::unique_ptr<shard_role_details::TransactionResources>>();
shard_role_details::TransactionResources& getOrMakeTransactionResources(OperationContext* opCtx) {
- auto& readConcern = repl::ReadConcernArgs::get(opCtx);
auto& optTransactionResources = getTransactionResources(opCtx);
if (!optTransactionResources) {
- optTransactionResources =
- std::make_unique<shard_role_details::TransactionResources>(readConcern);
+ optTransactionResources = std::make_unique<shard_role_details::TransactionResources>();
}
return *optTransactionResources;
@@ -102,8 +100,12 @@ ResolvedNamespaceOrViewAcquisitionRequestsMap resolveNamespaceOrViewAcquisitionR
auto coll = catalog.lookupCollectionByNamespace(opCtx, *ar.nss);
checkCollectionUUIDMismatch(opCtx, *ar.nss, coll, ar.uuid);
- AcquisitionPrerequisites prerequisites(
- *ar.nss, ar.uuid, ar.placementConcern, ar.operationType, ar.viewMode);
+ AcquisitionPrerequisites prerequisites(*ar.nss,
+ ar.uuid,
+ ar.readConcern,
+ ar.placementConcern,
+ ar.operationType,
+ ar.viewMode);
ResolvedNamespaceOrViewAcquisitionRequest resolvedAcquisitionRequest{
prerequisites, nullptr, boost::none};
@@ -131,8 +133,12 @@ ResolvedNamespaceOrViewAcquisitionRequestsMap resolveNamespaceOrViewAcquisitionR
checkCollectionUUIDMismatch(opCtx, *ar.nss, coll, *ar.uuid);
}
- AcquisitionPrerequisites prerequisites(
- coll->ns(), coll->uuid(), ar.placementConcern, ar.operationType, ar.viewMode);
+ AcquisitionPrerequisites prerequisites(coll->ns(),
+ coll->uuid(),
+ ar.readConcern,
+ ar.placementConcern,
+ ar.operationType,
+ ar.viewMode);
ResolvedNamespaceOrViewAcquisitionRequest resolvedAcquisitionRequest{
prerequisites, nullptr, boost::none};
@@ -640,7 +646,7 @@ ResolvedNamespaceOrViewAcquisitionRequestsMap generateSortedAcquisitionRequests(
const auto& nss = ar.nss ? *ar.nss : coll->ns();
AcquisitionPrerequisites prerequisites(
- nss, ar.uuid, ar.placementConcern, ar.operationType, ar.viewMode);
+ nss, ar.uuid, ar.readConcern, ar.placementConcern, ar.operationType, ar.viewMode);
ResolvedNamespaceOrViewAcquisitionRequest resolvedAcquisitionRequest{
prerequisites, nullptr, boost::none};
@@ -811,6 +817,7 @@ ScopedCollectionAcquisition acquireCollectionForLocalCatalogOnlyWithPotentialDat
auto prerequisites =
AcquisitionPrerequisites(nss,
boost::none,
+ repl::ReadConcernArgs::get(opCtx),
AcquisitionPrerequisites::kLocalCatalogOnlyWithPotentialDataLoss,
AcquisitionPrerequisites::OperationType::kWrite,
AcquisitionPrerequisites::ViewMode::kMustBeCollection);
@@ -819,18 +826,16 @@ ScopedCollectionAcquisition acquireCollectionForLocalCatalogOnlyWithPotentialDat
invariant(std::holds_alternative<CollectionPtr>(collOrView));
auto& coll = std::get<CollectionPtr>(collOrView);
+ if (coll)
+ prerequisites.uuid = boost::optional<UUID>(coll->uuid());
- shard_role_details::AcquiredCollection& acquiredCollection = txnResources.addAcquiredCollection(
- {AcquisitionPrerequisites(nss,
- coll ? boost::optional<UUID>(coll->uuid()) : boost::none,
- AcquisitionPrerequisites::kLocalCatalogOnlyWithPotentialDataLoss,
- AcquisitionPrerequisites::OperationType::kWrite,
- AcquisitionPrerequisites::ViewMode::kMustBeCollection),
- std::move(dbLock),
- std::move(collLock),
- boost::none,
- boost::none,
- std::move(coll)});
+ shard_role_details::AcquiredCollection& acquiredCollection =
+ txnResources.addAcquiredCollection({prerequisites,
+ std::move(dbLock),
+ std::move(collLock),
+ boost::none,
+ boost::none,
+ std::move(coll)});
return ScopedCollectionAcquisition(opCtx, acquiredCollection);
}
@@ -925,11 +930,11 @@ boost::optional<YieldedTransactionResources> yieldTransactionResourcesFromOperat
"Yielding view acquisitions is forbidden",
transactionResources->acquiredViews.empty());
- invariant(!transactionResources->lockSnapshot);
+ invariant(!transactionResources->yieldedLocker);
Locker::LockSnapshot lockSnapshot;
opCtx->lockState()->saveLockStateAndUnlock(&lockSnapshot);
- transactionResources->lockSnapshot.emplace(std::move(lockSnapshot));
+ transactionResources->yieldedLocker.emplace(std::move(lockSnapshot));
transactionResources->yielded = true;
return YieldedTransactionResources(std::move(transactionResources));
@@ -950,10 +955,10 @@ void restoreTransactionResourcesToOperationContext(OperationContext* opCtx,
auto restoreFn = [&]() {
// Reacquire locks.
- if (yieldedResources._yieldedResources->lockSnapshot) {
- opCtx->lockState()->restoreLockState(opCtx,
- *yieldedResources._yieldedResources->lockSnapshot);
- yieldedResources._yieldedResources->lockSnapshot.reset();
+ if (yieldedResources._yieldedResources->yieldedLocker) {
+ opCtx->lockState()->restoreLockState(
+ opCtx, *yieldedResources._yieldedResources->yieldedLocker);
+ yieldedResources._yieldedResources->yieldedLocker.reset();
}
// Reestablish a consistent catalog snapshot (multi document transactions don't yield).
@@ -1036,10 +1041,10 @@ void restoreTransactionResourcesToOperationContext(OperationContext* opCtx,
// the point we had left. We do this to prevent large multi-writes from
// repeatedly failing due to StaleConfig and exhausting the mongos retry
// attempts. Yield the locks.
- yieldedResources._yieldedResources->lockSnapshot.emplace();
+ yieldedResources._yieldedResources->yieldedLocker.emplace();
opCtx->recoveryUnit()->abandonSnapshot();
opCtx->lockState()->saveLockStateAndUnlock(
- &(*yieldedResources._yieldedResources->lockSnapshot));
+ yieldedResources._yieldedResources->yieldedLocker.get_ptr());
// Wait for the critical section to finish.
OperationShardingState::waitForCriticalSectionToComplete(
opCtx, *ex->getCriticalSectionSignal())