summaryrefslogtreecommitdiff
path: root/src/mongo
diff options
context:
space:
mode:
authorBenety Goh <benety@mongodb.com>2022-08-26 08:05:37 -0400
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2022-08-26 12:36:52 +0000
commitacf81f84dabf486f74a84b99f04cd17efa35424f (patch)
tree2436bc8af76ffdf0741ec498758a7c43c89f4159 /src/mongo
parent70fc032f8e809a74c59934ec70a29b1df3d1e8cc (diff)
downloadmongo-acf81f84dabf486f74a84b99f04cd17efa35424f.tar.gz
SERVER-68215 add MongoDSessionCatalogTransactionInterface::invalidateSessionToKill()
Diffstat (limited to 'src/mongo')
-rw-r--r--src/mongo/db/session/session_catalog_mongod.cpp19
-rw-r--r--src/mongo/db/session/session_catalog_mongod_transaction_interface.h9
-rw-r--r--src/mongo/db/transaction/session_catalog_mongod_transaction_interface_impl.cpp12
-rw-r--r--src/mongo/db/transaction/session_catalog_mongod_transaction_interface_impl.h2
4 files changed, 33 insertions, 9 deletions
diff --git a/src/mongo/db/session/session_catalog_mongod.cpp b/src/mongo/db/session/session_catalog_mongod.cpp
index 69b52d9f533..94b5584a146 100644
--- a/src/mongo/db/session/session_catalog_mongod.cpp
+++ b/src/mongo/db/session/session_catalog_mongod.cpp
@@ -99,12 +99,14 @@ auto getThreadPool(OperationContext* opCtx) {
* set of kill tokens.
*/
void killSessionTokens(OperationContext* opCtx,
+ MongoDSessionCatalogTransactionInterface* ti,
std::vector<SessionCatalog::KillToken> sessionKillTokens) {
if (sessionKillTokens.empty())
return;
getThreadPool(opCtx)->schedule(
[service = opCtx->getServiceContext(),
+ ti,
sessionKillTokens = std::move(sessionKillTokens)](auto status) mutable {
invariant(status);
@@ -115,8 +117,7 @@ void killSessionTokens(OperationContext* opCtx,
for (auto& sessionKillToken : sessionKillTokens) {
auto session = catalog->checkOutSessionForKill(opCtx, std::move(sessionKillToken));
- auto participant = TransactionParticipant::get(session);
- participant.invalidate(opCtx);
+ ti->invalidateSessionToKill(opCtx, session);
}
});
}
@@ -569,7 +570,7 @@ void MongoDSessionCatalog::onStepUp(OperationContext* opCtx) {
sessionsToReacquireLocks.emplace_back(sessionInfo);
}
});
- killSessionTokens(opCtx, std::move(sessionKillTokens));
+ killSessionTokens(opCtx, _ti.get(), std::move(sessionKillTokens));
{
// Create a new opCtx because we need an empty locker to refresh the locks.
@@ -640,8 +641,9 @@ void MongoDSessionCatalog::observeDirectWriteToConfigTransactions(OperationConte
class KillSessionTokenOnCommit : public RecoveryUnit::Change {
public:
KillSessionTokenOnCommit(OperationContext* opCtx,
+ MongoDSessionCatalogTransactionInterface* ti,
SessionCatalog::KillToken sessionKillToken)
- : _opCtx(opCtx), _sessionKillToken(std::move(sessionKillToken)) {}
+ : _opCtx(opCtx), _ti(ti), _sessionKillToken(std::move(sessionKillToken)) {}
void commit(boost::optional<Timestamp>) override {
rollback();
@@ -650,11 +652,12 @@ void MongoDSessionCatalog::observeDirectWriteToConfigTransactions(OperationConte
void rollback() override {
std::vector<SessionCatalog::KillToken> sessionKillTokenVec;
sessionKillTokenVec.emplace_back(std::move(_sessionKillToken));
- killSessionTokens(_opCtx, std::move(sessionKillTokenVec));
+ killSessionTokens(_opCtx, _ti, std::move(sessionKillTokenVec));
}
private:
OperationContext* _opCtx;
+ MongoDSessionCatalogTransactionInterface* _ti;
SessionCatalog::KillToken _sessionKillToken;
};
@@ -662,7 +665,7 @@ void MongoDSessionCatalog::observeDirectWriteToConfigTransactions(OperationConte
const auto lsid =
LogicalSessionId::parse(IDLParserContext("lsid"), singleSessionDoc["_id"].Obj());
- catalog->scanSession(lsid, [&](const ObservableSession& session) {
+ catalog->scanSession(lsid, [&, ti = _ti.get()](const ObservableSession& session) {
const auto participant = TransactionParticipant::get(session);
uassert(ErrorCodes::PreparedTransactionInProgress,
str::stream() << "Cannot modify the entry for session "
@@ -671,7 +674,7 @@ void MongoDSessionCatalog::observeDirectWriteToConfigTransactions(OperationConte
!participant.transactionIsPrepared());
opCtx->recoveryUnit()->registerChange(
- std::make_unique<KillSessionTokenOnCommit>(opCtx, session.kill()));
+ std::make_unique<KillSessionTokenOnCommit>(opCtx, ti, session.kill()));
});
}
@@ -688,7 +691,7 @@ void MongoDSessionCatalog::invalidateAllSessions(OperationContext* opCtx) {
sessionKillTokens.emplace_back(session.kill());
});
- killSessionTokens(opCtx, std::move(sessionKillTokens));
+ killSessionTokens(opCtx, _ti.get(), std::move(sessionKillTokens));
}
int MongoDSessionCatalog::reapSessionsOlderThan(OperationContext* opCtx,
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 4a6af53d049..2cde4d52750 100644
--- a/src/mongo/db/session/session_catalog_mongod_transaction_interface.h
+++ b/src/mongo/db/session/session_catalog_mongod_transaction_interface.h
@@ -29,6 +29,9 @@
#pragma once
+#include "mongo/db/operation_context.h"
+#include "mongo/db/transaction/transaction_participant.h" // for SessionToKill
+
namespace mongo {
/**
@@ -39,6 +42,12 @@ namespace mongo {
class MongoDSessionCatalogTransactionInterface {
public:
virtual ~MongoDSessionCatalogTransactionInterface() = default;
+
+ /**
+ * 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.
+ */
+ virtual void invalidateSessionToKill(OperationContext* opCtx, const SessionToKill& session) = 0;
};
} // namespace mongo
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 a1f9ef06b89..3c570f34a48 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
@@ -29,4 +29,14 @@
#include "mongo/db/transaction/session_catalog_mongod_transaction_interface_impl.h"
-namespace mongo {} // namespace mongo
+#include "mongo/db/transaction/transaction_participant.h"
+
+namespace mongo {
+
+void MongoDSessionCatalogTransactionInterfaceImpl::invalidateSessionToKill(
+ OperationContext* opCtx, const SessionToKill& session) {
+ auto participant = TransactionParticipant::get(session);
+ participant.invalidate(opCtx);
+}
+
+} // namespace mongo
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 b29427ba5c5..6d7751cb885 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
@@ -46,6 +46,8 @@ class MongoDSessionCatalogTransactionInterfaceImpl
public:
MongoDSessionCatalogTransactionInterfaceImpl() = default;
virtual ~MongoDSessionCatalogTransactionInterfaceImpl() = default;
+
+ void invalidateSessionToKill(OperationContext* opCtx, const SessionToKill& session) override;
};
} // namespace mongo