Skip to content

Commit d4ad2cc

Browse files
committed
connection request test
1 parent 2d8bf58 commit d4ad2cc

File tree

2 files changed

+51
-0
lines changed

2 files changed

+51
-0
lines changed

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,10 @@
4343
import com.clickhouse.data.ClickHouseColumn;
4444
import com.clickhouse.data.ClickHouseFormat;
4545
import com.clickhouse.data.format.BinaryStreamUtils;
46+
import org.apache.hc.client5.http.ConnectTimeoutException;
4647
import org.apache.hc.core5.concurrent.DefaultThreadFactory;
4748
import org.apache.hc.core5.http.ClassicHttpResponse;
49+
import org.apache.hc.core5.http.ConnectionRequestTimeoutException;
4850
import org.apache.hc.core5.http.HttpStatus;
4951
import org.apache.hc.core5.http.NoHttpResponseException;
5052
import org.slf4j.Logger;
@@ -1307,6 +1309,8 @@ public CompletableFuture<QueryResponse> query(String sqlQuery, Map<String, Objec
13071309
return new QueryResponse(httpResponse, finalSettings.getFormat(), finalSettings, metrics);
13081310
} catch (ClientException e) {
13091311
throw e;
1312+
} catch (ConnectionRequestTimeoutException | ConnectTimeoutException e) {
1313+
throw new ConnectionInitiationException("Failed to get connection", e);
13101314
} catch (Exception e) {
13111315
throw new ClientException("Failed to execute query", e);
13121316
}

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

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
11
package com.clickhouse.client;
22

33
import com.clickhouse.client.api.Client;
4+
import com.clickhouse.client.api.ConnectionInitiationException;
45
import com.clickhouse.client.api.enums.ProxyType;
56
import com.clickhouse.client.api.query.GenericRecord;
7+
import com.clickhouse.client.api.query.QueryResponse;
8+
import com.clickhouse.client.config.ClickHouseClientOption;
69
import com.github.tomakehurst.wiremock.WireMockServer;
710
import com.github.tomakehurst.wiremock.client.WireMock;
811
import com.github.tomakehurst.wiremock.common.Slf4jNotifier;
912
import com.github.tomakehurst.wiremock.core.WireMockConfiguration;
1013
import com.github.tomakehurst.wiremock.http.trafficlistener.WiremockNetworkTrafficListener;
14+
import org.apache.hc.core5.http.ConnectionRequestTimeoutException;
15+
import org.apache.hc.core5.http.HttpStatus;
1116
import org.apache.hc.core5.net.URIBuilder;
1217
import org.testng.Assert;
1318
import org.testng.annotations.DataProvider;
@@ -18,6 +23,8 @@
1823
import java.time.temporal.ChronoUnit;
1924
import java.util.List;
2025
import java.util.Random;
26+
import java.util.concurrent.CompletableFuture;
27+
import java.util.concurrent.ExecutionException;
2128
import java.util.concurrent.atomic.AtomicInteger;
2229

2330
public class ConnectionManagementTests extends BaseIntegrationTest{
@@ -116,4 +123,44 @@ public void closed(Socket socket) {
116123
}
117124
}
118125

126+
@Test(groups = {"integration"})
127+
public void testConnectionRequestTimeout() {
128+
129+
int serverPort = new Random().nextInt(1000) + 10000;
130+
System.out.println("proxyPort: " + serverPort);
131+
ConnectionCounterListener connectionCounter = new ConnectionCounterListener();
132+
WireMockServer proxy = new WireMockServer(WireMockConfiguration
133+
.options().port(serverPort)
134+
.networkTrafficListener(connectionCounter)
135+
.notifier(new Slf4jNotifier(true)));
136+
proxy.start();
137+
proxy.addStubMapping(WireMock.post(WireMock.anyUrl())
138+
.willReturn(WireMock.aResponse().withFixedDelay(5000)
139+
.withStatus(HttpStatus.SC_NOT_FOUND)).build());
140+
141+
Client.Builder clientBuilder = new Client.Builder()
142+
.addEndpoint("http://localhost:" + serverPort)
143+
.setUsername("default")
144+
.setPassword(getPassword())
145+
.useNewImplementation(true)
146+
.setMaxConnections(1)
147+
.setOption(ClickHouseClientOption.ASYNC.getKey(), "true")
148+
.setSocketTimeout(10000, ChronoUnit.MILLIS)
149+
.setConnectionRequestTimeout(5, ChronoUnit.MILLIS);
150+
151+
try (Client client = clientBuilder.build()) {
152+
CompletableFuture<QueryResponse> f1 = client.query("select 1");
153+
CompletableFuture<QueryResponse> f2 = client.query("select 1");
154+
f2.get();
155+
} catch (ExecutionException e) {
156+
e.printStackTrace();
157+
Assert.assertTrue(e.getCause() instanceof ConnectionInitiationException);
158+
Assert.assertTrue(e.getCause().getCause() instanceof ConnectionRequestTimeoutException);
159+
} catch (Exception e) {
160+
e.printStackTrace();
161+
Assert.fail("Unexpected exception", e);
162+
} finally {
163+
proxy.stop();
164+
}
165+
}
119166
}

0 commit comments

Comments
 (0)