summaryrefslogtreecommitdiff
path: root/src/mongo/db/s/transaction_coordinator_service.cpp
diff options
context:
space:
mode:
authorJason Zhang <jason.zhang@mongodb.com>2022-02-11 15:22:03 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2022-02-11 16:01:18 +0000
commit250795d1fb30fc9088c057902d81349100c79eb3 (patch)
treec01848fcb9e9d78c93656bdb7d5ff9b76c06438d /src/mongo/db/s/transaction_coordinator_service.cpp
parent037b22172c54d5652298203077c16cc0ee7f26a1 (diff)
downloadmongo-250795d1fb30fc9088c057902d81349100c79eb3.tar.gz
SERVER-61090 Make setFCV wait for all TransactionCoordinators of internal transactions to be cleaned up
Diffstat (limited to 'src/mongo/db/s/transaction_coordinator_service.cpp')
-rw-r--r--src/mongo/db/s/transaction_coordinator_service.cpp27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/mongo/db/s/transaction_coordinator_service.cpp b/src/mongo/db/s/transaction_coordinator_service.cpp
index bdc4cc373d9..f936323dcee 100644
--- a/src/mongo/db/s/transaction_coordinator_service.cpp
+++ b/src/mongo/db/s/transaction_coordinator_service.cpp
@@ -370,4 +370,31 @@ void TransactionCoordinatorService::cancelIfCommitNotYetStarted(
}
}
+const std::vector<SharedSemiFuture<void>>
+TransactionCoordinatorService::getAllRemovalFuturesForCoordinatorsForInternalTransactions(
+ OperationContext* opCtx) {
+ std::vector<SharedSemiFuture<void>> coordinatorStateDocRemovalFutures;
+ std::shared_ptr<CatalogAndScheduler> cas = _getCatalogAndScheduler(opCtx);
+ auto& catalog = cas->catalog;
+
+ auto predicate = [](const LogicalSessionId lsid,
+ const TxnNumberAndRetryCounter txnNumberAndRetryCounter,
+ const std::shared_ptr<TransactionCoordinator> transactionCoordinator) {
+ TransactionCoordinator::Step step = transactionCoordinator->getStep();
+ if (step > TransactionCoordinator::Step::kInactive && getParentSessionId(lsid)) {
+ return true;
+ }
+ return false;
+ };
+
+ auto visitorAction = [&](const LogicalSessionId lsid,
+ const TxnNumberAndRetryCounter txnNumberAndRetryCounter,
+ const std::shared_ptr<TransactionCoordinator> transactionCoordinator) {
+ coordinatorStateDocRemovalFutures.push_back(
+ transactionCoordinator->getCoordinatorDocRemovalFuture());
+ };
+ catalog.filter(predicate, visitorAction);
+ return coordinatorStateDocRemovalFutures;
+}
+
} // namespace mongo