From 7fb0eb0a04a5a165428244524e32ae7cce206d22 Mon Sep 17 00:00:00 2001 From: Benety Goh Date: Fri, 26 Aug 2022 13:39:49 -0400 Subject: SERVER-68215 add MongoDSessionCatalogTransactionInterface::abortTransaction() --- src/mongo/db/session/session_catalog_mongod.cpp | 15 ++++----------- .../session_catalog_mongod_transaction_interface.h | 6 ++++++ .../session_catalog_mongod_transaction_interface_impl.cpp | 13 +++++++++++++ .../session_catalog_mongod_transaction_interface_impl.h | 2 ++ 4 files changed, 25 insertions(+), 11 deletions(-) (limited to 'src/mongo') diff --git a/src/mongo/db/session/session_catalog_mongod.cpp b/src/mongo/db/session/session_catalog_mongod.cpp index ff31b202e3f..2a45fb5722f 100644 --- a/src/mongo/db/session/session_catalog_mongod.cpp +++ b/src/mongo/db/session/session_catalog_mongod.cpp @@ -409,7 +409,8 @@ void createRetryableFindAndModifyTable(OperationContext* opCtx) { void abortInProgressTransactions(OperationContext* opCtx, - MongoDSessionCatalog* mongoDSessionCatalog) { + MongoDSessionCatalog* mongoDSessionCatalog, + MongoDSessionCatalogTransactionInterface* ti) { DBDirectClient client(opCtx); FindCommandRequest findRequest{NamespaceString::kSessionTransactionsTableNamespace}; findRequest.setFilter(BSON(SessionTxnRecord::kStateFieldName @@ -434,15 +435,7 @@ void abortInProgressTransactions(OperationContext* opCtx, hangDuringStepUpAbortInProgressTransactions.pauseWhileSet(); auto ocs = mongoDSessionCatalog->checkOutSessionWithoutRefresh(opCtx); - auto txnParticipant = TransactionParticipant::get(opCtx); - LOGV2_DEBUG(21978, - 3, - "Aborting transaction sessionId: {sessionId} txnNumber {txnNumber}", - "Aborting transaction", - "sessionId"_attr = txnRecord.getSessionId().toBSON(), - "txnNumber"_attr = txnRecord.getTxnNum()); - txnParticipant.abortTransaction(opCtx); - opCtx->resetMultiDocumentTransactionState(); + ti->abortTransaction(opCtx, txnRecord); } } @@ -571,7 +564,7 @@ void MongoDSessionCatalog::onStepUp(OperationContext* opCtx) { } } - abortInProgressTransactions(opCtx, this); + abortInProgressTransactions(opCtx, this, _ti.get()); createTransactionTable(opCtx); if (repl::feature_flags::gFeatureFlagRetryableFindAndModify.isEnabledAndIgnoreFCV()) { diff --git a/src/mongo/db/session/session_catalog_mongod_transaction_interface.h b/src/mongo/db/session/session_catalog_mongod_transaction_interface.h index fd800245c7e..9f3381035e8 100644 --- a/src/mongo/db/session/session_catalog_mongod_transaction_interface.h +++ b/src/mongo/db/session/session_catalog_mongod_transaction_interface.h @@ -31,6 +31,7 @@ #include "mongo/db/operation_context.h" #include "mongo/db/session/session_catalog.h" // for ScanSessionsCallbackFn +#include "mongo/db/session/session_txn_record_gen.h" // for SessionTxnRecord #include "mongo/db/transaction/transaction_participant.h" // for SessionToKill namespace mongo { @@ -46,6 +47,11 @@ public: virtual ~MongoDSessionCatalogTransactionInterface() = default; + /** + * Aborts the transaction, releasing transaction resources. + */ + virtual void abortTransaction(OperationContext* opCtx, const SessionTxnRecord& txnRecord) = 0; + /** * Marks the session as requiring refresh. Used when the session state has been modified * externally, such as through a direct write to the transactions table. diff --git a/src/mongo/db/transaction/session_catalog_mongod_transaction_interface_impl.cpp b/src/mongo/db/transaction/session_catalog_mongod_transaction_interface_impl.cpp index 0c944cfffb4..3dad0360eb9 100644 --- a/src/mongo/db/transaction/session_catalog_mongod_transaction_interface_impl.cpp +++ b/src/mongo/db/transaction/session_catalog_mongod_transaction_interface_impl.cpp @@ -37,6 +37,19 @@ namespace mongo { +void MongoDSessionCatalogTransactionInterfaceImpl::abortTransaction( + OperationContext* opCtx, const SessionTxnRecord& txnRecord) { + auto txnParticipant = TransactionParticipant::get(opCtx); + LOGV2_DEBUG(21978, + 3, + "Aborting transaction sessionId: {sessionId} txnNumber {txnNumber}", + "Aborting transaction", + "sessionId"_attr = txnRecord.getSessionId().toBSON(), + "txnNumber"_attr = txnRecord.getTxnNum()); + txnParticipant.abortTransaction(opCtx); + opCtx->resetMultiDocumentTransactionState(); +} + void MongoDSessionCatalogTransactionInterfaceImpl::invalidateSessionToKill( OperationContext* opCtx, const SessionToKill& session) { auto participant = TransactionParticipant::get(session); diff --git a/src/mongo/db/transaction/session_catalog_mongod_transaction_interface_impl.h b/src/mongo/db/transaction/session_catalog_mongod_transaction_interface_impl.h index 8fdd82ab8dc..0104ae730fb 100644 --- a/src/mongo/db/transaction/session_catalog_mongod_transaction_interface_impl.h +++ b/src/mongo/db/transaction/session_catalog_mongod_transaction_interface_impl.h @@ -47,6 +47,8 @@ public: MongoDSessionCatalogTransactionInterfaceImpl() = default; virtual ~MongoDSessionCatalogTransactionInterfaceImpl() = default; + void abortTransaction(OperationContext* opCtx, const SessionTxnRecord& txnRecord) override; + void invalidateSessionToKill(OperationContext* opCtx, const SessionToKill& session) override; ScanSessionsCallbackFn makeParentSessionWorkerFnForReap( -- cgit v1.2.1