Skip to content

Commit 0d86ac6

Browse files
authored
Merge pull request #2889 from ClickHouse/06/23/26/transport_exception
Added TransportException and tests for it
2 parents 0a2c154 + f7db286 commit 0d86ac6

4 files changed

Lines changed: 46 additions & 1 deletion

File tree

client-v2/src/main/java/com/clickhouse/client/api/ClientException.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,8 @@ public ClientException(String message) {
99
public ClientException(String message, Throwable cause) {
1010
super(message, cause);
1111
}
12+
13+
public ClientException(String message, Throwable cause, String queryId) {
14+
super(message, cause, queryId);
15+
}
1216
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.clickhouse.client.api;
2+
3+
/**
4+
* Transport-layer exception that is hard to categorize as connection initiation or data transfer.
5+
* These exceptions are not retryable by default.
6+
* Main purpose of this exception is to wrap transport-specific failures (e.g., SSL errors).
7+
*/
8+
public class TransportException extends ClickHouseException {
9+
public TransportException(String message, Throwable cause, String queryId) {
10+
super(message, cause, queryId);
11+
this.isRetryable = false;
12+
}
13+
}

client-v2/src/main/java/com/clickhouse/client/api/internal/HttpAPIClientHelper.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.clickhouse.client.api.ConnectionReuseStrategy;
1111
import com.clickhouse.client.api.DataTransferException;
1212
import com.clickhouse.client.api.ServerException;
13+
import com.clickhouse.client.api.TransportException;
1314
import com.clickhouse.client.api.enums.ProxyType;
1415
import com.clickhouse.client.api.enums.SSLMode;
1516
import com.clickhouse.client.api.http.ClickHouseHttpProto;
@@ -897,7 +898,7 @@ public RuntimeException wrapException(String message, Exception cause, String qu
897898
}
898899

899900
if (cause instanceof SSLException) {
900-
return new ClickHouseException("SSL Problem", cause, queryId);
901+
return new TransportException("SSL Problem", cause, queryId);
901902
}
902903

903904
if (cause instanceof ConnectionRequestTimeoutException ||

client-v2/src/test/java/com/clickhouse/client/ErrorHandlingTests.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@
33
import com.clickhouse.client.api.Client;
44
import com.clickhouse.client.api.DataTransferException;
55
import com.clickhouse.client.api.ServerException;
6+
import com.clickhouse.client.api.TransportException;
67
import com.clickhouse.client.api.enums.Protocol;
78
import com.clickhouse.client.api.query.QuerySettings;
89
import org.testng.Assert;
10+
import org.testng.SkipException;
911
import org.testng.annotations.Test;
1012

1113
import java.time.temporal.ChronoUnit;
@@ -74,6 +76,31 @@ void testQueryTimeout() throws Exception {
7476
}
7577
}
7678

79+
@Test(groups = {"integration"})
80+
void testTransportException() throws Exception {
81+
if (isCloud()) {
82+
throw new SkipException("SSL Configuration tests - no need to test on cloud");
83+
}
84+
85+
ClickHouseNode secureServer = getSecureServer(ClickHouseProtocol.HTTP);
86+
87+
try (Client client = new Client.Builder()
88+
.addEndpoint("https://localhost:" + secureServer.getPort())
89+
.setUsername("default")
90+
.setPassword(ClickHouseServerForTest.getPassword())
91+
.compressClientRequest(true)
92+
.build()) {
93+
94+
final String queryId = "test-failure-query-id";
95+
TransportException tex = Assert.expectThrows(TransportException.class,
96+
() -> client.query("SELECT 1", new QuerySettings().setQueryId(queryId)).get());
97+
Assert.assertTrue(tex.getMessage().startsWith("SSL Problem"), "Unexpected message: " + tex.getMessage());
98+
Assert.assertEquals(tex.getQueryId(), queryId);
99+
Assert.assertTrue(tex.getCause() instanceof javax.net.ssl.SSLException,
100+
"Expected SSLException cause but was: " + tex.getCause());
101+
}
102+
}
103+
77104
protected Client.Builder newClient() {
78105
ClickHouseNode node = getServer(ClickHouseProtocol.HTTP);
79106
boolean isSecure = isCloud();

0 commit comments

Comments
 (0)