From a051e32c7e4d6e3d619f7b5b767beb1279776c92 Mon Sep 17 00:00:00 2001 From: Daniil Date: Wed, 10 Dec 2025 12:09:44 +0300 Subject: [PATCH 1/5] restore deprecated methods --- .../configuration/ClientConfiguration.java | 47 +++++++++++++++++-- .../thin/ClientChannelConfiguration.java | 28 +++++++++-- .../client/thin/TcpClientChannel.java | 14 ++++-- .../GridNioClientConnectionMultiplexer.java | 2 +- .../client/ClientConfigurationTest.java | 3 +- .../org/apache/ignite/client/Comparers.java | 3 +- .../thin/ThinClientEnpointsDiscoveryTest.java | 3 +- .../internal/client/thin/TimeoutTest.java | 2 +- .../ClientSessionOutboundQueueLimitTest.java | 3 +- 9 files changed, 86 insertions(+), 19 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/configuration/ClientConfiguration.java b/modules/core/src/main/java/org/apache/ignite/configuration/ClientConfiguration.java index ed1f0319fb0ce..1ccc7082d51af 100644 --- a/modules/core/src/main/java/org/apache/ignite/configuration/ClientConfiguration.java +++ b/modules/core/src/main/java/org/apache/ignite/configuration/ClientConfiguration.java @@ -57,8 +57,11 @@ public final class ClientConfiguration implements Serializable { /** @serial Tcp no delay. */ private boolean tcpNoDelay = true; - /** @serial Timeout. 0 means infinite. */ - private int timeout; + /** @serial Connection timeout in milliseconds. 0 means infinite. */ + private int connTimeout; + + /** @serial Request timeout in milliseconds. 0 means infinite. */ + private int reqTimeout; /** @serial Send buffer size. 0 means system default. */ private int sndBufSize = 32 * 1024; @@ -227,19 +230,55 @@ public ClientConfiguration setTcpNoDelay(boolean tcpNoDelay) { } /** + * @deprecated Use {@link #getConnTimeout()} and {@link #getReqTimeout()} instead. * @return Send/receive timeout in milliseconds. */ + @Deprecated public int getTimeout() { - return timeout; + return Math.max(connTimeout, reqTimeout); } /** + * @deprecated Use {@link #setConnTimeout(int)} and {@link #setReqTimeout(int)} instead. * @param timeout Send/receive timeout in milliseconds. * @return {@code this} for chaining. */ + @Deprecated public ClientConfiguration setTimeout(int timeout) { - this.timeout = timeout; + this.connTimeout = timeout; + this.reqTimeout = timeout; + return this; + } + + /** + * @return Connection timeout in milliseconds. 0 means infinite. + */ + public int getConnTimeout() { + return connTimeout; + } + + /** + * @param connTimeout Connection timeout in milliseconds. 0 means infinite. + * @return {@code this} for chaining. + */ + public ClientConfiguration setConnTimeout(int connTimeout) { + this.connTimeout = connTimeout; + return this; + } + + /** + * @return Request timeout in milliseconds. 0 means infinite. + */ + public int getReqTimeout() { + return reqTimeout; + } + /** + * @param reqTimeout Request timeout in milliseconds. 0 means infinite. + * @return {@code this} for chaining. + */ + public ClientConfiguration setReqTimeout(int reqTimeout) { + this.reqTimeout = reqTimeout; return this; } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientChannelConfiguration.java b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientChannelConfiguration.java index 97cdc822159de..8acb9e66cc94b 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientChannelConfiguration.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientChannelConfiguration.java @@ -44,8 +44,11 @@ final class ClientChannelConfiguration { /** Tcp no delay. */ private final boolean tcpNoDelay; - /** Timeout. */ - private final int timeout; + /** Connection timeout. */ + private final int connTimeout; + + /** Request timeout. */ + private final int reqTimeout; /** Send buffer size. */ private final int sndBufSize; @@ -123,7 +126,8 @@ final class ClientChannelConfiguration { ClientChannelConfiguration(ClientConfiguration cfg, List addrs) { this.sslMode = cfg.getSslMode(); this.tcpNoDelay = cfg.isTcpNoDelay(); - this.timeout = cfg.getTimeout(); + this.connTimeout = cfg.getConnTimeout(); + this.reqTimeout = cfg.getReqTimeout(); this.sndBufSize = cfg.getSendBufferSize(); this.rcvBufSize = cfg.getReceiveBufferSize(); this.sslClientCertKeyStorePath = cfg.getSslClientCertificateKeyStorePath(); @@ -172,10 +176,26 @@ public boolean isTcpNoDelay() { } /** + * @deprecated Use {@link #getConnTimeout()} and {@link #getReqTimeout()} instead. * @return Timeout. */ + @Deprecated public int getTimeout() { - return timeout; + return Math.max(connTimeout, reqTimeout); + } + + /** + * @return Connection timeout. + */ + public int getConnTimeout() { + return connTimeout; + } + + /** + * @return Request timeout. + */ + public int getReqTimeout() { + return reqTimeout; } /** diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpClientChannel.java b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpClientChannel.java index f8316faf64c2c..80a21b83b6a75 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpClientChannel.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpClientChannel.java @@ -160,8 +160,11 @@ class TcpClientChannel implements ClientChannel, ClientMessageHandler, ClientCon /** Executor for async operation listeners. */ private final Executor asyncContinuationExecutor; - /** Send/receive timeout in milliseconds. */ - private final int timeout; + /** Connection timeout in milliseconds. */ + private final int connTimeout; + + /** Request timeout in milliseconds. */ + private final int reqTimeout; /** Heartbeat timer. */ private final Timer heartbeatTimer; @@ -195,7 +198,8 @@ class TcpClientChannel implements ClientChannel, ClientMessageHandler, ClientCon Executor cfgExec = cfg.getAsyncContinuationExecutor(); asyncContinuationExecutor = cfgExec != null ? cfgExec : ForkJoinPool.commonPool(); - timeout = cfg.getTimeout(); + connTimeout = cfg.getConnTimeout(); + reqTimeout = cfg.getReqTimeout(); List addrs = cfg.getAddresses(); @@ -419,7 +423,7 @@ private T receive(ClientRequestFuture pendingReq, Function 0 ? pendingReq.get(timeout) : pendingReq.get(); + ByteBuffer payload = reqTimeout > 0 ? pendingReq.get(reqTimeout) : pendingReq.get(); T res = null; if (payload != null && payloadReader != null) @@ -736,7 +740,7 @@ private void handshake(ProtocolVersion ver, String user, String pwd, Map 0 ? fut.get(timeout) : fut.get(); + ByteBuffer buf = connTimeout > 0 ? fut.get(connTimeout) : fut.get(); BinaryInputStream res = BinaryStreams.inputStream(buf); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/io/gridnioserver/GridNioClientConnectionMultiplexer.java b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/io/gridnioserver/GridNioClientConnectionMultiplexer.java index d2f6895ac1dcb..7171d5cd59002 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/io/gridnioserver/GridNioClientConnectionMultiplexer.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/io/gridnioserver/GridNioClientConnectionMultiplexer.java @@ -89,7 +89,7 @@ public GridNioClientConnectionMultiplexer(ClientConfiguration cfg) { else filters = new GridNioFilter[] {codecFilter}; - connTimeout = cfg.getTimeout(); + connTimeout = cfg.getConnTimeout(); try { srv = GridNioServer.builder() diff --git a/modules/core/src/test/java/org/apache/ignite/client/ClientConfigurationTest.java b/modules/core/src/test/java/org/apache/ignite/client/ClientConfigurationTest.java index 8f882653b099a..5aaa89692a885 100644 --- a/modules/core/src/test/java/org/apache/ignite/client/ClientConfigurationTest.java +++ b/modules/core/src/test/java/org/apache/ignite/client/ClientConfigurationTest.java @@ -59,7 +59,8 @@ public class ClientConfigurationTest { public void testSerialization() throws IOException, ClassNotFoundException { ClientConfiguration target = new ClientConfiguration() .setAddresses("127.0.0.1:10800", "127.0.0.1:10801") - .setTimeout(123) + .setConnTimeout(123) + .setReqTimeout(123) .setBinaryConfiguration(new BinaryConfiguration() .setClassNames(Collections.singleton("Person")) ) diff --git a/modules/core/src/test/java/org/apache/ignite/client/Comparers.java b/modules/core/src/test/java/org/apache/ignite/client/Comparers.java index 4442196c40d73..39aff7b26bfc5 100644 --- a/modules/core/src/test/java/org/apache/ignite/client/Comparers.java +++ b/modules/core/src/test/java/org/apache/ignite/client/Comparers.java @@ -36,7 +36,8 @@ public static boolean equal(ClientConfiguration a, Object o) { return Arrays.equals(a.getAddresses(), b.getAddresses()) && a.isTcpNoDelay() == b.isTcpNoDelay() && - a.getTimeout() == b.getTimeout() && + a.getConnTimeout() == b.getConnTimeout() && + a.getReqTimeout() == b.getReqTimeout() && a.getSendBufferSize() == b.getSendBufferSize() && a.getReceiveBufferSize() == b.getReceiveBufferSize(); } diff --git a/modules/core/src/test/java/org/apache/ignite/internal/client/thin/ThinClientEnpointsDiscoveryTest.java b/modules/core/src/test/java/org/apache/ignite/internal/client/thin/ThinClientEnpointsDiscoveryTest.java index bcb7627f8ecaf..6c845e6f1b823 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/client/thin/ThinClientEnpointsDiscoveryTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/client/thin/ThinClientEnpointsDiscoveryTest.java @@ -158,7 +158,8 @@ public void testUnreachableAddressDiscoveredDoesNotPreventClientInit() throws Ex // Config has good server address, client discovery returns unreachable address. // We expect the client to connect to the good address and ignore the unreachable one. ClientConfiguration ccfg = new ClientConfiguration() - .setTimeout(2000) + .setConnTimeout(2000) + .setReqTimeout(2000) .setAddresses("127.0.0.1:" + DFLT_PORT); IgniteClient client = Ignition.startClient(ccfg); diff --git a/modules/core/src/test/java/org/apache/ignite/internal/client/thin/TimeoutTest.java b/modules/core/src/test/java/org/apache/ignite/internal/client/thin/TimeoutTest.java index 882a4df96bfc1..c9d4f6011e2d1 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/client/thin/TimeoutTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/client/thin/TimeoutTest.java @@ -67,7 +67,7 @@ public class TimeoutTest extends AbstractThinClientTest { /** {@inheritDoc} */ @Override protected ClientConfiguration getClientConfiguration() { - return super.getClientConfiguration().setTimeout(TIMEOUT); + return super.getClientConfiguration().setConnTimeout(TIMEOUT).setReqTimeout(TIMEOUT); } /** diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/odbc/ClientSessionOutboundQueueLimitTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/odbc/ClientSessionOutboundQueueLimitTest.java index 27bb599c8619a..1c811db210a4c 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/odbc/ClientSessionOutboundQueueLimitTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/odbc/ClientSessionOutboundQueueLimitTest.java @@ -68,7 +68,8 @@ public void testClientSessionOutboundQueueLimit() throws Exception { try ( IgniteClient cli = Ignition.startClient(new ClientConfiguration() .setAddresses("127.0.0.1:10800") - .setTimeout(5000) // Server will drop packets intended for the client. So client can hang on handshake during reconnect. + .setConnTimeout(5000) // Server will drop packets intended for the client. So client can hang on handshake during reconnect. + .setReqTimeout(5000) .setRetryLimit(1) // Let's not retry operations if the channel was closed while waiting for a response. .setEventListeners(new ConnectionEventListener() { @Override public void onConnectionClosed(ConnectionClosedEvent event) { From e4cd7a0bc51c5a92488ede110b2988f277e460b0 Mon Sep 17 00:00:00 2001 From: Daniil Date: Fri, 19 Dec 2025 12:47:27 +0300 Subject: [PATCH 2/5] renaming --- .../ignite/configuration/ClientConfiguration.java | 14 +++++++------- .../client/thin/ClientChannelConfiguration.java | 12 ++++++------ .../internal/client/thin/TcpClientChannel.java | 4 ++-- .../GridNioClientConnectionMultiplexer.java | 2 +- .../ignite/client/ClientConfigurationTest.java | 4 ++-- .../java/org/apache/ignite/client/Comparers.java | 4 ++-- .../thin/ThinClientEnpointsDiscoveryTest.java | 4 ++-- .../ignite/internal/client/thin/TimeoutTest.java | 2 +- .../odbc/ClientSessionOutboundQueueLimitTest.java | 4 ++-- 9 files changed, 25 insertions(+), 25 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/configuration/ClientConfiguration.java b/modules/core/src/main/java/org/apache/ignite/configuration/ClientConfiguration.java index 1ccc7082d51af..5d7d2dcf3fed2 100644 --- a/modules/core/src/main/java/org/apache/ignite/configuration/ClientConfiguration.java +++ b/modules/core/src/main/java/org/apache/ignite/configuration/ClientConfiguration.java @@ -230,16 +230,16 @@ public ClientConfiguration setTcpNoDelay(boolean tcpNoDelay) { } /** - * @deprecated Use {@link #getConnTimeout()} and {@link #getReqTimeout()} instead. + * @deprecated Use {@link #getConnectionTimeout()} and {@link #getRequestTimeout()} instead. * @return Send/receive timeout in milliseconds. */ @Deprecated public int getTimeout() { - return Math.max(connTimeout, reqTimeout); + return reqTimeout; } /** - * @deprecated Use {@link #setConnTimeout(int)} and {@link #setReqTimeout(int)} instead. + * @deprecated Use {@link #setConnectionTimeout(int)} and {@link #setRequestTimeout(int)} instead. * @param timeout Send/receive timeout in milliseconds. * @return {@code this} for chaining. */ @@ -253,7 +253,7 @@ public ClientConfiguration setTimeout(int timeout) { /** * @return Connection timeout in milliseconds. 0 means infinite. */ - public int getConnTimeout() { + public int getConnectionTimeout() { return connTimeout; } @@ -261,7 +261,7 @@ public int getConnTimeout() { * @param connTimeout Connection timeout in milliseconds. 0 means infinite. * @return {@code this} for chaining. */ - public ClientConfiguration setConnTimeout(int connTimeout) { + public ClientConfiguration setConnectionTimeout(int connTimeout) { this.connTimeout = connTimeout; return this; } @@ -269,7 +269,7 @@ public ClientConfiguration setConnTimeout(int connTimeout) { /** * @return Request timeout in milliseconds. 0 means infinite. */ - public int getReqTimeout() { + public int getRequestTimeout() { return reqTimeout; } @@ -277,7 +277,7 @@ public int getReqTimeout() { * @param reqTimeout Request timeout in milliseconds. 0 means infinite. * @return {@code this} for chaining. */ - public ClientConfiguration setReqTimeout(int reqTimeout) { + public ClientConfiguration setRequestTimeout(int reqTimeout) { this.reqTimeout = reqTimeout; return this; } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientChannelConfiguration.java b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientChannelConfiguration.java index 8acb9e66cc94b..f0fc85d92bbc2 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientChannelConfiguration.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientChannelConfiguration.java @@ -126,8 +126,8 @@ final class ClientChannelConfiguration { ClientChannelConfiguration(ClientConfiguration cfg, List addrs) { this.sslMode = cfg.getSslMode(); this.tcpNoDelay = cfg.isTcpNoDelay(); - this.connTimeout = cfg.getConnTimeout(); - this.reqTimeout = cfg.getReqTimeout(); + this.connTimeout = cfg.getConnectionTimeout(); + this.reqTimeout = cfg.getRequestTimeout(); this.sndBufSize = cfg.getSendBufferSize(); this.rcvBufSize = cfg.getReceiveBufferSize(); this.sslClientCertKeyStorePath = cfg.getSslClientCertificateKeyStorePath(); @@ -176,25 +176,25 @@ public boolean isTcpNoDelay() { } /** - * @deprecated Use {@link #getConnTimeout()} and {@link #getReqTimeout()} instead. + * @deprecated Use {@link #getConnectionTimeout()} and {@link #getRequestTimeout()} instead. * @return Timeout. */ @Deprecated public int getTimeout() { - return Math.max(connTimeout, reqTimeout); + return reqTimeout; } /** * @return Connection timeout. */ - public int getConnTimeout() { + public int getConnectionTimeout() { return connTimeout; } /** * @return Request timeout. */ - public int getReqTimeout() { + public int getRequestTimeout() { return reqTimeout; } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpClientChannel.java b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpClientChannel.java index 80a21b83b6a75..378b3cc701c00 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpClientChannel.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpClientChannel.java @@ -198,8 +198,8 @@ class TcpClientChannel implements ClientChannel, ClientMessageHandler, ClientCon Executor cfgExec = cfg.getAsyncContinuationExecutor(); asyncContinuationExecutor = cfgExec != null ? cfgExec : ForkJoinPool.commonPool(); - connTimeout = cfg.getConnTimeout(); - reqTimeout = cfg.getReqTimeout(); + connTimeout = cfg.getConnectionTimeout(); + reqTimeout = cfg.getRequestTimeout(); List addrs = cfg.getAddresses(); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/io/gridnioserver/GridNioClientConnectionMultiplexer.java b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/io/gridnioserver/GridNioClientConnectionMultiplexer.java index 7171d5cd59002..9c2b78a457a5a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/io/gridnioserver/GridNioClientConnectionMultiplexer.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/io/gridnioserver/GridNioClientConnectionMultiplexer.java @@ -89,7 +89,7 @@ public GridNioClientConnectionMultiplexer(ClientConfiguration cfg) { else filters = new GridNioFilter[] {codecFilter}; - connTimeout = cfg.getConnTimeout(); + connTimeout = cfg.getConnectionTimeout(); try { srv = GridNioServer.builder() diff --git a/modules/core/src/test/java/org/apache/ignite/client/ClientConfigurationTest.java b/modules/core/src/test/java/org/apache/ignite/client/ClientConfigurationTest.java index 5aaa89692a885..7893db65006ac 100644 --- a/modules/core/src/test/java/org/apache/ignite/client/ClientConfigurationTest.java +++ b/modules/core/src/test/java/org/apache/ignite/client/ClientConfigurationTest.java @@ -59,8 +59,8 @@ public class ClientConfigurationTest { public void testSerialization() throws IOException, ClassNotFoundException { ClientConfiguration target = new ClientConfiguration() .setAddresses("127.0.0.1:10800", "127.0.0.1:10801") - .setConnTimeout(123) - .setReqTimeout(123) + .setConnectionTimeout(123) + .setRequestTimeout(123) .setBinaryConfiguration(new BinaryConfiguration() .setClassNames(Collections.singleton("Person")) ) diff --git a/modules/core/src/test/java/org/apache/ignite/client/Comparers.java b/modules/core/src/test/java/org/apache/ignite/client/Comparers.java index 39aff7b26bfc5..bebdfeabe731b 100644 --- a/modules/core/src/test/java/org/apache/ignite/client/Comparers.java +++ b/modules/core/src/test/java/org/apache/ignite/client/Comparers.java @@ -36,8 +36,8 @@ public static boolean equal(ClientConfiguration a, Object o) { return Arrays.equals(a.getAddresses(), b.getAddresses()) && a.isTcpNoDelay() == b.isTcpNoDelay() && - a.getConnTimeout() == b.getConnTimeout() && - a.getReqTimeout() == b.getReqTimeout() && + a.getConnectionTimeout() == b.getConnectionTimeout() && + a.getRequestTimeout() == b.getRequestTimeout() && a.getSendBufferSize() == b.getSendBufferSize() && a.getReceiveBufferSize() == b.getReceiveBufferSize(); } diff --git a/modules/core/src/test/java/org/apache/ignite/internal/client/thin/ThinClientEnpointsDiscoveryTest.java b/modules/core/src/test/java/org/apache/ignite/internal/client/thin/ThinClientEnpointsDiscoveryTest.java index 6c845e6f1b823..0bf585bcc0607 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/client/thin/ThinClientEnpointsDiscoveryTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/client/thin/ThinClientEnpointsDiscoveryTest.java @@ -158,8 +158,8 @@ public void testUnreachableAddressDiscoveredDoesNotPreventClientInit() throws Ex // Config has good server address, client discovery returns unreachable address. // We expect the client to connect to the good address and ignore the unreachable one. ClientConfiguration ccfg = new ClientConfiguration() - .setConnTimeout(2000) - .setReqTimeout(2000) + .setConnectionTimeout(2000) + .setRequestTimeout(2000) .setAddresses("127.0.0.1:" + DFLT_PORT); IgniteClient client = Ignition.startClient(ccfg); diff --git a/modules/core/src/test/java/org/apache/ignite/internal/client/thin/TimeoutTest.java b/modules/core/src/test/java/org/apache/ignite/internal/client/thin/TimeoutTest.java index c9d4f6011e2d1..c9182b6bf7cda 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/client/thin/TimeoutTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/client/thin/TimeoutTest.java @@ -67,7 +67,7 @@ public class TimeoutTest extends AbstractThinClientTest { /** {@inheritDoc} */ @Override protected ClientConfiguration getClientConfiguration() { - return super.getClientConfiguration().setConnTimeout(TIMEOUT).setReqTimeout(TIMEOUT); + return super.getClientConfiguration().setConnectionTimeout(TIMEOUT).setRequestTimeout(TIMEOUT); } /** diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/odbc/ClientSessionOutboundQueueLimitTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/odbc/ClientSessionOutboundQueueLimitTest.java index 1c811db210a4c..390d3f8d0e905 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/odbc/ClientSessionOutboundQueueLimitTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/odbc/ClientSessionOutboundQueueLimitTest.java @@ -68,8 +68,8 @@ public void testClientSessionOutboundQueueLimit() throws Exception { try ( IgniteClient cli = Ignition.startClient(new ClientConfiguration() .setAddresses("127.0.0.1:10800") - .setConnTimeout(5000) // Server will drop packets intended for the client. So client can hang on handshake during reconnect. - .setReqTimeout(5000) + .setConnectionTimeout(5000) // Server will drop packets intended for the client. So client can hang on handshake during reconnect. + .setRequestTimeout(5000) .setRetryLimit(1) // Let's not retry operations if the channel was closed while waiting for a response. .setEventListeners(new ConnectionEventListener() { @Override public void onConnectionClosed(ConnectionClosedEvent event) { From 12dfe5ddaf4ad143220d7bd0a82dbba2961484fc Mon Sep 17 00:00:00 2001 From: Daniil Date: Mon, 22 Dec 2025 05:06:41 +0300 Subject: [PATCH 3/5] add conn and req timeout tests --- .../internal/client/thin/TimeoutTest.java | 116 ++++++++++++++++++ .../ClientSessionOutboundQueueLimitTest.java | 3 +- 2 files changed, 118 insertions(+), 1 deletion(-) diff --git a/modules/core/src/test/java/org/apache/ignite/internal/client/thin/TimeoutTest.java b/modules/core/src/test/java/org/apache/ignite/internal/client/thin/TimeoutTest.java index c9182b6bf7cda..864bfba6a5458 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/client/thin/TimeoutTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/client/thin/TimeoutTest.java @@ -217,4 +217,120 @@ public void testClientTimeoutOnOperation() throws Exception { } } } + + /** + * Test that connection timeout is independent of request timeout during connection establishment. + */ + @Test + @SuppressWarnings("ThrowableNotThrown") + public void testConnectionTimeoutIndependentOfRequest() throws Exception { + ServerSocket sock = new ServerSocket(); + sock.bind(new InetSocketAddress("127.0.0.1", DFLT_PORT)); + + CountDownLatch connectionAccepted = new CountDownLatch(1); + + IgniteInternalFuture fut = GridTestUtils.runAsync(() -> { + try { + Socket accepted = sock.accept(); + connectionAccepted.countDown(); + + Thread.sleep(2000); + + U.closeQuiet(accepted); + } + catch (Exception e) { + throw new IgniteException("Accept thread failed: " + e.getMessage(), e); + } + }); + + long startTime = System.currentTimeMillis(); + + try { + ClientConfiguration cfg = new ClientConfiguration() + .setAddresses("127.0.0.1:" + DFLT_PORT) + .setConnectionTimeout(500) + .setRequestTimeout(10000); + + GridTestUtils.assertThrowsWithCause( + () -> Ignition.startClient(cfg), + ClientConnectionException.class + ); + } + finally { + U.closeQuiet(sock); + } + + long elapsed = System.currentTimeMillis() - startTime; + + assertTrue("Should fail around connection timeout (500ms), not request timeout", + elapsed >= 450 && elapsed < 2000); + + assertTrue("Connection should have been accepted", connectionAccepted.await(1, TimeUnit.SECONDS)); + + fut.get(); + } + + /** + * Test that request timeout is independent of connection timeout during operations. + */ + @Test + @SuppressWarnings("ThrowableNotThrown") + public void testRequestTimeoutIndependentOfConnection() throws Exception { + try (Ignite ignite = startGrid(0)) { + ClientConfiguration cfg = getClientConfiguration() + .setAddresses("127.0.0.1:" + DFLT_PORT) + .setConnectionTimeout(10000) + .setRequestTimeout(500); + + try (IgniteClient client = Ignition.startClient(cfg)) { + ClientCache cache = client.getOrCreateCache("testTimeoutCache"); + + ClientCacheConfiguration txCacheCfg = new ClientCacheConfiguration() + .setName("txCache") + .setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL); + + ClientCache txCache = client.getOrCreateCache(txCacheCfg); + + CyclicBarrier barrier = new CyclicBarrier(2); + + IgniteInternalFuture blockingThread = GridTestUtils.runAsync(() -> { + try (ClientTransaction tx = client.transactions().txStart(PESSIMISTIC, REPEATABLE_READ)) { + txCache.put(1, "blocked"); + + barrier.await(2, TimeUnit.SECONDS); + + Thread.sleep(2000); + + barrier.await(2, TimeUnit.SECONDS); + } + catch (Exception e) { + throw new IgniteException(e); + } + }); + + barrier.await(2, TimeUnit.SECONDS); + + long startTime = System.currentTimeMillis(); + + try (ClientTransaction tx = client.transactions().txStart(PESSIMISTIC, REPEATABLE_READ)) { + GridTestUtils.assertThrowsWithCause( + () -> txCache.put(1, "should timeout"), + ClientException.class + ); + } + + long elapsed = System.currentTimeMillis() - startTime; + + assertTrue("Should fail around request timeout (500ms), not connection timeout", + elapsed >= 450 && elapsed < 2000); + + barrier.await(2, TimeUnit.SECONDS); + + cache.put(2, "still works"); + assertEquals("still works", cache.get(2)); + + blockingThread.get(); + } + } + } } diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/odbc/ClientSessionOutboundQueueLimitTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/odbc/ClientSessionOutboundQueueLimitTest.java index 390d3f8d0e905..6c53a23cd2a4b 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/odbc/ClientSessionOutboundQueueLimitTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/odbc/ClientSessionOutboundQueueLimitTest.java @@ -68,7 +68,8 @@ public void testClientSessionOutboundQueueLimit() throws Exception { try ( IgniteClient cli = Ignition.startClient(new ClientConfiguration() .setAddresses("127.0.0.1:10800") - .setConnectionTimeout(5000) // Server will drop packets intended for the client. So client can hang on handshake during reconnect. + .setConnectionTimeout(5000) // Server will drop packets intended for the client. + // So client can hang on handshake during reconnect. .setRequestTimeout(5000) .setRetryLimit(1) // Let's not retry operations if the channel was closed while waiting for a response. .setEventListeners(new ConnectionEventListener() { From 5ce6f487854e0af5cda92cf08a5d7141be13379a Mon Sep 17 00:00:00 2001 From: Daniil Date: Mon, 29 Dec 2025 12:37:15 +0300 Subject: [PATCH 4/5] fix unstable timeout tests --- .../configuration/ClientConfiguration.java | 10 +++++- .../thin/ClientChannelConfiguration.java | 2 +- .../internal/client/thin/TimeoutTest.java | 35 +++++++------------ 3 files changed, 22 insertions(+), 25 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/configuration/ClientConfiguration.java b/modules/core/src/main/java/org/apache/ignite/configuration/ClientConfiguration.java index 5d7d2dcf3fed2..7776b5b78f5e1 100644 --- a/modules/core/src/main/java/org/apache/ignite/configuration/ClientConfiguration.java +++ b/modules/core/src/main/java/org/apache/ignite/configuration/ClientConfiguration.java @@ -39,6 +39,7 @@ import org.apache.ignite.client.SslProtocol; import org.apache.ignite.internal.client.thin.TcpIgniteClient; import org.apache.ignite.internal.util.typedef.internal.S; +import org.apache.ignite.internal.util.typedef.internal.U; /** * {@link TcpIgniteClient} configuration. @@ -231,10 +232,17 @@ public ClientConfiguration setTcpNoDelay(boolean tcpNoDelay) { /** * @deprecated Use {@link #getConnectionTimeout()} and {@link #getRequestTimeout()} instead. - * @return Send/receive timeout in milliseconds. + * @return Request timeout in milliseconds. */ @Deprecated public int getTimeout() { + if (reqTimeout != connTimeout ) + U.warn(logger, String.format( + "Deprecated getTimeout() API is used while request timeout (%d) differs from connection timeout (%d). " + + "Returning request timeout. Please use getRequestTimeout() and getConnectionTimeout() instead.", + reqTimeout, connTimeout + )); + return reqTimeout; } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientChannelConfiguration.java b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientChannelConfiguration.java index f0fc85d92bbc2..fc77070ed59da 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientChannelConfiguration.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientChannelConfiguration.java @@ -177,7 +177,7 @@ public boolean isTcpNoDelay() { /** * @deprecated Use {@link #getConnectionTimeout()} and {@link #getRequestTimeout()} instead. - * @return Timeout. + * @return Request timeout. */ @Deprecated public int getTimeout() { diff --git a/modules/core/src/test/java/org/apache/ignite/internal/client/thin/TimeoutTest.java b/modules/core/src/test/java/org/apache/ignite/internal/client/thin/TimeoutTest.java index 864bfba6a5458..a947786073c20 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/client/thin/TimeoutTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/client/thin/TimeoutTest.java @@ -39,6 +39,7 @@ import org.apache.ignite.configuration.ClientConfiguration; import org.apache.ignite.configuration.ClientConnectorConfiguration; import org.apache.ignite.configuration.IgniteConfiguration; +import org.apache.ignite.internal.IgniteFutureTimeoutCheckedException; import org.apache.ignite.internal.IgniteInternalFuture; import org.apache.ignite.internal.binary.streams.BinaryOutputStream; import org.apache.ignite.internal.binary.streams.BinaryStreams; @@ -243,28 +244,21 @@ public void testConnectionTimeoutIndependentOfRequest() throws Exception { } }); - long startTime = System.currentTimeMillis(); - try { ClientConfiguration cfg = new ClientConfiguration() .setAddresses("127.0.0.1:" + DFLT_PORT) .setConnectionTimeout(500) - .setRequestTimeout(10000); + .setRequestTimeout(Integer.MAX_VALUE); GridTestUtils.assertThrowsWithCause( () -> Ignition.startClient(cfg), - ClientConnectionException.class + IgniteFutureTimeoutCheckedException.class ); } finally { U.closeQuiet(sock); } - long elapsed = System.currentTimeMillis() - startTime; - - assertTrue("Should fail around connection timeout (500ms), not request timeout", - elapsed >= 450 && elapsed < 2000); - assertTrue("Connection should have been accepted", connectionAccepted.await(1, TimeUnit.SECONDS)); fut.get(); @@ -276,10 +270,12 @@ public void testConnectionTimeoutIndependentOfRequest() throws Exception { @Test @SuppressWarnings("ThrowableNotThrown") public void testRequestTimeoutIndependentOfConnection() throws Exception { - try (Ignite ignite = startGrid(0)) { - ClientConfiguration cfg = getClientConfiguration() - .setAddresses("127.0.0.1:" + DFLT_PORT) - .setConnectionTimeout(10000) + IgniteConfiguration igniteCfg = getConfiguration(getTestIgniteInstanceName()); + igniteCfg.setClientConnectorConfiguration(new ClientConnectorConfiguration().setHandshakeTimeout(Integer.MAX_VALUE)); + + try (Ignite ignite = startGrid(igniteCfg)) { + ClientConfiguration cfg = getClientConfiguration(ignite) + .setConnectionTimeout(Integer.MAX_VALUE) .setRequestTimeout(500); try (IgniteClient client = Ignition.startClient(cfg)) { @@ -294,7 +290,7 @@ public void testRequestTimeoutIndependentOfConnection() throws Exception { CyclicBarrier barrier = new CyclicBarrier(2); IgniteInternalFuture blockingThread = GridTestUtils.runAsync(() -> { - try (ClientTransaction tx = client.transactions().txStart(PESSIMISTIC, REPEATABLE_READ)) { + try (ClientTransaction ignored1 = client.transactions().txStart(PESSIMISTIC, REPEATABLE_READ)) { txCache.put(1, "blocked"); barrier.await(2, TimeUnit.SECONDS); @@ -310,20 +306,13 @@ public void testRequestTimeoutIndependentOfConnection() throws Exception { barrier.await(2, TimeUnit.SECONDS); - long startTime = System.currentTimeMillis(); - - try (ClientTransaction tx = client.transactions().txStart(PESSIMISTIC, REPEATABLE_READ)) { + try (ClientTransaction ignored1 = client.transactions().txStart(PESSIMISTIC, REPEATABLE_READ)) { GridTestUtils.assertThrowsWithCause( () -> txCache.put(1, "should timeout"), - ClientException.class + IgniteFutureTimeoutCheckedException.class ); } - long elapsed = System.currentTimeMillis() - startTime; - - assertTrue("Should fail around request timeout (500ms), not connection timeout", - elapsed >= 450 && elapsed < 2000); - barrier.await(2, TimeUnit.SECONDS); cache.put(2, "still works"); From 87e229e2e548b09caf29bb85f306e0ef9a8ffcad Mon Sep 17 00:00:00 2001 From: Daniil Date: Tue, 30 Dec 2025 10:51:25 +0300 Subject: [PATCH 5/5] remove redundant Thread.sleep --- .../org/apache/ignite/internal/client/thin/TimeoutTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/core/src/test/java/org/apache/ignite/internal/client/thin/TimeoutTest.java b/modules/core/src/test/java/org/apache/ignite/internal/client/thin/TimeoutTest.java index a947786073c20..23bb017456879 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/client/thin/TimeoutTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/client/thin/TimeoutTest.java @@ -295,8 +295,7 @@ public void testRequestTimeoutIndependentOfConnection() throws Exception { barrier.await(2, TimeUnit.SECONDS); - Thread.sleep(2000); - + // Wait for main thread to time out barrier.await(2, TimeUnit.SECONDS); } catch (Exception e) {