Skip to content

Commit 20acfc3

Browse files
committed
remove init ssl if no ssl endpoints
1 parent 318e7e1 commit 20acfc3

File tree

4 files changed

+49
-26
lines changed

4 files changed

+49
-26
lines changed

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,8 @@ private Client(Set<String> endpoints, Map<String,String> configuration, boolean
172172
}
173173
this.useNewImplementation = useNewImplementation;
174174
if (useNewImplementation) {
175-
this.httpClientHelper = new HttpAPIClientHelper(configuration);
175+
boolean initSslContext = getEndpoints().stream().anyMatch(s -> s.toLowerCase().contains("https://"));
176+
this.httpClientHelper = new HttpAPIClientHelper(configuration, initSslContext);
176177
LOG.info("Using new http client implementation");
177178
} else {
178179
this.oldClient = ClientV1AdaptorHelper.createClient(configuration);
@@ -183,9 +184,9 @@ private Client(Set<String> endpoints, Map<String,String> configuration, boolean
183184

184185
/**
185186
* Loads essential information about a server. Should be called after client creation.
186-
*
187+
*
187188
*/
188-
public void updateServerContext() {
189+
public void loadServerInfo() {
189190
try (QueryResponse response = this.query("SELECT currentUser() AS user, timezone() AS timezone, version() AS version LIMIT 1").get()) {
190191
try (ClickHouseBinaryFormatReader reader = this.newBinaryFormatReader(response)) {
191192
if (reader.next() != null) {

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

Lines changed: 38 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
import com.clickhouse.client.ClickHouseNode;
44
import com.clickhouse.client.ClickHouseSslContextProvider;
55
import com.clickhouse.client.api.Client;
6+
import com.clickhouse.client.api.ClientConfigProperties;
67
import com.clickhouse.client.api.ClientException;
78
import com.clickhouse.client.api.ClientFaultCause;
89
import com.clickhouse.client.api.ClientMisconfigurationException;
9-
import com.clickhouse.client.api.ClientConfigProperties;
1010
import com.clickhouse.client.api.ConnectionInitiationException;
1111
import com.clickhouse.client.api.ConnectionReuseStrategy;
1212
import com.clickhouse.client.api.ServerException;
@@ -25,6 +25,7 @@
2525
import org.apache.hc.client5.http.io.HttpClientConnectionManager;
2626
import org.apache.hc.client5.http.protocol.HttpClientContext;
2727
import org.apache.hc.client5.http.socket.ConnectionSocketFactory;
28+
import org.apache.hc.client5.http.socket.LayeredConnectionSocketFactory;
2829
import org.apache.hc.client5.http.socket.PlainConnectionSocketFactory;
2930
import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory;
3031
import org.apache.hc.core5.http.ClassicHttpResponse;
@@ -43,6 +44,7 @@
4344
import org.apache.hc.core5.http.impl.io.DefaultHttpResponseParserFactory;
4445
import org.apache.hc.core5.http.io.SocketConfig;
4546
import org.apache.hc.core5.http.io.entity.EntityTemplate;
47+
import org.apache.hc.core5.http.protocol.HttpContext;
4648
import org.apache.hc.core5.io.CloseMode;
4749
import org.apache.hc.core5.io.IOCallback;
4850
import org.apache.hc.core5.net.URIBuilder;
@@ -60,6 +62,7 @@
6062
import java.net.ConnectException;
6163
import java.net.InetSocketAddress;
6264
import java.net.NoRouteToHostException;
65+
import java.net.Socket;
6366
import java.net.SocketTimeoutException;
6467
import java.net.URI;
6568
import java.net.URISyntaxException;
@@ -93,9 +96,9 @@ public class HttpAPIClientHelper {
9396

9497
private String defaultUserAgent;
9598

96-
public HttpAPIClientHelper(Map<String, String> configuration) {
99+
public HttpAPIClientHelper(Map<String, String> configuration, boolean initSslContext) {
97100
this.chConfiguration = configuration;
98-
this.httpClient = createHttpClient();
101+
this.httpClient = createHttpClient(initSslContext);
99102

100103
RequestConfig.Builder reqConfBuilder = RequestConfig.custom();
101104
MapUtils.applyLong(chConfiguration, "connection_request_timeout",
@@ -170,11 +173,10 @@ private ConnectionConfig createConnectionConfig() {
170173
return connConfig.build();
171174
}
172175

173-
private HttpClientConnectionManager basicConnectionManager(SSLContext sslContext, SocketConfig socketConfig) {
176+
private HttpClientConnectionManager basicConnectionManager(LayeredConnectionSocketFactory sslConnectionSocketFactory, SocketConfig socketConfig) {
174177
RegistryBuilder<ConnectionSocketFactory> registryBuilder = RegistryBuilder.create();
175178
registryBuilder.register("http", PlainConnectionSocketFactory.getSocketFactory());
176-
registryBuilder.register("https", new SSLConnectionSocketFactory(sslContext));
177-
179+
registryBuilder.register("https", sslConnectionSocketFactory);
178180

179181
BasicHttpClientConnectionManager connManager = new BasicHttpClientConnectionManager(registryBuilder.build());
180182
connManager.setConnectionConfig(createConnectionConfig());
@@ -183,7 +185,7 @@ private HttpClientConnectionManager basicConnectionManager(SSLContext sslContext
183185
return connManager;
184186
}
185187

186-
private HttpClientConnectionManager poolConnectionManager(SSLContext sslContext, SocketConfig socketConfig) {
188+
private HttpClientConnectionManager poolConnectionManager(LayeredConnectionSocketFactory sslConnectionSocketFactory, SocketConfig socketConfig) {
187189
PoolingHttpClientConnectionManagerBuilder connMgrBuilder = PoolingHttpClientConnectionManagerBuilder.create()
188190
.setPoolConcurrencyPolicy(PoolConcurrencyPolicy.LAX);
189191

@@ -217,17 +219,17 @@ private HttpClientConnectionManager poolConnectionManager(SSLContext sslContext,
217219
DefaultHttpResponseParserFactory.INSTANCE);
218220

219221
connMgrBuilder.setConnectionFactory(connectionFactory);
220-
connMgrBuilder.setSSLSocketFactory(new SSLConnectionSocketFactory(sslContext));
222+
connMgrBuilder.setSSLSocketFactory(sslConnectionSocketFactory);
221223
connMgrBuilder.setDefaultSocketConfig(socketConfig);
222224
return connMgrBuilder.build();
223225
}
224226

225-
public CloseableHttpClient createHttpClient() {
226-
227+
public CloseableHttpClient createHttpClient(boolean initSslContext) {
227228
// Top Level builders
228229
HttpClientBuilder clientBuilder = HttpClientBuilder.create();
229-
SSLContext sslContext = createSSLContext();
230-
230+
SSLContext sslContext = initSslContext ? createSSLContext() : null;
231+
LayeredConnectionSocketFactory sslConnectionSocketFactory = sslContext == null ? new DummySSLConnectionSocketFactory()
232+
: new SSLConnectionSocketFactory(sslContext);
231233
// Socket configuration
232234
SocketConfig.Builder soCfgBuilder = SocketConfig.custom();
233235
MapUtils.applyInt(chConfiguration, ClientConfigProperties.SOCKET_OPERATION_TIMEOUT.getKey(),
@@ -271,9 +273,9 @@ public CloseableHttpClient createHttpClient() {
271273
// Connection manager
272274
boolean isConnectionPooling = MapUtils.getFlag(chConfiguration, "connection_pool_enabled");
273275
if (isConnectionPooling) {
274-
clientBuilder.setConnectionManager(poolConnectionManager(sslContext, socketConfig));
276+
clientBuilder.setConnectionManager(poolConnectionManager(sslConnectionSocketFactory, socketConfig));
275277
} else {
276-
clientBuilder.setConnectionManager(basicConnectionManager(sslContext, socketConfig));
278+
clientBuilder.setConnectionManager(basicConnectionManager(sslConnectionSocketFactory, socketConfig));
277279
}
278280
long keepAliveTimeout = MapUtils.getLong(chConfiguration, ClientConfigProperties.HTTP_KEEP_ALIVE_TIMEOUT.getKey());
279281
if (keepAliveTimeout > 0) {
@@ -713,4 +715,26 @@ private String buildDefaultUserAgent() {
713715
public void close() {
714716
httpClient.close(CloseMode.IMMEDIATE);
715717
}
718+
719+
720+
/**
721+
* This factory is used only when no ssl connections are required (no https endpoints).
722+
* Internally http client would create factory and spend time if no supplied.
723+
*/
724+
private static class DummySSLConnectionSocketFactory implements LayeredConnectionSocketFactory {
725+
@Override
726+
public Socket createLayeredSocket(Socket socket, String target, int port, HttpContext context) throws IOException {
727+
return null;
728+
}
729+
730+
@Override
731+
public Socket createSocket(HttpContext context) throws IOException {
732+
return null;
733+
}
734+
735+
@Override
736+
public Socket connectSocket(TimeValue connectTimeout, Socket socket, HttpHost host, InetSocketAddress remoteAddress, InetSocketAddress localAddress, HttpContext context) throws IOException {
737+
return null;
738+
}
739+
}
716740
}

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.clickhouse.client;
22

33
import com.clickhouse.client.api.Client;
4-
import com.clickhouse.client.api.ClientConfigProperties;
54
import com.clickhouse.client.api.ClientException;
65
import com.clickhouse.client.api.enums.Protocol;
76
import com.clickhouse.client.api.query.GenericRecord;
@@ -16,7 +15,6 @@
1615

1716
import java.net.ConnectException;
1817
import java.util.HashMap;
19-
import java.util.List;
2018
import java.util.Map;
2119
import java.util.Optional;
2220
import java.util.concurrent.TimeUnit;
@@ -131,10 +129,14 @@ public void testSetOptions() {
131129
}
132130

133131
@Test
134-
public void testSkipServerLoadInfo() throws Exception {
132+
public void testLoadingServerContext() throws Exception {
133+
134+
long start = System.nanoTime();
135135
try (Client client = newClient().build()) {
136+
long initTime = System.nanoTime() - start;
137+
System.out.println("init time " + (initTime / 1_000_000));
136138
Assert.assertNull(client.getServerVersion());
137-
client.updateServerContext();
139+
client.loadServerInfo();
138140
Assert.assertNotNull(client.getServerVersion());
139141
}
140142
}

jdbc-v2/src/main/java/com/clickhouse/jdbc/ConnectionImpl.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
11
package com.clickhouse.jdbc;
22

33
import com.clickhouse.client.api.Client;
4-
import com.clickhouse.client.api.ClientConfigProperties;
54
import com.clickhouse.client.api.internal.ServerSettings;
65
import com.clickhouse.client.api.query.GenericRecord;
76
import com.clickhouse.client.api.query.QuerySettings;
87
import com.clickhouse.data.ClickHouseDataType;
98
import com.clickhouse.jdbc.internal.ClientInfoProperties;
109
import com.clickhouse.jdbc.internal.JdbcConfiguration;
1110
import com.clickhouse.jdbc.internal.ExceptionUtils;
12-
import com.clickhouse.jdbc.internal.JdbcConfiguration;
1311
import com.clickhouse.jdbc.internal.JdbcUtils;
1412
import org.slf4j.Logger;
1513
import org.slf4j.LoggerFactory;
@@ -32,8 +30,6 @@
3230
import java.sql.ShardingKey;
3331
import java.sql.Statement;
3432
import java.sql.Struct;
35-
import java.sql.Types;
36-
import java.time.temporal.ChronoUnit;
3733
import java.util.HashSet;
3834
import java.util.List;
3935
import java.util.Map;
@@ -76,7 +72,7 @@ public ConnectionImpl(String url, Properties info) throws SQLException {
7672
this.client = this.config.applyClientProperties(new Client.Builder())
7773
.setClientName(clientName)
7874
.build();
79-
this.client.updateServerContext();
75+
this.client.loadServerInfo();
8076
this.schema = client.getDefaultDatabase();
8177
this.defaultQuerySettings = new QuerySettings()
8278
.serverSetting(ServerSettings.ASYNC_INSERT, "0")

0 commit comments

Comments
 (0)