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 7df27a595d8 IGNITE-27188 Java client: Fix node restart handling (#7327)
7df27a595d8 is described below

commit 7df27a595d8890f62b76187d53c423f1b326debd
Author: Pavel Tupitsyn <[email protected]>
AuthorDate: Tue Dec 30 13:12:13 2025 +0200

    IGNITE-27188 Java client: Fix node restart handling (#7327)
    
    Fix node comparison in `getOrCreateChannelAsync`: node id changes on 
restart, node name is consistent.
---
 .../ignite/internal/client/ReliableChannel.java    |  2 +-
 .../org/apache/ignite/client/ReconnectTest.java    | 30 ++++++++++++------
 .../java/org/apache/ignite/client/TestServer.java  | 36 ++++++++++++----------
 .../ignite/jdbc/ItJdbcConnectionFailoverTest.java  |  1 -
 4 files changed, 41 insertions(+), 28 deletions(-)

diff --git 
a/modules/client/src/main/java/org/apache/ignite/internal/client/ReliableChannel.java
 
b/modules/client/src/main/java/org/apache/ignite/internal/client/ReliableChannel.java
index 2652778896c..3d54918e751 100644
--- 
a/modules/client/src/main/java/org/apache/ignite/internal/client/ReliableChannel.java
+++ 
b/modules/client/src/main/java/org/apache/ignite/internal/client/ReliableChannel.java
@@ -947,7 +947,7 @@ public final class ReliableChannel implements AutoCloseable 
{
                     nodeChannelsByName.put(newNode.name(), this);
 
                     var oldServerNode = serverNode;
-                    if (oldServerNode != null && 
!oldServerNode.id().equals(newNode.id())) {
+                    if (oldServerNode != null && 
!oldServerNode.name().equals(newNode.name())) {
                         // New node on the old address.
                         nodeChannelsByName.remove(oldServerNode.name(), this);
                     }
diff --git 
a/modules/client/src/test/java/org/apache/ignite/client/ReconnectTest.java 
b/modules/client/src/test/java/org/apache/ignite/client/ReconnectTest.java
index c1f551fdf4e..5eee3718e00 100644
--- a/modules/client/src/test/java/org/apache/ignite/client/ReconnectTest.java
+++ b/modules/client/src/test/java/org/apache/ignite/client/ReconnectTest.java
@@ -18,11 +18,13 @@
 package org.apache.ignite.client;
 
 import static 
org.apache.ignite.internal.testframework.IgniteTestUtils.assertThrowsWithCause;
+import static 
org.apache.ignite.internal.testframework.IgniteTestUtils.deriveUuidFrom;
 import static org.apache.ignite.internal.util.IgniteUtils.closeAll;
 import static org.junit.jupiter.api.Assertions.assertArrayEquals;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
+import java.util.UUID;
 import org.apache.ignite.client.IgniteClient.Builder;
 import org.apache.ignite.client.fakes.FakeIgnite;
 import org.apache.ignite.client.fakes.FakeIgniteTables;
@@ -95,7 +97,7 @@ public class ReconnectTest extends BaseIgniteAbstractTest {
     @ParameterizedTest
     @ValueSource(booleans = { true, false })
     public void testClientRepairsBackgroundConnectionsPeriodically(boolean 
reconnectEnabled) throws Exception {
-        startTwoServers();
+        startTwoServers(false);
 
         Builder builder = IgniteClient.builder()
                 .addresses("127.0.0.1:10901", "127.0.0.1:10902", 
"127.0.0.1:10903")
@@ -127,9 +129,10 @@ public class ReconnectTest extends BaseIgniteAbstractTest {
         }
     }
 
-    @Test
-    public void testFullClusterRestart() throws Exception {
-        startTwoServers();
+    @ParameterizedTest
+    @ValueSource(booleans = { true, false })
+    public void testFullClusterRestart(boolean changeNodeIds) throws Exception 
{
+        startTwoServers(changeNodeIds);
 
         Builder builder = IgniteClient.builder()
                 .addresses("127.0.0.1:10901", "127.0.0.1:10902")
@@ -142,16 +145,23 @@ public class ReconnectTest extends BaseIgniteAbstractTest 
{
             closeAll(server, server2);
             waitForConnections(client, 0);
 
-            startTwoServers();
+            startTwoServers(changeNodeIds);
             waitForConnections(client, 2);
         }
     }
 
-    private void startTwoServers() {
-        FakeIgnite ignite = new FakeIgnite();
-        server = new TestServer(0, ignite, null, null, "node1", 
AbstractClientTest.clusterId, null, 10901);
-        FakeIgnite ignite1 = new FakeIgnite();
-        server2 = new TestServer(0, ignite1, null, null, "node2", 
AbstractClientTest.clusterId, null, 10902);
+    private void startTwoServers(boolean randomNodeIds) {
+        server = startServer("node1", 10901, randomNodeIds);
+        server2 = startServer("node2", 10902, randomNodeIds);
+    }
+
+    private static TestServer startServer(String nodeName, int port, boolean 
randomNodeId) {
+        return TestServer.builder()
+                .nodeName(nodeName)
+                .clusterId(AbstractClientTest.clusterId)
+                .port(port)
+                .nodeId(randomNodeId ? UUID.randomUUID() : 
deriveUuidFrom(nodeName))
+                .build();
     }
 
     private static void waitForConnections(IgniteClient client, int 
expectedConnections) throws InterruptedException {
diff --git 
a/modules/client/src/test/java/org/apache/ignite/client/TestServer.java 
b/modules/client/src/test/java/org/apache/ignite/client/TestServer.java
index 875c92ac355..25cb3ee94d0 100644
--- a/modules/client/src/test/java/org/apache/ignite/client/TestServer.java
+++ b/modules/client/src/test/java/org/apache/ignite/client/TestServer.java
@@ -96,6 +96,8 @@ public class TestServer implements AutoCloseable {
 
     private final NettyBootstrapFactory bootstrapFactory;
 
+    private final UUID nodeId;
+
     private final String nodeName;
 
     private final ClientHandlerMetricSource metrics;
@@ -156,6 +158,7 @@ public class TestServer implements AutoCloseable {
                 port,
                 true,
                 null,
+                null,
                 null
         );
     }
@@ -177,7 +180,8 @@ public class TestServer implements AutoCloseable {
             @Nullable Integer port,
             boolean enableRequestHandling,
             @Nullable BitSet features,
-            String @Nullable [] listenAddresses
+            String @Nullable [] listenAddresses,
+            @Nullable UUID nodeId
     ) {
         ResourceLeakDetector.setLevel(ResourceLeakDetector.Level.PARANOID);
 
@@ -217,14 +221,16 @@ public class TestServer implements AutoCloseable {
         }
 
         this.nodeName = nodeName;
+        this.nodeId = nodeId == null ? getNodeId(nodeName) : nodeId;
+
         this.ignite = ignite;
 
         ClusterService clusterService = mock(ClusterService.class, 
RETURNS_DEEP_STUBS);
-        
Mockito.when(clusterService.topologyService().localMember().id()).thenReturn(getNodeId(nodeName));
+        
Mockito.when(clusterService.topologyService().localMember().id()).thenReturn(this.nodeId);
         
Mockito.when(clusterService.topologyService().localMember().name()).thenReturn(nodeName);
-        
Mockito.when(clusterService.topologyService().localMember()).thenReturn(getClusterNode(nodeName));
+        
Mockito.when(clusterService.topologyService().localMember()).thenReturn(getClusterNode(nodeName,
 this.nodeId));
         
Mockito.when(clusterService.topologyService().getByConsistentId(anyString())).thenAnswer(
-                i -> getClusterNode(i.getArgument(0, String.class)));
+                i -> getClusterNode(i.getArgument(0, String.class), 
getNodeId(i.getArgument(0, String.class))));
 
         metrics = new ClientHandlerMetricSource();
         metrics.enable();
@@ -328,15 +334,6 @@ public class TestServer implements AutoCloseable {
         return nodeName;
     }
 
-    /**
-     * Gets the node ID.
-     *
-     * @return Node ID.
-     */
-    public UUID nodeId() {
-        return getNodeId(nodeName);
-    }
-
     /**
      * Gets metrics.
      *
@@ -383,8 +380,8 @@ public class TestServer implements AutoCloseable {
         }
     }
 
-    private InternalClusterNode getClusterNode(String name) {
-        return new ClusterNodeImpl(getNodeId(name), name, new 
NetworkAddress("127.0.0.1", 8080));
+    private static InternalClusterNode getClusterNode(String name, UUID 
nodeId) {
+        return new ClusterNodeImpl(nodeId, name, new 
NetworkAddress("127.0.0.1", 8080));
     }
 
     private static UUID getNodeId(String name) {
@@ -414,6 +411,7 @@ public class TestServer implements AutoCloseable {
         private boolean enableRequestHandling = true;
         private @Nullable BitSet features;
         private @Nullable String[] listenAddresses;
+        private @Nullable UUID nodeId;
 
         public Builder idleTimeout(long idleTimeout) {
             this.idleTimeout = idleTimeout;
@@ -470,6 +468,11 @@ public class TestServer implements AutoCloseable {
             return this;
         }
 
+        public Builder nodeId(@Nullable UUID nodeId) {
+            this.nodeId = nodeId;
+            return this;
+        }
+
         /**
          * Builds the test server.
          *
@@ -487,7 +490,8 @@ public class TestServer implements AutoCloseable {
                     port,
                     enableRequestHandling,
                     features,
-                    listenAddresses
+                    listenAddresses,
+                    nodeId
             );
         }
     }
diff --git 
a/modules/jdbc/src/integrationTest/java/org/apache/ignite/jdbc/ItJdbcConnectionFailoverTest.java
 
b/modules/jdbc/src/integrationTest/java/org/apache/ignite/jdbc/ItJdbcConnectionFailoverTest.java
index 30243d5041b..f44d41533e7 100644
--- 
a/modules/jdbc/src/integrationTest/java/org/apache/ignite/jdbc/ItJdbcConnectionFailoverTest.java
+++ 
b/modules/jdbc/src/integrationTest/java/org/apache/ignite/jdbc/ItJdbcConnectionFailoverTest.java
@@ -131,7 +131,6 @@ public class ItJdbcConnectionFailoverTest extends 
ClusterPerTestIntegrationTest
      *          JDBC connection property is correctly applied to the 
underlying client.
      */
     @Test
-    @Disabled("https://issues.apache.org/jira/browse/IGNITE-27188";)
     void testConnectionRestoredAfterBackgroundReconnectInterval() throws 
Exception {
         int nodesCount = 3;
         cluster.startAndInit(nodesCount, new int[]{2});

Reply via email to