diff options
author | Jason Zhang <jason.zhang@mongodb.com> | 2022-02-11 15:22:03 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2022-02-11 16:01:18 +0000 |
commit | 250795d1fb30fc9088c057902d81349100c79eb3 (patch) | |
tree | c01848fcb9e9d78c93656bdb7d5ff9b76c06438d /src/mongo/db/s/transaction_coordinator_service.cpp | |
parent | 037b22172c54d5652298203077c16cc0ee7f26a1 (diff) | |
download | mongo-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.cpp | 27 |
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 |