summaryrefslogtreecommitdiff
path: root/src/mongo/db/initialize_operation_session_info.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/initialize_operation_session_info.cpp')
-rw-r--r--src/mongo/db/initialize_operation_session_info.cpp25
1 files changed, 25 insertions, 0 deletions
diff --git a/src/mongo/db/initialize_operation_session_info.cpp b/src/mongo/db/initialize_operation_session_info.cpp
index a3b75ec443d..5eccaf3faa7 100644
--- a/src/mongo/db/initialize_operation_session_info.cpp
+++ b/src/mongo/db/initialize_operation_session_info.cpp
@@ -36,9 +36,20 @@
#include "mongo/db/logical_session_cache.h"
#include "mongo/db/logical_session_id_helpers.h"
#include "mongo/db/operation_context.h"
+#include "mongo/db/stats/counters.h"
namespace mongo {
+/**
+ * A client is internal if the connection is a self connection, a connection from a mongos or
+ * different mongod or a direct client connection.
+ */
+bool isInternalClient(OperationContext* opCtx) {
+ return !opCtx->getClient()->session() ||
+ (opCtx->getClient()->session()->getTags() & transport::Session::kInternalClient) ||
+ opCtx->getClient()->isInDirectClient();
+}
+
OperationSessionInfoFromClient initializeOperationSessionInfo(OperationContext* opCtx,
const BSONObj& requestBody,
bool requiresAuth,
@@ -166,6 +177,20 @@ OperationSessionInfoFromClient initializeOperationSessionInfo(OperationContext*
osi.getStartTransaction().value());
}
+ if (osi.getTxnNumber()) {
+ if (!osi.getAutocommit()) {
+ if (isInternalClient(opCtx)) {
+ internalRetryableWriteCount.increment(1);
+ } else {
+ externalRetryableWriteCount.increment(1);
+ }
+ } else {
+ if (osi.getSessionId()->getTxnNumber() && osi.getSessionId()->getTxnUUID()) {
+ retryableInternalTransactionCount.increment(1);
+ }
+ }
+ }
+
return osi;
}