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});