This is an automated email from the ASF dual-hosted git repository.

ptupitsyn pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git


The following commit(s) were added to refs/heads/main by this push:
     new 1a36a03c405 IGNITE-28306 Fix negative TransactionsActive metric for 
direct transactions (#7939)
1a36a03c405 is described below

commit 1a36a03c4056d81b013fe19d2ab865abc9fe5d67
Author: Tiago Marques Godinho <[email protected]>
AuthorDate: Tue Apr 7 13:40:59 2026 +0100

    IGNITE-28306 Fix negative TransactionsActive metric for direct transactions 
(#7939)
---
 .../handler/ClientInboundMessageHandler.java       | 38 +++++++++++-----------
 .../requests/sql/ClientSqlExecuteBatchRequest.java |  3 ++
 .../requests/sql/ClientSqlExecuteRequest.java      |  1 +
 .../sql/ClientSqlQueryMetadataRequest.java         |  4 ++-
 .../handler/requests/table/ClientTableCommon.java  |  9 ++++-
 .../table/ClientTupleContainsAllKeysRequest.java   |  4 ++-
 .../table/ClientTupleContainsKeyRequest.java       |  4 ++-
 .../table/ClientTupleDeleteAllExactRequest.java    |  4 ++-
 .../table/ClientTupleDeleteAllRequest.java         |  4 ++-
 .../table/ClientTupleDeleteExactRequest.java       |  4 ++-
 .../requests/table/ClientTupleDeleteRequest.java   |  4 ++-
 .../requests/table/ClientTupleGetAllRequest.java   |  4 ++-
 .../table/ClientTupleGetAndDeleteRequest.java      |  4 ++-
 .../table/ClientTupleGetAndReplaceRequest.java     |  4 ++-
 .../table/ClientTupleGetAndUpsertRequest.java      |  4 ++-
 .../requests/table/ClientTupleGetRequest.java      |  4 ++-
 .../table/ClientTupleInsertAllRequest.java         |  4 ++-
 .../requests/table/ClientTupleInsertRequest.java   |  4 ++-
 .../table/ClientTupleReplaceExactRequest.java      | 13 +++++++-
 .../requests/table/ClientTupleReplaceRequest.java  |  4 ++-
 .../requests/table/ClientTupleRequestBase.java     |  3 ++
 .../table/ClientTupleUpsertAllRequest.java         |  4 ++-
 .../requests/table/ClientTupleUpsertRequest.java   |  4 ++-
 .../requests/table/ClientTuplesRequestBase.java    |  4 ++-
 .../ignite/client/handler/FakePlacementDriver.java |  9 ++++-
 .../client/ClientPartitionDistributionTest.java    |  4 +--
 .../apache/ignite/client/ServerMetricsTest.java    | 23 ++++++++++---
 27 files changed, 128 insertions(+), 47 deletions(-)

diff --git 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/ClientInboundMessageHandler.java
 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/ClientInboundMessageHandler.java
index 689695259e1..7cea0def276 100644
--- 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/ClientInboundMessageHandler.java
+++ 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/ClientInboundMessageHandler.java
@@ -946,68 +946,68 @@ public class ClientInboundMessageHandler
 
             case ClientOp.TUPLE_UPSERT:
                 return ClientTupleUpsertRequest.process(
-                        in, igniteTables, resources, txManager, clockService, 
notificationSender(requestId), tsTracker);
+                        in, igniteTables, resources, metrics, txManager, 
clockService, notificationSender(requestId), tsTracker);
 
             case ClientOp.TUPLE_GET:
-                return ClientTupleGetRequest.process(in, igniteTables, 
resources, txManager, clockService, tsTracker);
+                return ClientTupleGetRequest.process(in, igniteTables, 
resources, metrics, txManager, clockService, tsTracker);
 
             case ClientOp.TUPLE_UPSERT_ALL:
-                return ClientTupleUpsertAllRequest.process(in, igniteTables, 
resources, txManager, clockService,
+                return ClientTupleUpsertAllRequest.process(in, igniteTables, 
resources, metrics, txManager, clockService,
                         notificationSender(requestId), tsTracker);
 
             case ClientOp.TUPLE_GET_ALL:
-                return ClientTupleGetAllRequest.process(in, igniteTables, 
resources, txManager, clockService, tsTracker,
+                return ClientTupleGetAllRequest.process(in, igniteTables, 
resources, metrics, txManager, clockService, tsTracker,
                         
clientContext.hasFeature(TX_CLIENT_GETALL_SUPPORTS_TX_OPTIONS));
 
             case ClientOp.TUPLE_GET_AND_UPSERT:
-                return ClientTupleGetAndUpsertRequest.process(in, 
igniteTables, resources, txManager, clockService,
+                return ClientTupleGetAndUpsertRequest.process(in, 
igniteTables, resources, metrics, txManager, clockService,
                         notificationSender(requestId), tsTracker);
 
             case ClientOp.TUPLE_INSERT:
-                return ClientTupleInsertRequest.process(in, igniteTables, 
resources, txManager, clockService,
+                return ClientTupleInsertRequest.process(in, igniteTables, 
resources, metrics, txManager, clockService,
                         notificationSender(requestId), tsTracker);
 
             case ClientOp.TUPLE_INSERT_ALL:
-                return ClientTupleInsertAllRequest.process(in, igniteTables, 
resources, txManager, clockService,
+                return ClientTupleInsertAllRequest.process(in, igniteTables, 
resources, metrics, txManager, clockService,
                         notificationSender(requestId), tsTracker);
 
             case ClientOp.TUPLE_REPLACE:
-                return ClientTupleReplaceRequest.process(in, igniteTables, 
resources, txManager, clockService,
+                return ClientTupleReplaceRequest.process(in, igniteTables, 
resources, metrics, txManager, clockService,
                         notificationSender(requestId), tsTracker);
 
             case ClientOp.TUPLE_REPLACE_EXACT:
-                return ClientTupleReplaceExactRequest.process(in, 
igniteTables, resources, txManager, clockService,
+                return ClientTupleReplaceExactRequest.process(in, 
igniteTables, resources, metrics, txManager, clockService,
                         notificationSender(requestId), tsTracker);
 
             case ClientOp.TUPLE_GET_AND_REPLACE:
-                return ClientTupleGetAndReplaceRequest.process(in, 
igniteTables, resources, txManager, clockService,
+                return ClientTupleGetAndReplaceRequest.process(in, 
igniteTables, resources, metrics, txManager, clockService,
                         notificationSender(requestId), tsTracker);
 
             case ClientOp.TUPLE_DELETE:
-                return ClientTupleDeleteRequest.process(in, igniteTables, 
resources, txManager, clockService,
+                return ClientTupleDeleteRequest.process(in, igniteTables, 
resources, metrics, txManager, clockService,
                         notificationSender(requestId), tsTracker);
 
             case ClientOp.TUPLE_DELETE_ALL:
-                return ClientTupleDeleteAllRequest.process(in, igniteTables, 
resources, txManager, clockService,
+                return ClientTupleDeleteAllRequest.process(in, igniteTables, 
resources, metrics, txManager, clockService,
                         notificationSender(requestId), tsTracker);
 
             case ClientOp.TUPLE_DELETE_EXACT:
-                return ClientTupleDeleteExactRequest.process(in, igniteTables, 
resources, txManager, clockService,
+                return ClientTupleDeleteExactRequest.process(in, igniteTables, 
resources, metrics, txManager, clockService,
                         notificationSender(requestId), tsTracker);
 
             case ClientOp.TUPLE_DELETE_ALL_EXACT:
-                return ClientTupleDeleteAllExactRequest.process(in, 
igniteTables, resources, txManager, clockService,
+                return ClientTupleDeleteAllExactRequest.process(in, 
igniteTables, resources, metrics, txManager, clockService,
                         notificationSender(requestId), tsTracker);
 
             case ClientOp.TUPLE_GET_AND_DELETE:
-                return ClientTupleGetAndDeleteRequest.process(in, 
igniteTables, resources, txManager, clockService,
+                return ClientTupleGetAndDeleteRequest.process(in, 
igniteTables, resources, metrics, txManager, clockService,
                         notificationSender(requestId), tsTracker);
 
             case ClientOp.TUPLE_CONTAINS_KEY:
-                return ClientTupleContainsKeyRequest.process(in, igniteTables, 
resources, txManager, clockService, tsTracker);
+                return ClientTupleContainsKeyRequest.process(in, igniteTables, 
resources, metrics, txManager, clockService, tsTracker);
 
             case ClientOp.TUPLE_CONTAINS_ALL_KEYS:
-                return ClientTupleContainsAllKeysRequest.process(in, 
igniteTables, resources, txManager, clockService, tsTracker,
+                return ClientTupleContainsAllKeysRequest.process(in, 
igniteTables, resources, metrics, txManager, clockService, tsTracker,
                         
clientContext.hasFeature(TX_CLIENT_GETALL_SUPPORTS_TX_OPTIONS));
 
             case ClientOp.JDBC_CONNECT:
@@ -1143,12 +1143,12 @@ public class ClientInboundMessageHandler
 
             case ClientOp.SQL_QUERY_META:
                 return ClientSqlQueryMetadataRequest.process(
-                        partitionOperationsExecutor, in, queryProcessor, 
resources, tsTracker
+                        partitionOperationsExecutor, in, queryProcessor, 
resources, metrics, tsTracker
                 );
 
             case ClientOp.SQL_EXEC_BATCH:
                 return ClientSqlExecuteBatchRequest.process(
-                        in, queryProcessor, resources, requestId, 
cancelHandles, tsTracker,
+                        in, queryProcessor, resources, metrics, requestId, 
cancelHandles, tsTracker,
                         resolveCurrentUsername()
                 );
 
diff --git 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/sql/ClientSqlExecuteBatchRequest.java
 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/sql/ClientSqlExecuteBatchRequest.java
index 413fa317c4f..4f0c9270235 100644
--- 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/sql/ClientSqlExecuteBatchRequest.java
+++ 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/sql/ClientSqlExecuteBatchRequest.java
@@ -21,6 +21,7 @@ import static 
org.apache.ignite.client.handler.requests.table.ClientTableCommon.
 
 import java.util.Map;
 import java.util.concurrent.CompletableFuture;
+import org.apache.ignite.client.handler.ClientHandlerMetricSource;
 import org.apache.ignite.client.handler.ClientResourceRegistry;
 import org.apache.ignite.client.handler.ResponseWriter;
 import org.apache.ignite.internal.client.proto.ClientMessageUnpacker;
@@ -53,6 +54,7 @@ public class ClientSqlExecuteBatchRequest {
             ClientMessageUnpacker in,
             QueryProcessor sql,
             ClientResourceRegistry resources,
+            ClientHandlerMetricSource metrics,
             long requestId,
             Map<Long, CancelHandle> cancelHandleMap,
             HybridTimestampTracker tsTracker,
@@ -65,6 +67,7 @@ public class ClientSqlExecuteBatchRequest {
                 in,
                 tsTracker,
                 resources,
+                metrics,
                 null,
                 null,
                 null,
diff --git 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/sql/ClientSqlExecuteRequest.java
 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/sql/ClientSqlExecuteRequest.java
index cbcd37de96b..03478d8bfb0 100644
--- 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/sql/ClientSqlExecuteRequest.java
+++ 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/sql/ClientSqlExecuteRequest.java
@@ -115,6 +115,7 @@ public class ClientSqlExecuteRequest {
                 in,
                 timestampTracker,
                 resources,
+                metrics,
                 txManager,
                 tables,
                 notificationSender,
diff --git 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/sql/ClientSqlQueryMetadataRequest.java
 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/sql/ClientSqlQueryMetadataRequest.java
index 49db22c22bb..06c63951060 100644
--- 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/sql/ClientSqlQueryMetadataRequest.java
+++ 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/sql/ClientSqlQueryMetadataRequest.java
@@ -21,6 +21,7 @@ import static 
org.apache.ignite.client.handler.requests.table.ClientTableCommon.
 
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.Executor;
+import org.apache.ignite.client.handler.ClientHandlerMetricSource;
 import org.apache.ignite.client.handler.ClientResourceRegistry;
 import org.apache.ignite.client.handler.ResponseWriter;
 import org.apache.ignite.internal.client.proto.ClientMessagePacker;
@@ -49,9 +50,10 @@ public class ClientSqlQueryMetadataRequest {
             ClientMessageUnpacker in,
             QueryProcessor processor,
             ClientResourceRegistry resources,
+            ClientHandlerMetricSource metrics,
             HybridTimestampTracker tsTracker
     ) {
-        CompletableFuture<InternalTransaction> txFut = readTx(in, tsTracker, 
resources, null, null, null, null);
+        CompletableFuture<InternalTransaction> txFut = readTx(in, tsTracker, 
resources, metrics, null, null, null, null);
 
         String schema = in.unpackString();
         String query = in.unpackString();
diff --git 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTableCommon.java
 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTableCommon.java
index 3a26a7afc55..2fbf674f21a 100644
--- 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTableCommon.java
+++ 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTableCommon.java
@@ -32,6 +32,7 @@ import java.util.Collection;
 import java.util.EnumSet;
 import java.util.UUID;
 import java.util.concurrent.CompletableFuture;
+import org.apache.ignite.client.handler.ClientHandlerMetricSource;
 import org.apache.ignite.client.handler.ClientResource;
 import org.apache.ignite.client.handler.ClientResourceRegistry;
 import org.apache.ignite.client.handler.NotificationSender;
@@ -427,6 +428,7 @@ public class ClientTableCommon {
             ClientMessageUnpacker in,
             HybridTimestampTracker tsUpdater,
             ClientResourceRegistry resources,
+            ClientHandlerMetricSource metrics,
             @Nullable TxManager txManager,
             @Nullable IgniteTables tables,
             @Nullable NotificationSender notificationSender,
@@ -436,6 +438,7 @@ public class ClientTableCommon {
                 in,
                 tsUpdater,
                 resources,
+                metrics,
                 txManager,
                 tables,
                 notificationSender,
@@ -460,6 +463,7 @@ public class ClientTableCommon {
             ClientMessageUnpacker in,
             HybridTimestampTracker tsUpdater,
             ClientResourceRegistry resources,
+            ClientHandlerMetricSource metrics,
             @Nullable TxManager txManager,
             @Nullable IgniteTables tables,
             @Nullable NotificationSender notificationSender,
@@ -510,6 +514,8 @@ public class ClientTableCommon {
                 // Attach resource id only on first direct request.
                 resourceIdHolder[0] = resources.put(new ClientResource(tx, 
tx::rollbackAsync));
 
+                metrics.transactionsActiveIncrement();
+
                 return completedFuture(tx);
             } else if (id == TX_ID_DIRECT) {
                 assert txManager != null : "Transaction manager must be 
specified to process directly mapped requests.";
@@ -585,13 +591,14 @@ public class ClientTableCommon {
             ClientMessageUnpacker in,
             HybridTimestampTracker readTs,
             ClientResourceRegistry resources,
+            ClientHandlerMetricSource metrics,
             TxManager txManager,
             IgniteTables tables,
             EnumSet<RequestOptions> options,
             @Nullable NotificationSender notificationSender,
             long[] resourceIdHolder
     ) {
-        return readTx(in, readTs, resources, txManager, tables, 
notificationSender, resourceIdHolder, options)
+        return readTx(in, readTs, resources, metrics, txManager, tables, 
notificationSender, resourceIdHolder, options)
                 .thenApply(tx -> {
                     if (tx == null) {
                         // Implicit transactions do not use an observation 
timestamp because RW never depends on it,
diff --git 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleContainsAllKeysRequest.java
 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleContainsAllKeysRequest.java
index ba79df0406d..eb006e5682c 100644
--- 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleContainsAllKeysRequest.java
+++ 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleContainsAllKeysRequest.java
@@ -24,6 +24,7 @@ import static 
org.apache.ignite.client.handler.requests.table.ClientTupleRequest
 
 import java.util.EnumSet;
 import java.util.concurrent.CompletableFuture;
+import org.apache.ignite.client.handler.ClientHandlerMetricSource;
 import org.apache.ignite.client.handler.ClientResourceRegistry;
 import org.apache.ignite.client.handler.ResponseWriter;
 import 
org.apache.ignite.client.handler.requests.table.ClientTupleRequestBase.RequestOptions;
@@ -53,6 +54,7 @@ public class ClientTupleContainsAllKeysRequest {
             ClientMessageUnpacker in,
             IgniteTables tables,
             ClientResourceRegistry resources,
+            ClientHandlerMetricSource metrics,
             TxManager txManager,
             ClockService clockService,
             HybridTimestampTracker tsTracker,
@@ -60,7 +62,7 @@ public class ClientTupleContainsAllKeysRequest {
     ) {
         EnumSet<RequestOptions> options = supportsOptions ? of(KEY_ONLY, 
HAS_OPTIONS) : of(KEY_ONLY);
 
-        return ClientTuplesRequestBase.readAsync(in, tables, resources, 
txManager, null, tsTracker, options)
+        return ClientTuplesRequestBase.readAsync(in, tables, resources, 
metrics, txManager, null, tsTracker, options)
                 .thenCompose(req -> 
req.table().recordView().containsAllAsync(req.tx(), req.tuples())
                         .thenApply(containsAll -> out -> {
                             writeTxMeta(out, tsTracker, clockService, req);
diff --git 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleContainsKeyRequest.java
 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleContainsKeyRequest.java
index 721f3d02cfa..8a5ffd08f65 100644
--- 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleContainsKeyRequest.java
+++ 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleContainsKeyRequest.java
@@ -23,6 +23,7 @@ import static 
org.apache.ignite.client.handler.requests.table.ClientTupleRequest
 import static 
org.apache.ignite.client.handler.requests.table.ClientTupleRequestBase.RequestOptions.READ_ONLY;
 
 import java.util.concurrent.CompletableFuture;
+import org.apache.ignite.client.handler.ClientHandlerMetricSource;
 import org.apache.ignite.client.handler.ClientResourceRegistry;
 import org.apache.ignite.client.handler.ResponseWriter;
 import org.apache.ignite.internal.client.proto.ClientMessageUnpacker;
@@ -48,11 +49,12 @@ public class ClientTupleContainsKeyRequest {
             ClientMessageUnpacker in,
             IgniteTables tables,
             ClientResourceRegistry resources,
+            ClientHandlerMetricSource metrics,
             TxManager txManager,
             ClockService clockService,
             HybridTimestampTracker tsTracker
     ) {
-        return ClientTupleRequestBase.readAsync(in, tables, resources, 
txManager, null, tsTracker, of(READ_ONLY, KEY_ONLY))
+        return ClientTupleRequestBase.readAsync(in, tables, resources, 
metrics, txManager, null, tsTracker, of(READ_ONLY, KEY_ONLY))
                 .thenCompose(req -> 
req.table().recordView().containsAsync(req.tx(), req.tuple())
                         .thenApply(res -> out -> {
                             writeTxMeta(out, tsTracker, clockService, req);
diff --git 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleDeleteAllExactRequest.java
 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleDeleteAllExactRequest.java
index e89d35f410c..e53caedd770 100644
--- 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleDeleteAllExactRequest.java
+++ 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleDeleteAllExactRequest.java
@@ -23,6 +23,7 @@ import static 
org.apache.ignite.client.handler.requests.table.ClientTableCommon.
 import static 
org.apache.ignite.client.handler.requests.table.ClientTuplesRequestBase.readAsync;
 
 import java.util.concurrent.CompletableFuture;
+import org.apache.ignite.client.handler.ClientHandlerMetricSource;
 import org.apache.ignite.client.handler.ClientResourceRegistry;
 import org.apache.ignite.client.handler.NotificationSender;
 import org.apache.ignite.client.handler.ResponseWriter;
@@ -50,12 +51,13 @@ public class ClientTupleDeleteAllExactRequest {
             ClientMessageUnpacker in,
             IgniteTables tables,
             ClientResourceRegistry resources,
+            ClientHandlerMetricSource metrics,
             TxManager txManager,
             ClockService clockService,
             NotificationSender notificationSender,
             HybridTimestampTracker tsTracker
     ) {
-        return readAsync(in, tables, resources, txManager, notificationSender, 
tsTracker, noneOf(RequestOptions.class))
+        return readAsync(in, tables, resources, metrics, txManager, 
notificationSender, tsTracker, noneOf(RequestOptions.class))
                 .thenCompose(req -> 
req.table().recordView().deleteAllExactAsync(req.tx(), req.tuples())
                         .thenApply(skippedTuples -> out -> {
                             writeTxMeta(out, tsTracker, clockService, req);
diff --git 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleDeleteAllRequest.java
 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleDeleteAllRequest.java
index 48afbf9a32d..68c5b8ecfbe 100644
--- 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleDeleteAllRequest.java
+++ 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleDeleteAllRequest.java
@@ -23,6 +23,7 @@ import static 
org.apache.ignite.client.handler.requests.table.ClientTableCommon.
 import static 
org.apache.ignite.client.handler.requests.table.ClientTupleRequestBase.RequestOptions.KEY_ONLY;
 
 import java.util.concurrent.CompletableFuture;
+import org.apache.ignite.client.handler.ClientHandlerMetricSource;
 import org.apache.ignite.client.handler.ClientResourceRegistry;
 import org.apache.ignite.client.handler.NotificationSender;
 import org.apache.ignite.client.handler.ResponseWriter;
@@ -50,12 +51,13 @@ public class ClientTupleDeleteAllRequest {
             ClientMessageUnpacker in,
             IgniteTables tables,
             ClientResourceRegistry resources,
+            ClientHandlerMetricSource metrics,
             TxManager txManager,
             ClockService clockService,
             NotificationSender notificationSender,
             HybridTimestampTracker tsTracker
     ) {
-        return ClientTuplesRequestBase.readAsync(in, tables, resources, 
txManager, notificationSender, tsTracker, of(KEY_ONLY))
+        return ClientTuplesRequestBase.readAsync(in, tables, resources, 
metrics, txManager, notificationSender, tsTracker, of(KEY_ONLY))
                 .thenCompose(req -> 
req.table().recordView().deleteAllAsync(req.tx(), req.tuples())
                         .thenApply(skippedTuples -> out -> {
                             writeTxMeta(out, tsTracker, clockService, req);
diff --git 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleDeleteExactRequest.java
 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleDeleteExactRequest.java
index ad0c0640d99..82233f81bf9 100644
--- 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleDeleteExactRequest.java
+++ 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleDeleteExactRequest.java
@@ -22,6 +22,7 @@ import static 
org.apache.ignite.client.handler.requests.table.ClientTableCommon.
 import static 
org.apache.ignite.client.handler.requests.table.ClientTupleRequestBase.readAsync;
 
 import java.util.concurrent.CompletableFuture;
+import org.apache.ignite.client.handler.ClientHandlerMetricSource;
 import org.apache.ignite.client.handler.ClientResourceRegistry;
 import org.apache.ignite.client.handler.NotificationSender;
 import org.apache.ignite.client.handler.ResponseWriter;
@@ -49,12 +50,13 @@ public class ClientTupleDeleteExactRequest {
             ClientMessageUnpacker in,
             IgniteTables tables,
             ClientResourceRegistry resources,
+            ClientHandlerMetricSource metrics,
             TxManager txManager,
             ClockService clockService,
             NotificationSender notificationSender,
             HybridTimestampTracker tsTracker
     ) {
-        return readAsync(in, tables, resources, txManager, notificationSender, 
tsTracker, noneOf(RequestOptions.class))
+        return readAsync(in, tables, resources, metrics, txManager, 
notificationSender, tsTracker, noneOf(RequestOptions.class))
                 .thenCompose(req -> 
req.table().recordView().deleteExactAsync(req.tx(), req.tuple())
                         .thenApply(res -> out -> {
                             writeTxMeta(out, tsTracker, clockService, req);
diff --git 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleDeleteRequest.java
 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleDeleteRequest.java
index adce4d98d98..339227e18e4 100644
--- 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleDeleteRequest.java
+++ 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleDeleteRequest.java
@@ -22,6 +22,7 @@ import static 
org.apache.ignite.client.handler.requests.table.ClientTableCommon.
 import static 
org.apache.ignite.client.handler.requests.table.ClientTupleRequestBase.RequestOptions.KEY_ONLY;
 
 import java.util.concurrent.CompletableFuture;
+import org.apache.ignite.client.handler.ClientHandlerMetricSource;
 import org.apache.ignite.client.handler.ClientResourceRegistry;
 import org.apache.ignite.client.handler.NotificationSender;
 import org.apache.ignite.client.handler.ResponseWriter;
@@ -48,12 +49,13 @@ public class ClientTupleDeleteRequest {
             ClientMessageUnpacker in,
             IgniteTables tables,
             ClientResourceRegistry resources,
+            ClientHandlerMetricSource metrics,
             TxManager txManager,
             ClockService clockService,
             NotificationSender notificationSender,
             HybridTimestampTracker tsTracker
     ) {
-        return ClientTupleRequestBase.readAsync(in, tables, resources, 
txManager, notificationSender, tsTracker, of(KEY_ONLY))
+        return ClientTupleRequestBase.readAsync(in, tables, resources, 
metrics, txManager, notificationSender, tsTracker, of(KEY_ONLY))
                 .thenCompose(req -> 
req.table().recordView().deleteAsync(req.tx(), req.tuple())
                         .thenApply(res -> out -> {
                             writeTxMeta(out, tsTracker, clockService, req);
diff --git 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleGetAllRequest.java
 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleGetAllRequest.java
index b777792b503..199464b3385 100644
--- 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleGetAllRequest.java
+++ 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleGetAllRequest.java
@@ -25,6 +25,7 @@ import static 
org.apache.ignite.client.handler.requests.table.ClientTupleRequest
 
 import java.util.EnumSet;
 import java.util.concurrent.CompletableFuture;
+import org.apache.ignite.client.handler.ClientHandlerMetricSource;
 import org.apache.ignite.client.handler.ClientResourceRegistry;
 import org.apache.ignite.client.handler.ResponseWriter;
 import 
org.apache.ignite.client.handler.requests.table.ClientTupleRequestBase.RequestOptions;
@@ -55,6 +56,7 @@ public class ClientTupleGetAllRequest {
             ClientMessageUnpacker in,
             IgniteTables tables,
             ClientResourceRegistry resources,
+            ClientHandlerMetricSource metrics,
             TxManager txManager,
             ClockService clockService,
             HybridTimestampTracker tsTracker,
@@ -62,7 +64,7 @@ public class ClientTupleGetAllRequest {
     ) {
         EnumSet<RequestOptions> options = supportsOptions ? of(KEY_ONLY, 
HAS_OPTIONS) : of(KEY_ONLY);
 
-        return ClientTuplesRequestBase.readAsync(in, tables, resources, 
txManager, null, tsTracker, options)
+        return ClientTuplesRequestBase.readAsync(in, tables, resources, 
metrics, txManager, null, tsTracker, options)
                 .thenCompose(req -> {
                     return req.table().recordView().getAllAsync(req.tx(), 
req.tuples())
                             .thenApply(resTuples -> out -> {
diff --git 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleGetAndDeleteRequest.java
 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleGetAndDeleteRequest.java
index d53c30e79b1..5133a14bcf5 100644
--- 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleGetAndDeleteRequest.java
+++ 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleGetAndDeleteRequest.java
@@ -22,6 +22,7 @@ import static 
org.apache.ignite.client.handler.requests.table.ClientTableCommon.
 import static 
org.apache.ignite.client.handler.requests.table.ClientTupleRequestBase.RequestOptions.KEY_ONLY;
 
 import java.util.concurrent.CompletableFuture;
+import org.apache.ignite.client.handler.ClientHandlerMetricSource;
 import org.apache.ignite.client.handler.ClientResourceRegistry;
 import org.apache.ignite.client.handler.NotificationSender;
 import org.apache.ignite.client.handler.ResponseWriter;
@@ -49,12 +50,13 @@ public class ClientTupleGetAndDeleteRequest {
             ClientMessageUnpacker in,
             IgniteTables tables,
             ClientResourceRegistry resources,
+            ClientHandlerMetricSource metrics,
             TxManager txManager,
             ClockService clockService,
             NotificationSender notificationSender,
             HybridTimestampTracker tsTracker
     ) {
-        return ClientTupleRequestBase.readAsync(in, tables, resources, 
txManager, notificationSender, tsTracker, of(KEY_ONLY))
+        return ClientTupleRequestBase.readAsync(in, tables, resources, 
metrics, txManager, notificationSender, tsTracker, of(KEY_ONLY))
                 .thenCompose(req -> 
req.table().recordView().getAndDeleteAsync(req.tx(), req.tuple())
                         .thenApply(resTuple -> out -> {
                             writeTxMeta(out, tsTracker, clockService, req);
diff --git 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleGetAndReplaceRequest.java
 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleGetAndReplaceRequest.java
index d1b99440d76..6fb485021d4 100644
--- 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleGetAndReplaceRequest.java
+++ 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleGetAndReplaceRequest.java
@@ -22,6 +22,7 @@ import static 
org.apache.ignite.client.handler.requests.table.ClientTableCommon.
 import static 
org.apache.ignite.client.handler.requests.table.ClientTupleRequestBase.readAsync;
 
 import java.util.concurrent.CompletableFuture;
+import org.apache.ignite.client.handler.ClientHandlerMetricSource;
 import org.apache.ignite.client.handler.ClientResourceRegistry;
 import org.apache.ignite.client.handler.NotificationSender;
 import org.apache.ignite.client.handler.ResponseWriter;
@@ -50,12 +51,13 @@ public class ClientTupleGetAndReplaceRequest {
             ClientMessageUnpacker in,
             IgniteTables tables,
             ClientResourceRegistry resources,
+            ClientHandlerMetricSource metrics,
             TxManager txManager,
             ClockService clockService,
             NotificationSender notificationSender,
             HybridTimestampTracker tsTracker
     ) {
-        return readAsync(in, tables, resources, txManager, notificationSender, 
tsTracker, noneOf(RequestOptions.class))
+        return readAsync(in, tables, resources, metrics, txManager, 
notificationSender, tsTracker, noneOf(RequestOptions.class))
                 .thenCompose(req -> 
req.table().recordView().getAndReplaceAsync(req.tx(), req.tuple())
                         .thenApply(resTuple -> out -> {
                             writeTxMeta(out, tsTracker, clockService, req);
diff --git 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleGetAndUpsertRequest.java
 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleGetAndUpsertRequest.java
index cef414d7917..d8f3420df2a 100644
--- 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleGetAndUpsertRequest.java
+++ 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleGetAndUpsertRequest.java
@@ -22,6 +22,7 @@ import static 
org.apache.ignite.client.handler.requests.table.ClientTableCommon.
 import static 
org.apache.ignite.client.handler.requests.table.ClientTupleRequestBase.readAsync;
 
 import java.util.concurrent.CompletableFuture;
+import org.apache.ignite.client.handler.ClientHandlerMetricSource;
 import org.apache.ignite.client.handler.ClientResourceRegistry;
 import org.apache.ignite.client.handler.NotificationSender;
 import org.apache.ignite.client.handler.ResponseWriter;
@@ -50,12 +51,13 @@ public class ClientTupleGetAndUpsertRequest {
             ClientMessageUnpacker in,
             IgniteTables tables,
             ClientResourceRegistry resources,
+            ClientHandlerMetricSource metrics,
             TxManager txManager,
             ClockService clockService,
             NotificationSender notificationSender,
             HybridTimestampTracker tsTracker
     ) {
-        return readAsync(in, tables, resources, txManager, notificationSender, 
tsTracker, noneOf(RequestOptions.class))
+        return readAsync(in, tables, resources, metrics, txManager, 
notificationSender, tsTracker, noneOf(RequestOptions.class))
                 .thenCompose(req -> 
req.table().recordView().getAndUpsertAsync(req.tx(), req.tuple())
                         .thenApply(resTuple -> out -> {
                             writeTxMeta(out, tsTracker, clockService, req);
diff --git 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleGetRequest.java
 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleGetRequest.java
index f53333c25f2..48fd2ca0062 100644
--- 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleGetRequest.java
+++ 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleGetRequest.java
@@ -23,6 +23,7 @@ import static 
org.apache.ignite.client.handler.requests.table.ClientTupleRequest
 import static 
org.apache.ignite.client.handler.requests.table.ClientTupleRequestBase.RequestOptions.READ_ONLY;
 
 import java.util.concurrent.CompletableFuture;
+import org.apache.ignite.client.handler.ClientHandlerMetricSource;
 import org.apache.ignite.client.handler.ClientResourceRegistry;
 import org.apache.ignite.client.handler.ResponseWriter;
 import org.apache.ignite.internal.client.proto.ClientMessageUnpacker;
@@ -49,11 +50,12 @@ public class ClientTupleGetRequest {
             ClientMessageUnpacker in,
             IgniteTables tables,
             ClientResourceRegistry resources,
+            ClientHandlerMetricSource metrics,
             TxManager txManager,
             ClockService clockService,
             HybridTimestampTracker tsTracker
     ) {
-        return ClientTupleRequestBase.readAsync(in, tables, resources, 
txManager, null, tsTracker, of(READ_ONLY, KEY_ONLY))
+        return ClientTupleRequestBase.readAsync(in, tables, resources, 
metrics, txManager, null, tsTracker, of(READ_ONLY, KEY_ONLY))
                 .thenCompose(req -> 
req.table().recordView().getAsync(req.tx(), req.tuple())
                         .thenApply(res -> out -> {
                             writeTxMeta(out, tsTracker, clockService, req);
diff --git 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleInsertAllRequest.java
 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleInsertAllRequest.java
index e750152ecd7..ecc68421db5 100644
--- 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleInsertAllRequest.java
+++ 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleInsertAllRequest.java
@@ -23,6 +23,7 @@ import static 
org.apache.ignite.client.handler.requests.table.ClientTableCommon.
 import static 
org.apache.ignite.client.handler.requests.table.ClientTuplesRequestBase.readAsync;
 
 import java.util.concurrent.CompletableFuture;
+import org.apache.ignite.client.handler.ClientHandlerMetricSource;
 import org.apache.ignite.client.handler.ClientResourceRegistry;
 import org.apache.ignite.client.handler.NotificationSender;
 import org.apache.ignite.client.handler.ResponseWriter;
@@ -52,12 +53,13 @@ public class ClientTupleInsertAllRequest {
             ClientMessageUnpacker in,
             IgniteTables tables,
             ClientResourceRegistry resources,
+            ClientHandlerMetricSource metrics,
             TxManager txManager,
             ClockService clockService,
             NotificationSender notificationSender,
             HybridTimestampTracker tsTracker
     ) {
-        return readAsync(in, tables, resources, txManager, notificationSender, 
tsTracker, noneOf(RequestOptions.class))
+        return readAsync(in, tables, resources, metrics, txManager, 
notificationSender, tsTracker, noneOf(RequestOptions.class))
                 .thenCompose(req -> 
req.table().recordView().insertAllAsync(req.tx(), req.tuples())
                         .thenApply(skippedTuples -> out -> {
                             writeTxMeta(out, tsTracker, clockService, req);
diff --git 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleInsertRequest.java
 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleInsertRequest.java
index 566f735b594..c8bfe6b60e2 100644
--- 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleInsertRequest.java
+++ 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleInsertRequest.java
@@ -22,6 +22,7 @@ import static 
org.apache.ignite.client.handler.requests.table.ClientTableCommon.
 import static 
org.apache.ignite.client.handler.requests.table.ClientTupleRequestBase.readAsync;
 
 import java.util.concurrent.CompletableFuture;
+import org.apache.ignite.client.handler.ClientHandlerMetricSource;
 import org.apache.ignite.client.handler.ClientResourceRegistry;
 import org.apache.ignite.client.handler.NotificationSender;
 import org.apache.ignite.client.handler.ResponseWriter;
@@ -51,12 +52,13 @@ public class ClientTupleInsertRequest {
             ClientMessageUnpacker in,
             IgniteTables tables,
             ClientResourceRegistry resources,
+            ClientHandlerMetricSource metrics,
             TxManager txManager,
             ClockService clockService,
             NotificationSender notificationSender,
             HybridTimestampTracker tsTracker
     ) {
-        return readAsync(in, tables, resources, txManager, notificationSender, 
tsTracker, noneOf(RequestOptions.class))
+        return readAsync(in, tables, resources, metrics, txManager, 
notificationSender, tsTracker, noneOf(RequestOptions.class))
                 .thenCompose(req -> 
req.table().recordView().insertAsync(req.tx(), req.tuple())
                         .thenApply(res -> out -> {
                             writeTxMeta(out, tsTracker, clockService, req);
diff --git 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleReplaceExactRequest.java
 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleReplaceExactRequest.java
index 1d381333526..ecf2c300eac 100644
--- 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleReplaceExactRequest.java
+++ 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleReplaceExactRequest.java
@@ -22,6 +22,7 @@ import static 
org.apache.ignite.client.handler.requests.table.ClientTableCommon.
 import static 
org.apache.ignite.client.handler.requests.table.ClientTupleRequestBase.RequestOptions.READ_SECOND_TUPLE;
 
 import java.util.concurrent.CompletableFuture;
+import org.apache.ignite.client.handler.ClientHandlerMetricSource;
 import org.apache.ignite.client.handler.ClientResourceRegistry;
 import org.apache.ignite.client.handler.NotificationSender;
 import org.apache.ignite.client.handler.ResponseWriter;
@@ -48,12 +49,22 @@ public class ClientTupleReplaceExactRequest {
             ClientMessageUnpacker in,
             IgniteTables tables,
             ClientResourceRegistry resources,
+            ClientHandlerMetricSource metrics,
             TxManager txManager,
             ClockService clockService,
             NotificationSender notificationSender,
             HybridTimestampTracker tsTracker
     ) {
-        return ClientTupleRequestBase.readAsync(in, tables, resources, 
txManager, notificationSender, tsTracker, of(READ_SECOND_TUPLE))
+        return ClientTupleRequestBase.readAsync(
+                        in,
+                        tables,
+                        resources,
+                        metrics,
+                        txManager,
+                        notificationSender,
+                        tsTracker,
+                        of(READ_SECOND_TUPLE)
+                )
                 .thenCompose(req -> 
req.table().recordView().replaceExactAsync(req.tx(), req.tuple(), req.tuple2())
                         .thenApply(res -> out -> {
                             writeTxMeta(out, tsTracker, clockService, req);
diff --git 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleReplaceRequest.java
 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleReplaceRequest.java
index 361793d7c1e..86d6d58078d 100644
--- 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleReplaceRequest.java
+++ 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleReplaceRequest.java
@@ -22,6 +22,7 @@ import static 
org.apache.ignite.client.handler.requests.table.ClientTableCommon.
 import static 
org.apache.ignite.client.handler.requests.table.ClientTupleRequestBase.readAsync;
 
 import java.util.concurrent.CompletableFuture;
+import org.apache.ignite.client.handler.ClientHandlerMetricSource;
 import org.apache.ignite.client.handler.ClientResourceRegistry;
 import org.apache.ignite.client.handler.NotificationSender;
 import org.apache.ignite.client.handler.ResponseWriter;
@@ -49,12 +50,13 @@ public class ClientTupleReplaceRequest {
             ClientMessageUnpacker in,
             IgniteTables tables,
             ClientResourceRegistry resources,
+            ClientHandlerMetricSource metrics,
             TxManager txManager,
             ClockService clockService,
             NotificationSender notificationSender,
             HybridTimestampTracker tsTracker
     ) {
-        return readAsync(in, tables, resources, txManager, notificationSender, 
tsTracker, noneOf(RequestOptions.class))
+        return readAsync(in, tables, resources, metrics, txManager, 
notificationSender, tsTracker, noneOf(RequestOptions.class))
                 .thenCompose(req -> 
req.table().recordView().replaceAsync(req.tx(), req.tuple())
                         .thenApply(res -> out -> {
                             writeTxMeta(out, tsTracker, clockService, req);
diff --git 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleRequestBase.java
 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleRequestBase.java
index eefed432cd8..b2cdc608a87 100644
--- 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleRequestBase.java
+++ 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleRequestBase.java
@@ -26,6 +26,7 @@ import static 
org.apache.ignite.client.handler.requests.table.ClientTupleRequest
 import java.util.BitSet;
 import java.util.EnumSet;
 import java.util.concurrent.CompletableFuture;
+import org.apache.ignite.client.handler.ClientHandlerMetricSource;
 import org.apache.ignite.client.handler.ClientResourceRegistry;
 import org.apache.ignite.client.handler.NotificationSender;
 import org.apache.ignite.internal.client.proto.ClientMessageUnpacker;
@@ -88,6 +89,7 @@ class ClientTupleRequestBase {
             ClientMessageUnpacker in,
             IgniteTables tables,
             ClientResourceRegistry resources,
+            ClientHandlerMetricSource metrics,
             TxManager txManager,
             @Nullable NotificationSender notificationSender,
             HybridTimestampTracker tsTracker,
@@ -101,6 +103,7 @@ class ClientTupleRequestBase {
                 in,
                 tsTracker,
                 resources,
+                metrics,
                 txManager,
                 tables,
                 options,
diff --git 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleUpsertAllRequest.java
 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleUpsertAllRequest.java
index f9cc36b449f..1d6604e0290 100644
--- 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleUpsertAllRequest.java
+++ 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleUpsertAllRequest.java
@@ -22,6 +22,7 @@ import static 
org.apache.ignite.client.handler.requests.table.ClientTableCommon.
 import static 
org.apache.ignite.client.handler.requests.table.ClientTuplesRequestBase.readAsync;
 
 import java.util.concurrent.CompletableFuture;
+import org.apache.ignite.client.handler.ClientHandlerMetricSource;
 import org.apache.ignite.client.handler.ClientResourceRegistry;
 import org.apache.ignite.client.handler.NotificationSender;
 import org.apache.ignite.client.handler.ResponseWriter;
@@ -49,12 +50,13 @@ public class ClientTupleUpsertAllRequest {
             ClientMessageUnpacker in,
             IgniteTables tables,
             ClientResourceRegistry resources,
+            ClientHandlerMetricSource metrics,
             TxManager txManager,
             ClockService clockService,
             NotificationSender notificationSender,
             HybridTimestampTracker tsTracker
     ) {
-        return readAsync(in, tables, resources, txManager, notificationSender, 
tsTracker, noneOf(RequestOptions.class))
+        return readAsync(in, tables, resources, metrics, txManager, 
notificationSender, tsTracker, noneOf(RequestOptions.class))
                 .thenCompose(req -> 
req.table().recordView().upsertAllAsync(req.tx(), req.tuples())
                         .thenApply(v -> out -> {
                             writeTxMeta(out, tsTracker, clockService, req);
diff --git 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleUpsertRequest.java
 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleUpsertRequest.java
index b80cbc2d405..58efb8accc8 100644
--- 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleUpsertRequest.java
+++ 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTupleUpsertRequest.java
@@ -22,6 +22,7 @@ import static 
org.apache.ignite.client.handler.requests.table.ClientTableCommon.
 import static 
org.apache.ignite.client.handler.requests.table.ClientTupleRequestBase.readAsync;
 
 import java.util.concurrent.CompletableFuture;
+import org.apache.ignite.client.handler.ClientHandlerMetricSource;
 import org.apache.ignite.client.handler.ClientResourceRegistry;
 import org.apache.ignite.client.handler.NotificationSender;
 import org.apache.ignite.client.handler.ResponseWriter;
@@ -51,12 +52,13 @@ public class ClientTupleUpsertRequest {
             ClientMessageUnpacker in,
             IgniteTables tables,
             ClientResourceRegistry resources,
+            ClientHandlerMetricSource metrics,
             TxManager txManager,
             ClockService clockService,
             NotificationSender notificationSender,
             HybridTimestampTracker tsTracker
     ) {
-        return readAsync(in, tables, resources, txManager, notificationSender, 
tsTracker, noneOf(RequestOptions.class))
+        return readAsync(in, tables, resources, metrics, txManager, 
notificationSender, tsTracker, noneOf(RequestOptions.class))
                 .thenCompose(req -> 
req.table().recordView().upsertAsync(req.tx(), req.tuple())
                         .thenApply(v -> out -> {
                             writeTxMeta(out, tsTracker, clockService, req);
diff --git 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTuplesRequestBase.java
 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTuplesRequestBase.java
index c0dbcb6d0d6..43961bcd6d3 100644
--- 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTuplesRequestBase.java
+++ 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/table/ClientTuplesRequestBase.java
@@ -27,6 +27,7 @@ import java.util.BitSet;
 import java.util.EnumSet;
 import java.util.List;
 import java.util.concurrent.CompletableFuture;
+import org.apache.ignite.client.handler.ClientHandlerMetricSource;
 import org.apache.ignite.client.handler.ClientResourceRegistry;
 import org.apache.ignite.client.handler.NotificationSender;
 import 
org.apache.ignite.client.handler.requests.table.ClientTupleRequestBase.RequestOptions;
@@ -72,6 +73,7 @@ class ClientTuplesRequestBase {
             ClientMessageUnpacker in,
             IgniteTables tables,
             ClientResourceRegistry resources,
+            ClientHandlerMetricSource metrics,
             TxManager txManager,
             @Nullable NotificationSender notificationSender,
             HybridTimestampTracker tsTracker,
@@ -82,7 +84,7 @@ class ClientTuplesRequestBase {
         long[] resIdHolder = {0};
 
         CompletableFuture<InternalTransaction> txFut =
-                readOrStartImplicitTx(in, tsTracker, resources, txManager, 
tables, options, notificationSender, resIdHolder);
+                readOrStartImplicitTx(in, tsTracker, resources, metrics, 
txManager, tables, options, notificationSender, resIdHolder);
 
         int schemaId = in.unpackInt();
 
diff --git 
a/modules/client-handler/src/testFixtures/java/org/apache/ignite/client/handler/FakePlacementDriver.java
 
b/modules/client-handler/src/testFixtures/java/org/apache/ignite/client/handler/FakePlacementDriver.java
index 7714422d85f..dab71766356 100644
--- 
a/modules/client-handler/src/testFixtures/java/org/apache/ignite/client/handler/FakePlacementDriver.java
+++ 
b/modules/client-handler/src/testFixtures/java/org/apache/ignite/client/handler/FakePlacementDriver.java
@@ -50,9 +50,16 @@ public class FakePlacementDriver extends 
AbstractEventProducer<PrimaryReplicaEve
 
     private boolean returnError;
 
+    /**
+     * Constructor.
+     *
+     * @param partitions number of partitions.
+     */
     public FakePlacementDriver(int partitions) {
         this.partitions = partitions;
-        primaryReplicas = new ArrayList<>(nCopies(partitions, 
getReplicaMeta("s", new UUID(3, 4), HybridTimestamp.MIN_VALUE.longValue())));
+        primaryReplicas = new ArrayList<>(
+                nCopies(partitions, getReplicaMeta("server-1", new UUID(3, 4), 
HybridTimestamp.MIN_VALUE.longValue()))
+        );
     }
 
     public void returnError(boolean returnError) {
diff --git 
a/modules/client/src/test/java/org/apache/ignite/client/ClientPartitionDistributionTest.java
 
b/modules/client/src/test/java/org/apache/ignite/client/ClientPartitionDistributionTest.java
index 1bc9917e557..358322ddc77 100644
--- 
a/modules/client/src/test/java/org/apache/ignite/client/ClientPartitionDistributionTest.java
+++ 
b/modules/client/src/test/java/org/apache/ignite/client/ClientPartitionDistributionTest.java
@@ -62,8 +62,8 @@ public class ClientPartitionDistributionTest extends 
AbstractClientTest {
         // Before update.
         Map<Partition, ClusterNode> map = 
partDistribution.primaryReplicasAsync().join();
         assertEquals(4, map.size());
-        assertEquals("s", map.get(part0).name());
-        assertEquals("s", 
partDistribution.primaryReplicaAsync(part2).join().name());
+        assertEquals("server-1", map.get(part0).name());
+        assertEquals("server-1", 
partDistribution.primaryReplicaAsync(part2).join().name());
 
         // Update.
         updateServerReplicas(List.of("foo", "bar", "baz", "qux"));
diff --git 
a/modules/client/src/test/java/org/apache/ignite/client/ServerMetricsTest.java 
b/modules/client/src/test/java/org/apache/ignite/client/ServerMetricsTest.java
index 3fcc6e6d613..d765aab714b 100644
--- 
a/modules/client/src/test/java/org/apache/ignite/client/ServerMetricsTest.java
+++ 
b/modules/client/src/test/java/org/apache/ignite/client/ServerMetricsTest.java
@@ -23,6 +23,7 @@ import static org.junit.jupiter.api.Assertions.assertSame;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.util.concurrent.CountDownLatch;
+import java.util.function.Consumer;
 import org.apache.ignite.client.fakes.FakeCompute;
 import org.apache.ignite.compute.JobDescriptor;
 import org.apache.ignite.internal.testframework.IgniteTestUtils;
@@ -38,7 +39,7 @@ import org.junit.jupiter.api.Test;
  * Tests client handler metrics. See also {@code 
org.apache.ignite.client.handler.ItClientHandlerMetricsTest}.
  */
 @SuppressWarnings("AssignmentToStaticFieldFromInstanceMethod")
-public class ServerMetricsTest extends AbstractClientTest {
+public class ServerMetricsTest extends AbstractClientTableTest {
     @AfterEach
     public void resetCompute() {
         FakeCompute.future = null;
@@ -51,18 +52,17 @@ public class ServerMetricsTest extends AbstractClientTest {
         testServer.metrics().enable();
     }
 
-    @Test
-    public void testTxMetrics() {
+    private void testTxMetricsRoutine(Consumer<Transaction> doOpInTx) {
         assertEquals(0, testServer.metrics().transactionsActive());
 
         Transaction tx1 = client.transactions().begin(); // Lazy tx does not 
begin until first operation.
         assertEquals(0, testServer.metrics().transactionsActive());
 
-        client.sql().execute(tx1, "select 1").close(); // Force lazy tx init.
+        doOpInTx.accept(tx1);
         assertEquals(1, testServer.metrics().transactionsActive());
 
         Transaction tx2 = client.transactions().begin();
-        client.sql().execute(tx2, "select 1").close(); // Force lazy tx init.
+        doOpInTx.accept(tx2);
         assertEquals(2, testServer.metrics().transactionsActive());
 
         tx1.rollback();
@@ -72,6 +72,19 @@ public class ServerMetricsTest extends AbstractClientTest {
         assertEquals(0, testServer.metrics().transactionsActive());
     }
 
+    @Test
+    public void testTxMetrics() {
+        testTxMetricsRoutine(tx -> client.sql().execute(tx, "select 
1").close());
+    }
+
+    @Test
+    public void testTxMetricsWithDirectTx() {
+        var table = defaultTable();
+        testTxMetricsRoutine(tx -> {
+            table.keyValueView().put(tx, tupleKey(1), tupleVal("v:" + 
tx.hashCode()));
+        });
+    }
+
     @Test
     public void testSqlMetrics() {
         Statement statement = client.sql().statementBuilder()

Reply via email to