From cb401bb829e3730aa52b85bb790dc217d145ecf5 Mon Sep 17 00:00:00 2001 From: Pavel Tupitsyn Date: Mon, 16 Mar 2026 13:52:58 +0200 Subject: [PATCH 01/13] IGNITE-28239 Java client: Failed to deserialize server response. Expected boolean, but got Integer https://issues.apache.org/jira/browse/IGNITE-28239 --- .../org/apache/ignite/internal/client/tx/DirectTxUtils.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/client/src/main/java/org/apache/ignite/internal/client/tx/DirectTxUtils.java b/modules/client/src/main/java/org/apache/ignite/internal/client/tx/DirectTxUtils.java index a74f25fe2a02..4932455ad5ad 100644 --- a/modules/client/src/main/java/org/apache/ignite/internal/client/tx/DirectTxUtils.java +++ b/modules/client/src/main/java/org/apache/ignite/internal/client/tx/DirectTxUtils.java @@ -225,11 +225,11 @@ public static void readTx( "Encountered no-op on first direct enlistment, server version upgrade is required")); } } else { - String consistentId = payloadChannel.in().unpackString(); - long token = payloadChannel.in().unpackLong(); + String consistentId = in.unpackString(); + long token = in.unpackLong(); // Test if no-op enlistment. - if (payloadChannel.in().unpackBoolean()) { + if (in.unpackBoolean()) { payloadChannel.clientChannel().inflights().removeInflight(tx.txId(), null); } From 954c7127a5574b481f7e711daeb67cf74b9d6811 Mon Sep 17 00:00:00 2001 From: Pavel Tupitsyn Date: Mon, 16 Mar 2026 14:58:35 +0200 Subject: [PATCH 02/13] Fix inconsistent behavior of readTx --- .../ignite/internal/client/tx/DirectTxUtils.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/client/src/main/java/org/apache/ignite/internal/client/tx/DirectTxUtils.java b/modules/client/src/main/java/org/apache/ignite/internal/client/tx/DirectTxUtils.java index 4932455ad5ad..5ea86379b803 100644 --- a/modules/client/src/main/java/org/apache/ignite/internal/client/tx/DirectTxUtils.java +++ b/modules/client/src/main/java/org/apache/ignite/internal/client/tx/DirectTxUtils.java @@ -216,7 +216,11 @@ public static void readTx( assert tx != null; assert ctx.pm != null; - if (in.tryUnpackNil()) { // This may happen on no-op enlistment when a newer client is connected to older server. + String consistentId = in.unpackStringNullable(); + long token = in.unpackLong(); + boolean isNoop = in.unpackBoolean(); + + if (consistentId == null) { // This may happen on no-op enlistment when a newer client is connected to older server. payloadChannel.clientChannel().inflights().removeInflight(tx.txId(), null); // If this is first enlistment to a partition, we hit a bug and can't do anything but fail. @@ -225,11 +229,7 @@ public static void readTx( "Encountered no-op on first direct enlistment, server version upgrade is required")); } } else { - String consistentId = in.unpackString(); - long token = in.unpackLong(); - - // Test if no-op enlistment. - if (in.unpackBoolean()) { + if (isNoop) { payloadChannel.clientChannel().inflights().removeInflight(tx.txId(), null); } From 7e56bbe8034586f7b7bd5acc647a1e697892e149 Mon Sep 17 00:00:00 2001 From: Pavel Tupitsyn Date: Mon, 16 Mar 2026 15:04:47 +0200 Subject: [PATCH 03/13] Revert "Fix inconsistent behavior of readTx" This reverts commit 954c7127a5574b481f7e711daeb67cf74b9d6811. --- .../ignite/internal/client/tx/DirectTxUtils.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/client/src/main/java/org/apache/ignite/internal/client/tx/DirectTxUtils.java b/modules/client/src/main/java/org/apache/ignite/internal/client/tx/DirectTxUtils.java index 5ea86379b803..4932455ad5ad 100644 --- a/modules/client/src/main/java/org/apache/ignite/internal/client/tx/DirectTxUtils.java +++ b/modules/client/src/main/java/org/apache/ignite/internal/client/tx/DirectTxUtils.java @@ -216,11 +216,7 @@ public static void readTx( assert tx != null; assert ctx.pm != null; - String consistentId = in.unpackStringNullable(); - long token = in.unpackLong(); - boolean isNoop = in.unpackBoolean(); - - if (consistentId == null) { // This may happen on no-op enlistment when a newer client is connected to older server. + if (in.tryUnpackNil()) { // This may happen on no-op enlistment when a newer client is connected to older server. payloadChannel.clientChannel().inflights().removeInflight(tx.txId(), null); // If this is first enlistment to a partition, we hit a bug and can't do anything but fail. @@ -229,7 +225,11 @@ public static void readTx( "Encountered no-op on first direct enlistment, server version upgrade is required")); } } else { - if (isNoop) { + String consistentId = in.unpackString(); + long token = in.unpackLong(); + + // Test if no-op enlistment. + if (in.unpackBoolean()) { payloadChannel.clientChannel().inflights().removeInflight(tx.txId(), null); } From 77295976020ee779dfe440d934cb1e1a55b9c0b3 Mon Sep 17 00:00:00 2001 From: Pavel Tupitsyn Date: Mon, 16 Mar 2026 15:10:05 +0200 Subject: [PATCH 04/13] add assertions --- .../ignite/client/handler/requests/table/ClientTableCommon.java | 2 ++ .../java/org/apache/ignite/internal/tx/PartitionEnlistment.java | 2 ++ 2 files changed, 4 insertions(+) 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 3418ada28f5c..e4b3d670f075 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 @@ -385,6 +385,8 @@ public static void writeTxMeta( out.packLong(tx.getTimeout()); } else if (tx.remote()) { PendingTxPartitionEnlistment token = tx.enlistedPartition(null); + assert token.primaryNodeConsistentId() != null : "Primary node consistent ID must not be null for remote transactions"; + out.packString(token.primaryNodeConsistentId()); out.packLong(token.consistencyToken()); out.packBoolean(TxState.ABORTED == tx.state()); // No-op enlistment. diff --git a/modules/transactions/src/main/java/org/apache/ignite/internal/tx/PartitionEnlistment.java b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/PartitionEnlistment.java index 1b09f56f9ffd..123d0fa229d6 100644 --- a/modules/transactions/src/main/java/org/apache/ignite/internal/tx/PartitionEnlistment.java +++ b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/PartitionEnlistment.java @@ -31,6 +31,8 @@ public class PartitionEnlistment { protected final Set tableIds; public PartitionEnlistment(String primaryNodeConsistentId, Set tableIds) { + assert primaryNodeConsistentId != null : "Primary node consistent ID cannot be null"; + this.primaryNodeConsistentId = primaryNodeConsistentId; this.tableIds = tableIds; } From cad13adeae0a25eb4942e8633f4fd647f1af048c Mon Sep 17 00:00:00 2001 From: Pavel Tupitsyn Date: Mon, 16 Mar 2026 16:49:38 +0200 Subject: [PATCH 05/13] Fix discard logic --- .../handler/requests/tx/ClientTransactionDiscardRequest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/tx/ClientTransactionDiscardRequest.java b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/tx/ClientTransactionDiscardRequest.java index e343917ea71d..484254ef5f63 100644 --- a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/tx/ClientTransactionDiscardRequest.java +++ b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/tx/ClientTransactionDiscardRequest.java @@ -63,7 +63,7 @@ public static CompletableFuture process( if (table != null) { ZonePartitionId replicationGroupId = table.internalTable().targetReplicationGroupId(partId); - enlistedPartitions.computeIfAbsent(replicationGroupId, k -> new PendingTxPartitionEnlistment(null, 0)) + enlistedPartitions.computeIfAbsent(replicationGroupId, k -> new PendingTxPartitionEnlistment("", 0)) .addTableId(tableId); } } From 38ece4b6754eab2201ad0cf73debd009da631c31 Mon Sep 17 00:00:00 2001 From: Pavel Tupitsyn Date: Mon, 16 Mar 2026 16:50:14 +0200 Subject: [PATCH 06/13] Fix discard logic --- .../handler/requests/tx/ClientTransactionDiscardRequest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/tx/ClientTransactionDiscardRequest.java b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/tx/ClientTransactionDiscardRequest.java index 484254ef5f63..dc823da38aef 100644 --- a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/tx/ClientTransactionDiscardRequest.java +++ b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/tx/ClientTransactionDiscardRequest.java @@ -63,7 +63,7 @@ public static CompletableFuture process( if (table != null) { ZonePartitionId replicationGroupId = table.internalTable().targetReplicationGroupId(partId); - enlistedPartitions.computeIfAbsent(replicationGroupId, k -> new PendingTxPartitionEnlistment("", 0)) + enlistedPartitions.computeIfAbsent(replicationGroupId, k -> new PendingTxPartitionEnlistment("UNUSED", 0)) .addTableId(tableId); } } From a602c741ceb85374ae1ab353b0f8d29ca6c0d3d0 Mon Sep 17 00:00:00 2001 From: Pavel Tupitsyn Date: Mon, 16 Mar 2026 17:04:10 +0200 Subject: [PATCH 07/13] wip testBigGetAll --- .../app/client/ItThinClientTransactionsTest.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientTransactionsTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientTransactionsTest.java index ae2633c88c8d..88d79ac05577 100644 --- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientTransactionsTest.java +++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientTransactionsTest.java @@ -104,6 +104,16 @@ public class ItThinClientTransactionsTest extends ItAbstractThinClientTest { private static final String INFLIGHTS_FIELD_NAME = "inflights"; + @Test + void testBigGetAll() { + KeyValueView kvView = kvView(); + + Map map = Stream.iterate(0, i -> i + 1).limit(10_000).collect(Collectors.toMap(i -> i, String::valueOf)); + kvView.putAll(map); + + kvView.getAll(map.keySet()); + } + @Test void testKvViewOperations() { KeyValueView kvView = kvView(); From 9136ecd9c8122b16e4b2438e12690ceee491bdea Mon Sep 17 00:00:00 2001 From: Pavel Tupitsyn Date: Mon, 16 Mar 2026 17:06:23 +0200 Subject: [PATCH 08/13] wip testBigGetAll --- .../runner/app/client/ItThinClientTransactionsTest.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientTransactionsTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientTransactionsTest.java index 88d79ac05577..f94e851f6b32 100644 --- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientTransactionsTest.java +++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientTransactionsTest.java @@ -104,6 +104,11 @@ public class ItThinClientTransactionsTest extends ItAbstractThinClientTest { private static final String INFLIGHTS_FIELD_NAME = "inflights"; + @Override + protected int nodes() { + return 4; + } + @Test void testBigGetAll() { KeyValueView kvView = kvView(); @@ -111,7 +116,8 @@ void testBigGetAll() { Map map = Stream.iterate(0, i -> i + 1).limit(10_000).collect(Collectors.toMap(i -> i, String::valueOf)); kvView.putAll(map); - kvView.getAll(map.keySet()); + Map all = kvView.getAll(map.keySet()); + assertEquals(all.size(), map.size()); } @Test From 26d7cd9ec6646e79e92eb1c1ef7b240e8aa67ae1 Mon Sep 17 00:00:00 2001 From: Pavel Tupitsyn Date: Tue, 17 Mar 2026 11:16:29 +0200 Subject: [PATCH 09/13] Improve validation --- .../requests/table/ClientTableCommon.java | 8 ++++++-- .../app/client/ItThinClientTransactionsTest.java | 16 ---------------- 2 files changed, 6 insertions(+), 18 deletions(-) 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 e4b3d670f075..8d8851dd0949 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 @@ -385,9 +385,13 @@ public static void writeTxMeta( out.packLong(tx.getTimeout()); } else if (tx.remote()) { PendingTxPartitionEnlistment token = tx.enlistedPartition(null); - assert token.primaryNodeConsistentId() != null : "Primary node consistent ID must not be null for remote transactions"; + String consistentId = token.primaryNodeConsistentId(); - out.packString(token.primaryNodeConsistentId()); + if (consistentId == null) { + throw new IllegalStateException("Primary node consistent ID must not be null for remote transactions: " + tx); + } + + out.packString(consistentId); out.packLong(token.consistencyToken()); out.packBoolean(TxState.ABORTED == tx.state()); // No-op enlistment. diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientTransactionsTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientTransactionsTest.java index f94e851f6b32..ae2633c88c8d 100644 --- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientTransactionsTest.java +++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientTransactionsTest.java @@ -104,22 +104,6 @@ public class ItThinClientTransactionsTest extends ItAbstractThinClientTest { private static final String INFLIGHTS_FIELD_NAME = "inflights"; - @Override - protected int nodes() { - return 4; - } - - @Test - void testBigGetAll() { - KeyValueView kvView = kvView(); - - Map map = Stream.iterate(0, i -> i + 1).limit(10_000).collect(Collectors.toMap(i -> i, String::valueOf)); - kvView.putAll(map); - - Map all = kvView.getAll(map.keySet()); - assertEquals(all.size(), map.size()); - } - @Test void testKvViewOperations() { KeyValueView kvView = kvView(); From cf2b3e1e27e33c5902ccebe8a0390b88d4b37911 Mon Sep 17 00:00:00 2001 From: Pavel Tupitsyn Date: Tue, 17 Mar 2026 11:44:45 +0200 Subject: [PATCH 10/13] Add buf hex dump to MessageTypeException for better problem diagnosis --- .../client/proto/ClientMessageUnpacker.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/modules/client-common/src/main/java/org/apache/ignite/internal/client/proto/ClientMessageUnpacker.java b/modules/client-common/src/main/java/org/apache/ignite/internal/client/proto/ClientMessageUnpacker.java index 42a341fa812a..4b010fd0fdbb 100644 --- a/modules/client-common/src/main/java/org/apache/ignite/internal/client/proto/ClientMessageUnpacker.java +++ b/modules/client-common/src/main/java/org/apache/ignite/internal/client/proto/ClientMessageUnpacker.java @@ -20,6 +20,7 @@ import static org.msgpack.core.MessagePack.Code; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.charset.StandardCharsets; @@ -83,7 +84,7 @@ private static MessageSizeException overflowU32Size(int u32) { * @param b Actual format. * @return Exception to throw. */ - private static MessagePackException unexpected(String expected, byte b) { + private MessagePackException unexpected(String expected, byte b) { MessageFormat format = MessageFormat.valueOf(b); if (format == MessageFormat.NEVER_USED) { @@ -91,7 +92,20 @@ private static MessagePackException unexpected(String expected, byte b) { } else { String name = format.getValueType().name(); String typeName = name.charAt(0) + name.substring(1).toLowerCase(); - return new MessageTypeException(String.format("Expected %s, but got %s (%02x)", expected, typeName, b)); + + // Convert all bytes from the start of the buffer to the current position to a string for debugging + ByteBuf slice = buf.slice(0, buf.readerIndex()); + + int maxBufSliceLen = 256; + if (slice.readableBytes() > maxBufSliceLen) { + slice = slice.slice(slice.readableBytes() - maxBufSliceLen, maxBufSliceLen); + } + + String bufContent = ByteBufUtil.hexDump(slice); + int problemPos = buf.readerIndex() - 1; + + return new MessageTypeException( + String.format("Expected %s, but got %s (%02x) at pos %s: '%s'", expected, typeName, b, problemPos, bufContent)); } } From 4b9893525b12b97e6e57743c536340498e0a3ce8 Mon Sep 17 00:00:00 2001 From: Pavel Tupitsyn Date: Tue, 17 Mar 2026 11:48:20 +0200 Subject: [PATCH 11/13] Improve "Failed to deserialize server response" exception --- .../internal/client/TcpClientChannel.java | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/modules/client/src/main/java/org/apache/ignite/internal/client/TcpClientChannel.java b/modules/client/src/main/java/org/apache/ignite/internal/client/TcpClientChannel.java index 8a43ac6c5173..bbc257ff6d83 100644 --- a/modules/client/src/main/java/org/apache/ignite/internal/client/TcpClientChannel.java +++ b/modules/client/src/main/java/org/apache/ignite/internal/client/TcpClientChannel.java @@ -432,7 +432,7 @@ private CompletableFuture send( try { ClientMessageUnpacker unpacker = fut.join(); - return completedFuture(complete(payloadReader, notificationFut, unpacker)); + return completedFuture(complete(payloadReader, notificationFut, unpacker, opCode)); } catch (Throwable t) { expectedException = true; throw sneakyThrow(ViewUtils.ensurePublicException(t)); @@ -443,7 +443,7 @@ private CompletableFuture send( CompletableFuture resFut = new CompletableFuture<>(); fut.handle((unpacker, err) -> { - completeAsync(payloadReader, notificationFut, unpacker, err, resFut); + completeAsync(payloadReader, notificationFut, unpacker, err, resFut, opCode); return null; }); @@ -476,7 +476,8 @@ private void completeAsync( @Nullable CompletableFuture notificationFut, ClientMessageUnpacker unpacker, @Nullable Throwable err, - CompletableFuture resFut + CompletableFuture resFut, + int opCode ) { if (err != null) { assert unpacker == null : "unpacker must be null if err is not null"; @@ -497,7 +498,7 @@ private void completeAsync( // With handleAsync et al we can't close the unpacker in that case. asyncContinuationExecutor.execute(() -> { try { - resFut.complete(complete(payloadReader, notificationFut, unpacker)); + resFut.complete(complete(payloadReader, notificationFut, unpacker, opCode)); } catch (Throwable t) { resFut.completeExceptionally(ViewUtils.ensurePublicException(t)); } @@ -516,11 +517,13 @@ private void completeAsync( * @param payloadReader Payload reader. * @param notificationFut Notify future. * @param unpacker Unpacked message. + * @param opCode Op code. */ private @Nullable T complete( @Nullable PayloadReader payloadReader, @Nullable CompletableFuture notificationFut, - ClientMessageUnpacker unpacker + ClientMessageUnpacker unpacker, + int opCode ) { try (unpacker) { if (payloadReader != null) { @@ -529,9 +532,10 @@ private void completeAsync( return null; } catch (Throwable e) { - log.error("Failed to deserialize server response [remoteAddress=" + cfg.getAddress() + "]: " + e.getMessage(), e); + log.error("Failed to deserialize server response [remoteAddress=" + cfg.getAddress() + ", opCode=" + opCode + "]: " + + e.getMessage(), e); - throw new IgniteException(PROTOCOL_ERR, "Failed to deserialize server response: " + e.getMessage(), e); + throw new IgniteException(PROTOCOL_ERR, "Failed to deserialize server response for op " + opCode + ": " + e.getMessage(), e); } } @@ -736,7 +740,7 @@ private CompletableFuture handshakeAsync(ProtocolVersion ver) throws Ign CompletableFuture resFut = new CompletableFuture<>(); fut.handle((unpacker, err) -> { - completeAsync(r -> handshakeRes(r.in()), null, unpacker, err, resFut); + completeAsync(r -> handshakeRes(r.in()), null, unpacker, err, resFut, -1); return null; }); From 07abc4f58421005633a5b5db2e0fd4822fea534e Mon Sep 17 00:00:00 2001 From: Pavel Tupitsyn Date: Tue, 17 Mar 2026 11:53:22 +0200 Subject: [PATCH 12/13] Fix ClientKeyValueViewTest --- .../ignite/client/ClientKeyValueViewTest.java | 13 +++++++------ .../runner/app/client/ItThinClientSqlTest.java | 2 +- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/modules/client/src/test/java/org/apache/ignite/client/ClientKeyValueViewTest.java b/modules/client/src/test/java/org/apache/ignite/client/ClientKeyValueViewTest.java index f4853007dc86..72c68f3e3df2 100644 --- a/modules/client/src/test/java/org/apache/ignite/client/ClientKeyValueViewTest.java +++ b/modules/client/src/test/java/org/apache/ignite/client/ClientKeyValueViewTest.java @@ -579,31 +579,32 @@ public void testNonNullableColumnWithDefaultValueSetNullThrowsException() { @Test public void testGetNullValueThrows() { - testNullValueThrows(view -> view.get(null, DEFAULT_ID), "getNullable"); + testNullValueThrows(view -> view.get(null, DEFAULT_ID), "getNullable", 12); } @Test public void testGetAndPutNullValueThrows() { - testNullValueThrows(view -> view.getAndPut(null, DEFAULT_ID, DEFAULT_NAME), "getNullableAndPut"); + testNullValueThrows(view -> view.getAndPut(null, DEFAULT_ID, DEFAULT_NAME), "getNullableAndPut", 16); } @Test public void testGetAndRemoveNullValueThrows() { - testNullValueThrows(view -> view.getAndRemove(null, DEFAULT_ID), "getNullableAndRemove"); + testNullValueThrows(view -> view.getAndRemove(null, DEFAULT_ID), "getNullableAndRemove", 32); } @Test public void testGetAndReplaceNullValueThrows() { - testNullValueThrows(view -> view.getAndReplace(null, DEFAULT_ID, DEFAULT_NAME), "getNullableAndReplace"); + testNullValueThrows(view -> view.getAndReplace(null, DEFAULT_ID, DEFAULT_NAME), "getNullableAndReplace", 26); } - private void testNullValueThrows(Consumer> run, String methodName) { + private void testNullValueThrows(Consumer> run, String methodName, int op) { KeyValueView primitiveView = defaultTable().keyValueView(Mapper.of(Long.class), Mapper.of(String.class)); primitiveView.put(null, DEFAULT_ID, null); var ex = assertThrowsWithCause(() -> run.accept(primitiveView), UnexpectedNullValueException.class); assertEquals( - format("Failed to deserialize server response: Got unexpected null value: use `{}` sibling method instead.", methodName), + format("Failed to deserialize server response for op {}: Got unexpected null value: use `{}` sibling method instead.", + op, methodName), ex.getMessage()); } diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientSqlTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientSqlTest.java index 0b2a21923c62..ec7973ea7ccf 100644 --- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientSqlTest.java +++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientSqlTest.java @@ -626,7 +626,7 @@ void testResultSetMappingColumnNameMismatch() { IgniteException.class, () -> client().sql().execute((Transaction) null, Mapper.of(Pojo.class), query)); - assertEquals("Failed to deserialize server response: No mapped object field found for column 'FOO'", e.getMessage()); + assertEquals("Failed to deserialize server response for op 50: No mapped object field found for column 'FOO'", e.getMessage()); } @Test From 1f86c5e2bdaed44c46a4d0770656433fd6de1695 Mon Sep 17 00:00:00 2001 From: Pavel Tupitsyn Date: Tue, 17 Mar 2026 11:56:40 +0200 Subject: [PATCH 13/13] Fix checkstyle --- .../org/apache/ignite/internal/tx/PartitionEnlistment.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/transactions/src/main/java/org/apache/ignite/internal/tx/PartitionEnlistment.java b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/PartitionEnlistment.java index 123d0fa229d6..4917b047c11a 100644 --- a/modules/transactions/src/main/java/org/apache/ignite/internal/tx/PartitionEnlistment.java +++ b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/PartitionEnlistment.java @@ -30,6 +30,12 @@ public class PartitionEnlistment { @IgniteToStringInclude protected final Set tableIds; + /** + * Constructs a {@code PartitionEnlistment} instance. + * + * @param primaryNodeConsistentId The consistent ID of the primary node. + * @param tableIds A set of table IDs for which the partition is enlisted. + */ public PartitionEnlistment(String primaryNodeConsistentId, Set tableIds) { assert primaryNodeConsistentId != null : "Primary node consistent ID cannot be null";