From 6425c9b00f2eb322d57b198c0347e76b3ef00824 Mon Sep 17 00:00:00 2001 From: mzitnik Date: Sat, 14 Jun 2025 20:50:05 +0200 Subject: [PATCH 01/10] polish excpetion api + build in code list that is retryable --- .../com/clickhouse/client/api/Client.java | 2 + .../api/ClientMisconfigurationException.java | 2 + .../client/api/command/CommandResponse.java | 2 +- .../api/data_formats/NativeFormatReader.java | 2 +- ...owBinaryWithNamesAndTypesFormatReader.java | 2 +- .../internal/AbstractBinaryFormatReader.java | 2 +- .../internal/BinaryStreamReader.java | 4 +- .../internal/MapBackedRecord.java | 4 +- .../internal/SerializerUtils.java | 2 +- .../api/{ => exception}/ClientException.java | 24 ++--- .../ConnectionInitiationException.java | 24 ++--- .../api/{ => exception}/ServerException.java | 87 ++++++++++--------- .../client/api/exception/Utils.java | 34 ++++++++ .../internal/ClickHouseLZ4InputStream.java | 2 +- .../api/internal/HttpAPIClientHelper.java | 6 +- .../api/metadata/NoSuchColumnException.java | 2 +- .../client/api/query/NullValueException.java | 2 +- .../client/api/query/QueryResponse.java | 2 +- .../api/serde/DataSerializationException.java | 2 +- .../serde/SerializerNotFoundException.java | 2 +- .../com/clickhouse/client/ClientTests.java | 2 +- .../clickhouse/client/HttpTransportTests.java | 6 +- .../com/clickhouse/client/ProxyTests.java | 2 +- .../client/command/CommandTests.java | 4 +- .../clickhouse/client/insert/InsertTests.java | 9 +- .../clickhouse/client/query/QueryTests.java | 4 +- .../jdbc/internal/ExceptionUtils.java | 6 +- .../com/clickhouse/jdbc/ConnectionTest.java | 2 +- 28 files changed, 139 insertions(+), 105 deletions(-) rename client-v2/src/main/java/com/clickhouse/client/api/{ => exception}/ClientException.java (83%) rename client-v2/src/main/java/com/clickhouse/client/api/{ => exception}/ConnectionInitiationException.java (85%) rename client-v2/src/main/java/com/clickhouse/client/api/{ => exception}/ServerException.java (81%) create mode 100644 client-v2/src/main/java/com/clickhouse/client/api/exception/Utils.java diff --git a/client-v2/src/main/java/com/clickhouse/client/api/Client.java b/client-v2/src/main/java/com/clickhouse/client/api/Client.java index b014dc99f..c5e97bca8 100644 --- a/client-v2/src/main/java/com/clickhouse/client/api/Client.java +++ b/client-v2/src/main/java/com/clickhouse/client/api/Client.java @@ -12,6 +12,8 @@ import com.clickhouse.client.api.data_formats.internal.ProcessParser; import com.clickhouse.client.api.enums.Protocol; import com.clickhouse.client.api.enums.ProxyType; +import com.clickhouse.client.api.exception.ClientException; +import com.clickhouse.client.api.exception.ServerException; import com.clickhouse.client.api.http.ClickHouseHttpProto; import com.clickhouse.client.api.insert.InsertResponse; import com.clickhouse.client.api.insert.InsertSettings; diff --git a/client-v2/src/main/java/com/clickhouse/client/api/ClientMisconfigurationException.java b/client-v2/src/main/java/com/clickhouse/client/api/ClientMisconfigurationException.java index d296446c8..4fff95ebb 100644 --- a/client-v2/src/main/java/com/clickhouse/client/api/ClientMisconfigurationException.java +++ b/client-v2/src/main/java/com/clickhouse/client/api/ClientMisconfigurationException.java @@ -1,5 +1,7 @@ package com.clickhouse.client.api; +import com.clickhouse.client.api.exception.ClientException; + /** * Represents errors caused by a client misconfiguration. */ diff --git a/client-v2/src/main/java/com/clickhouse/client/api/command/CommandResponse.java b/client-v2/src/main/java/com/clickhouse/client/api/command/CommandResponse.java index 481edac4b..c7604f049 100644 --- a/client-v2/src/main/java/com/clickhouse/client/api/command/CommandResponse.java +++ b/client-v2/src/main/java/com/clickhouse/client/api/command/CommandResponse.java @@ -1,6 +1,6 @@ package com.clickhouse.client.api.command; -import com.clickhouse.client.api.ClientException; +import com.clickhouse.client.api.exception.ClientException; import com.clickhouse.client.api.metrics.OperationMetrics; import com.clickhouse.client.api.metrics.ServerMetrics; import com.clickhouse.client.api.query.QueryResponse; diff --git a/client-v2/src/main/java/com/clickhouse/client/api/data_formats/NativeFormatReader.java b/client-v2/src/main/java/com/clickhouse/client/api/data_formats/NativeFormatReader.java index e559080f9..894182d12 100644 --- a/client-v2/src/main/java/com/clickhouse/client/api/data_formats/NativeFormatReader.java +++ b/client-v2/src/main/java/com/clickhouse/client/api/data_formats/NativeFormatReader.java @@ -1,6 +1,6 @@ package com.clickhouse.client.api.data_formats; -import com.clickhouse.client.api.ClientException; +import com.clickhouse.client.api.exception.ClientException; import com.clickhouse.client.api.data_formats.internal.AbstractBinaryFormatReader; import com.clickhouse.client.api.data_formats.internal.BinaryStreamReader; import com.clickhouse.client.api.metadata.TableSchema; diff --git a/client-v2/src/main/java/com/clickhouse/client/api/data_formats/RowBinaryWithNamesAndTypesFormatReader.java b/client-v2/src/main/java/com/clickhouse/client/api/data_formats/RowBinaryWithNamesAndTypesFormatReader.java index 7eaa13d06..5e5ded104 100644 --- a/client-v2/src/main/java/com/clickhouse/client/api/data_formats/RowBinaryWithNamesAndTypesFormatReader.java +++ b/client-v2/src/main/java/com/clickhouse/client/api/data_formats/RowBinaryWithNamesAndTypesFormatReader.java @@ -1,6 +1,6 @@ package com.clickhouse.client.api.data_formats; -import com.clickhouse.client.api.ClientException; +import com.clickhouse.client.api.exception.ClientException; import com.clickhouse.client.api.data_formats.internal.AbstractBinaryFormatReader; import com.clickhouse.client.api.data_formats.internal.BinaryStreamReader; import com.clickhouse.client.api.metadata.TableSchema; diff --git a/client-v2/src/main/java/com/clickhouse/client/api/data_formats/internal/AbstractBinaryFormatReader.java b/client-v2/src/main/java/com/clickhouse/client/api/data_formats/internal/AbstractBinaryFormatReader.java index 625825a1a..4ad78879f 100644 --- a/client-v2/src/main/java/com/clickhouse/client/api/data_formats/internal/AbstractBinaryFormatReader.java +++ b/client-v2/src/main/java/com/clickhouse/client/api/data_formats/internal/AbstractBinaryFormatReader.java @@ -1,7 +1,7 @@ package com.clickhouse.client.api.data_formats.internal; import com.clickhouse.client.api.ClientConfigProperties; -import com.clickhouse.client.api.ClientException; +import com.clickhouse.client.api.exception.ClientException; import com.clickhouse.client.api.data_formats.ClickHouseBinaryFormatReader; import com.clickhouse.client.api.internal.MapUtils; import com.clickhouse.client.api.internal.ServerSettings; diff --git a/client-v2/src/main/java/com/clickhouse/client/api/data_formats/internal/BinaryStreamReader.java b/client-v2/src/main/java/com/clickhouse/client/api/data_formats/internal/BinaryStreamReader.java index 62298e572..1bdc1f358 100644 --- a/client-v2/src/main/java/com/clickhouse/client/api/data_formats/internal/BinaryStreamReader.java +++ b/client-v2/src/main/java/com/clickhouse/client/api/data_formats/internal/BinaryStreamReader.java @@ -1,6 +1,6 @@ package com.clickhouse.client.api.data_formats.internal; -import com.clickhouse.client.api.ClientException; +import com.clickhouse.client.api.exception.ClientException; import com.clickhouse.data.ClickHouseColumn; import com.clickhouse.data.ClickHouseDataType; import com.clickhouse.data.ClickHouseEnum; @@ -33,10 +33,8 @@ import java.util.List; import java.util.Map; import java.util.Set; -import java.util.Stack; import java.util.TimeZone; import java.util.UUID; -import java.util.concurrent.TimeUnit; /** * This class is not thread safe and should not be shared between multiple threads. diff --git a/client-v2/src/main/java/com/clickhouse/client/api/data_formats/internal/MapBackedRecord.java b/client-v2/src/main/java/com/clickhouse/client/api/data_formats/internal/MapBackedRecord.java index 3d375d168..8cfae567e 100644 --- a/client-v2/src/main/java/com/clickhouse/client/api/data_formats/internal/MapBackedRecord.java +++ b/client-v2/src/main/java/com/clickhouse/client/api/data_formats/internal/MapBackedRecord.java @@ -1,11 +1,10 @@ package com.clickhouse.client.api.data_formats.internal; -import com.clickhouse.client.api.ClientException; +import com.clickhouse.client.api.exception.ClientException; import com.clickhouse.client.api.metadata.TableSchema; import com.clickhouse.client.api.query.GenericRecord; import com.clickhouse.client.api.query.NullValueException; import com.clickhouse.data.ClickHouseColumn; -import com.clickhouse.data.ClickHouseDataType; import com.clickhouse.data.value.*; import java.math.BigDecimal; @@ -13,7 +12,6 @@ import java.net.Inet4Address; import java.net.Inet6Address; import java.time.*; -import java.time.temporal.ChronoUnit; import java.time.temporal.TemporalAmount; import java.util.HashMap; import java.util.List; diff --git a/client-v2/src/main/java/com/clickhouse/client/api/data_formats/internal/SerializerUtils.java b/client-v2/src/main/java/com/clickhouse/client/api/data_formats/internal/SerializerUtils.java index 916e1294b..7e818d6fc 100644 --- a/client-v2/src/main/java/com/clickhouse/client/api/data_formats/internal/SerializerUtils.java +++ b/client-v2/src/main/java/com/clickhouse/client/api/data_formats/internal/SerializerUtils.java @@ -1,7 +1,7 @@ package com.clickhouse.client.api.data_formats.internal; import com.clickhouse.client.api.Client; -import com.clickhouse.client.api.ClientException; +import com.clickhouse.client.api.exception.ClientException; import com.clickhouse.client.api.serde.POJOFieldDeserializer; import com.clickhouse.data.ClickHouseAggregateFunction; import com.clickhouse.data.ClickHouseColumn; diff --git a/client-v2/src/main/java/com/clickhouse/client/api/ClientException.java b/client-v2/src/main/java/com/clickhouse/client/api/exception/ClientException.java similarity index 83% rename from client-v2/src/main/java/com/clickhouse/client/api/ClientException.java rename to client-v2/src/main/java/com/clickhouse/client/api/exception/ClientException.java index 32c88f120..1b68db17e 100644 --- a/client-v2/src/main/java/com/clickhouse/client/api/ClientException.java +++ b/client-v2/src/main/java/com/clickhouse/client/api/exception/ClientException.java @@ -1,12 +1,12 @@ -package com.clickhouse.client.api; - -public class ClientException extends RuntimeException { - - public ClientException(String message) { - super(message); - } - - public ClientException(String message, Throwable cause) { - super(message, cause); - } -} +package com.clickhouse.client.api.exception; + +public class ClientException extends RuntimeException { + + public ClientException(String message) { + super(message); + } + + public ClientException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/client-v2/src/main/java/com/clickhouse/client/api/ConnectionInitiationException.java b/client-v2/src/main/java/com/clickhouse/client/api/exception/ConnectionInitiationException.java similarity index 85% rename from client-v2/src/main/java/com/clickhouse/client/api/ConnectionInitiationException.java rename to client-v2/src/main/java/com/clickhouse/client/api/exception/ConnectionInitiationException.java index b70d24280..1d6ffa0f4 100644 --- a/client-v2/src/main/java/com/clickhouse/client/api/ConnectionInitiationException.java +++ b/client-v2/src/main/java/com/clickhouse/client/api/exception/ConnectionInitiationException.java @@ -1,12 +1,12 @@ -package com.clickhouse.client.api; - -public class ConnectionInitiationException extends ClientException { - - public ConnectionInitiationException(String message) { - super(message); - } - - public ConnectionInitiationException(String message, Throwable cause) { - super(message, cause); - } -} +package com.clickhouse.client.api.exception; + +public class ConnectionInitiationException extends ClientException { + + public ConnectionInitiationException(String message) { + super(message); + } + + public ConnectionInitiationException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/client-v2/src/main/java/com/clickhouse/client/api/ServerException.java b/client-v2/src/main/java/com/clickhouse/client/api/exception/ServerException.java similarity index 81% rename from client-v2/src/main/java/com/clickhouse/client/api/ServerException.java rename to client-v2/src/main/java/com/clickhouse/client/api/exception/ServerException.java index c4476e1cc..a90ed225d 100644 --- a/client-v2/src/main/java/com/clickhouse/client/api/ServerException.java +++ b/client-v2/src/main/java/com/clickhouse/client/api/exception/ServerException.java @@ -1,40 +1,47 @@ -package com.clickhouse.client.api; - -public class ServerException extends RuntimeException { - - public static final int CODE_UNKNOWN = 0; - - public static final int TABLE_NOT_FOUND = 60; - - private final int code; - - private final int transportProtocolCode; - - public ServerException(int code, String message) { - this(code, message, 500); - } - - public ServerException(int code, String message, int transportProtocolCode) { - super(message); - this.code = code; - this.transportProtocolCode = transportProtocolCode; - } - - /** - * Returns CH server error code. May return 0 if code is unknown. - * @return - error code from server response - */ - public int getCode() { - return code; - } - - /** - * Returns error code of underlying transport protocol. For example, HTTP status. - * By default, will return {@code 500 } what is derived from HTTP Server Internal Error. - * - * @return - transport status code - */ - public int getTransportProtocolCode() { - return transportProtocolCode; - } -} +package com.clickhouse.client.api.exception; + +public class ServerException extends RuntimeException { + + public static final int CODE_UNKNOWN = 0; + + public static final int TABLE_NOT_FOUND = 60; + + private final int code; + + private final int transportProtocolCode; + + private boolean isRetryable = false; + + public ServerException(int code, String message) { + this(code, message, 500); + } + + public ServerException(int code, String message, int transportProtocolCode) { + super(message); + this.code = code; + this.transportProtocolCode = transportProtocolCode; + this.isRetryable = Utils.isRetryable(code, message, transportProtocolCode); + } + + /** + * Returns CH server error code. May return 0 if code is unknown. + * @return - error code from server response + */ + public int getCode() { + return code; + } + + /** + * Returns error code of underlying transport protocol. For example, HTTP status. + * By default, will return {@code 500 } what is derived from HTTP Server Internal Error. + * + * @return - transport status code + */ + public int getTransportProtocolCode() { + return transportProtocolCode; + } + + public boolean isRetryable() { + return isRetryable; + } +} diff --git a/client-v2/src/main/java/com/clickhouse/client/api/exception/Utils.java b/client-v2/src/main/java/com/clickhouse/client/api/exception/Utils.java new file mode 100644 index 000000000..ce2a14ee0 --- /dev/null +++ b/client-v2/src/main/java/com/clickhouse/client/api/exception/Utils.java @@ -0,0 +1,34 @@ +package com.clickhouse.client.api.exception; + +public class Utils { + + public static boolean isRetryable(int code, String message, int transportProtocolCode) { + //Let's check if we have a ServerException to reference the error code + //https://github.com/ClickHouse/ClickHouse/blob/master/src/Common/ErrorCodes.cpp + switch (code) { // UNEXPECTED_END_OF_FILE + case 3: // UNEXPECTED_END_OF_FILE + case 107: // FILE_DOESNT_EXIST + case 159: // TIMEOUT_EXCEEDED + case 164: // READONLY + case 202: // TOO_MANY_SIMULTANEOUS_QUERIES + case 203: // NO_FREE_CONNECTION + case 209: // SOCKET_TIMEOUT + case 210: // NETWORK_ERROR + case 241: // MEMORY_LIMIT_EXCEEDED + case 242: // TABLE_IS_READ_ONLY + case 252: // TOO_MANY_PARTS + case 285: // TOO_FEW_LIVE_REPLICAS + case 319: // UNKNOWN_STATUS_OF_INSERT + case 425: // SYSTEM_ERROR + case 999: // KEEPER_EXCEPTION + return true; + case 0: + switch (transportProtocolCode) { // Bad request + case 400: // Bad request + case 500: // Internal server error + return true; + }; + }; + return false; + } +} diff --git a/client-v2/src/main/java/com/clickhouse/client/api/internal/ClickHouseLZ4InputStream.java b/client-v2/src/main/java/com/clickhouse/client/api/internal/ClickHouseLZ4InputStream.java index 519ccf639..58365f256 100644 --- a/client-v2/src/main/java/com/clickhouse/client/api/internal/ClickHouseLZ4InputStream.java +++ b/client-v2/src/main/java/com/clickhouse/client/api/internal/ClickHouseLZ4InputStream.java @@ -1,6 +1,6 @@ package com.clickhouse.client.api.internal; -import com.clickhouse.client.api.ClientException; +import com.clickhouse.client.api.exception.ClientException; import com.clickhouse.data.ClickHouseByteUtils; import com.clickhouse.data.ClickHouseCityHash; import com.clickhouse.data.ClickHouseUtils; diff --git a/client-v2/src/main/java/com/clickhouse/client/api/internal/HttpAPIClientHelper.java b/client-v2/src/main/java/com/clickhouse/client/api/internal/HttpAPIClientHelper.java index 970a18f03..1bcc10787 100644 --- a/client-v2/src/main/java/com/clickhouse/client/api/internal/HttpAPIClientHelper.java +++ b/client-v2/src/main/java/com/clickhouse/client/api/internal/HttpAPIClientHelper.java @@ -3,12 +3,12 @@ import com.clickhouse.client.ClickHouseSslContextProvider; import com.clickhouse.client.api.Client; import com.clickhouse.client.api.ClientConfigProperties; -import com.clickhouse.client.api.ClientException; +import com.clickhouse.client.api.exception.ClientException; import com.clickhouse.client.api.ClientFaultCause; import com.clickhouse.client.api.ClientMisconfigurationException; -import com.clickhouse.client.api.ConnectionInitiationException; +import com.clickhouse.client.api.exception.ConnectionInitiationException; import com.clickhouse.client.api.ConnectionReuseStrategy; -import com.clickhouse.client.api.ServerException; +import com.clickhouse.client.api.exception.ServerException; import com.clickhouse.client.api.data_formats.internal.SerializerUtils; import com.clickhouse.client.api.enums.ProxyType; import com.clickhouse.client.api.http.ClickHouseHttpProto; diff --git a/client-v2/src/main/java/com/clickhouse/client/api/metadata/NoSuchColumnException.java b/client-v2/src/main/java/com/clickhouse/client/api/metadata/NoSuchColumnException.java index 4b54067e6..cc497f019 100644 --- a/client-v2/src/main/java/com/clickhouse/client/api/metadata/NoSuchColumnException.java +++ b/client-v2/src/main/java/com/clickhouse/client/api/metadata/NoSuchColumnException.java @@ -1,6 +1,6 @@ package com.clickhouse.client.api.metadata; -import com.clickhouse.client.api.ClientException; +import com.clickhouse.client.api.exception.ClientException; public class NoSuchColumnException extends ClientException { diff --git a/client-v2/src/main/java/com/clickhouse/client/api/query/NullValueException.java b/client-v2/src/main/java/com/clickhouse/client/api/query/NullValueException.java index bd699b2cf..07dbf5f33 100644 --- a/client-v2/src/main/java/com/clickhouse/client/api/query/NullValueException.java +++ b/client-v2/src/main/java/com/clickhouse/client/api/query/NullValueException.java @@ -1,6 +1,6 @@ package com.clickhouse.client.api.query; -import com.clickhouse.client.api.ClientException; +import com.clickhouse.client.api.exception.ClientException; /** * Throw when a null value cannot be returned because of data type. diff --git a/client-v2/src/main/java/com/clickhouse/client/api/query/QueryResponse.java b/client-v2/src/main/java/com/clickhouse/client/api/query/QueryResponse.java index 735fe6f58..52c41546b 100644 --- a/client-v2/src/main/java/com/clickhouse/client/api/query/QueryResponse.java +++ b/client-v2/src/main/java/com/clickhouse/client/api/query/QueryResponse.java @@ -1,7 +1,7 @@ package com.clickhouse.client.api.query; import com.clickhouse.client.api.ClientConfigProperties; -import com.clickhouse.client.api.ClientException; +import com.clickhouse.client.api.exception.ClientException; import com.clickhouse.client.api.http.ClickHouseHttpProto; import com.clickhouse.client.api.metrics.OperationMetrics; import com.clickhouse.client.api.metrics.ServerMetrics; diff --git a/client-v2/src/main/java/com/clickhouse/client/api/serde/DataSerializationException.java b/client-v2/src/main/java/com/clickhouse/client/api/serde/DataSerializationException.java index 5e196a5e3..0fb67d3ea 100644 --- a/client-v2/src/main/java/com/clickhouse/client/api/serde/DataSerializationException.java +++ b/client-v2/src/main/java/com/clickhouse/client/api/serde/DataSerializationException.java @@ -1,6 +1,6 @@ package com.clickhouse.client.api.serde; -import com.clickhouse.client.api.ClientException; +import com.clickhouse.client.api.exception.ClientException; public class DataSerializationException extends ClientException { diff --git a/client-v2/src/main/java/com/clickhouse/client/api/serde/SerializerNotFoundException.java b/client-v2/src/main/java/com/clickhouse/client/api/serde/SerializerNotFoundException.java index f49891ddc..72e1eb8fb 100644 --- a/client-v2/src/main/java/com/clickhouse/client/api/serde/SerializerNotFoundException.java +++ b/client-v2/src/main/java/com/clickhouse/client/api/serde/SerializerNotFoundException.java @@ -1,6 +1,6 @@ package com.clickhouse.client.api.serde; -import com.clickhouse.client.api.ClientException; +import com.clickhouse.client.api.exception.ClientException; public class SerializerNotFoundException extends ClientException { diff --git a/client-v2/src/test/java/com/clickhouse/client/ClientTests.java b/client-v2/src/test/java/com/clickhouse/client/ClientTests.java index 3499f1dc1..9951301be 100644 --- a/client-v2/src/test/java/com/clickhouse/client/ClientTests.java +++ b/client-v2/src/test/java/com/clickhouse/client/ClientTests.java @@ -2,7 +2,7 @@ import com.clickhouse.client.api.Client; import com.clickhouse.client.api.ClientConfigProperties; -import com.clickhouse.client.api.ClientException; +import com.clickhouse.client.api.exception.ClientException; import com.clickhouse.client.api.ClientFaultCause; import com.clickhouse.client.api.ConnectionReuseStrategy; import com.clickhouse.client.api.enums.Protocol; diff --git a/client-v2/src/test/java/com/clickhouse/client/HttpTransportTests.java b/client-v2/src/test/java/com/clickhouse/client/HttpTransportTests.java index dbc41304f..495d61372 100644 --- a/client-v2/src/test/java/com/clickhouse/client/HttpTransportTests.java +++ b/client-v2/src/test/java/com/clickhouse/client/HttpTransportTests.java @@ -2,11 +2,11 @@ import com.clickhouse.client.api.Client; import com.clickhouse.client.api.ClientConfigProperties; -import com.clickhouse.client.api.ClientException; +import com.clickhouse.client.api.exception.ClientException; import com.clickhouse.client.api.ClientFaultCause; -import com.clickhouse.client.api.ConnectionInitiationException; +import com.clickhouse.client.api.exception.ConnectionInitiationException; import com.clickhouse.client.api.ConnectionReuseStrategy; -import com.clickhouse.client.api.ServerException; +import com.clickhouse.client.api.exception.ServerException; import com.clickhouse.client.api.command.CommandResponse; import com.clickhouse.client.api.command.CommandSettings; import com.clickhouse.client.api.enums.Protocol; diff --git a/client-v2/src/test/java/com/clickhouse/client/ProxyTests.java b/client-v2/src/test/java/com/clickhouse/client/ProxyTests.java index af2a510c3..9fd4762e6 100644 --- a/client-v2/src/test/java/com/clickhouse/client/ProxyTests.java +++ b/client-v2/src/test/java/com/clickhouse/client/ProxyTests.java @@ -1,7 +1,7 @@ package com.clickhouse.client; import com.clickhouse.client.api.Client; -import com.clickhouse.client.api.ClientException; +import com.clickhouse.client.api.exception.ClientException; import com.clickhouse.client.api.ClientMisconfigurationException; import com.clickhouse.client.api.enums.Protocol; import com.clickhouse.client.api.enums.ProxyType; diff --git a/client-v2/src/test/java/com/clickhouse/client/command/CommandTests.java b/client-v2/src/test/java/com/clickhouse/client/command/CommandTests.java index c09842f71..06b95ac5e 100644 --- a/client-v2/src/test/java/com/clickhouse/client/command/CommandTests.java +++ b/client-v2/src/test/java/com/clickhouse/client/command/CommandTests.java @@ -5,8 +5,8 @@ import com.clickhouse.client.ClickHouseProtocol; import com.clickhouse.client.ClickHouseServerForTest; import com.clickhouse.client.api.Client; -import com.clickhouse.client.api.ClientException; -import com.clickhouse.client.api.ServerException; +import com.clickhouse.client.api.exception.ClientException; +import com.clickhouse.client.api.exception.ServerException; import com.clickhouse.client.api.command.CommandResponse; import com.clickhouse.client.api.enums.Protocol; import com.clickhouse.client.api.internal.ServerSettings; diff --git a/client-v2/src/test/java/com/clickhouse/client/insert/InsertTests.java b/client-v2/src/test/java/com/clickhouse/client/insert/InsertTests.java index b37bfe4a2..e89904455 100644 --- a/client-v2/src/test/java/com/clickhouse/client/insert/InsertTests.java +++ b/client-v2/src/test/java/com/clickhouse/client/insert/InsertTests.java @@ -6,7 +6,7 @@ import com.clickhouse.client.ClickHouseServerForTest; import com.clickhouse.client.api.Client; import com.clickhouse.client.api.ClientConfigProperties; -import com.clickhouse.client.api.ClientException; +import com.clickhouse.client.api.exception.ClientException; import com.clickhouse.client.api.DataTypeUtils; import com.clickhouse.client.api.command.CommandResponse; import com.clickhouse.client.api.command.CommandSettings; @@ -26,16 +26,10 @@ import com.clickhouse.client.api.query.QuerySettings; import com.clickhouse.data.ClickHouseFormat; import com.clickhouse.data.ClickHouseVersion; -import com.clickhouse.data.format.BinaryStreamUtils; -import lombok.Data; -import net.jpountz.lz4.LZ4Compressor; -import net.jpountz.lz4.LZ4Factory; -import net.jpountz.lz4.LZ4SafeDecompressor; import org.apache.commons.compress.compressors.lz4.FramedLZ4CompressorOutputStream; import org.apache.commons.compress.compressors.snappy.SnappyCompressorOutputStream; import org.apache.commons.lang3.StringEscapeUtils; import org.testcontainers.shaded.org.apache.commons.lang3.RandomStringUtils; -import org.testcontainers.shaded.org.checkerframework.checker.units.qual.A; import org.testng.Assert; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; @@ -59,7 +53,6 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; -import java.util.TimeZone; import java.util.UUID; import java.util.concurrent.TimeUnit; import java.util.zip.GZIPOutputStream; diff --git a/client-v2/src/test/java/com/clickhouse/client/query/QueryTests.java b/client-v2/src/test/java/com/clickhouse/client/query/QueryTests.java index ba9b8f018..3a8650a86 100644 --- a/client-v2/src/test/java/com/clickhouse/client/query/QueryTests.java +++ b/client-v2/src/test/java/com/clickhouse/client/query/QueryTests.java @@ -7,9 +7,9 @@ import com.clickhouse.client.ClickHouseProtocol; import com.clickhouse.client.ClickHouseServerForTest; import com.clickhouse.client.api.Client; -import com.clickhouse.client.api.ClientException; +import com.clickhouse.client.api.exception.ClientException; import com.clickhouse.client.api.DataTypeUtils; -import com.clickhouse.client.api.ServerException; +import com.clickhouse.client.api.exception.ServerException; import com.clickhouse.client.api.command.CommandResponse; import com.clickhouse.client.api.command.CommandSettings; import com.clickhouse.client.api.data_formats.ClickHouseBinaryFormatReader; diff --git a/jdbc-v2/src/main/java/com/clickhouse/jdbc/internal/ExceptionUtils.java b/jdbc-v2/src/main/java/com/clickhouse/jdbc/internal/ExceptionUtils.java index b3a64fe4e..19f4ccf83 100644 --- a/jdbc-v2/src/main/java/com/clickhouse/jdbc/internal/ExceptionUtils.java +++ b/jdbc-v2/src/main/java/com/clickhouse/jdbc/internal/ExceptionUtils.java @@ -1,9 +1,9 @@ package com.clickhouse.jdbc.internal; -import com.clickhouse.client.api.ClientException; +import com.clickhouse.client.api.exception.ClientException; import com.clickhouse.client.api.ClientMisconfigurationException; -import com.clickhouse.client.api.ConnectionInitiationException; -import com.clickhouse.client.api.ServerException; +import com.clickhouse.client.api.exception.ConnectionInitiationException; +import com.clickhouse.client.api.exception.ServerException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/jdbc-v2/src/test/java/com/clickhouse/jdbc/ConnectionTest.java b/jdbc-v2/src/test/java/com/clickhouse/jdbc/ConnectionTest.java index 7d3e9e26e..e8a9d68c1 100644 --- a/jdbc-v2/src/test/java/com/clickhouse/jdbc/ConnectionTest.java +++ b/jdbc-v2/src/test/java/com/clickhouse/jdbc/ConnectionTest.java @@ -5,7 +5,7 @@ import com.clickhouse.client.ClickHouseServerForTest; import com.clickhouse.client.api.Client; import com.clickhouse.client.api.ClientConfigProperties; -import com.clickhouse.client.api.ServerException; +import com.clickhouse.client.api.exception.ServerException; import com.clickhouse.client.api.internal.ServerSettings; import com.clickhouse.jdbc.internal.ClientInfoProperties; import com.clickhouse.jdbc.internal.DriverProperties; From 87a4af6f45eb69440aea9006ea633b0e16548c13 Mon Sep 17 00:00:00 2001 From: mzitnik Date: Tue, 24 Jun 2025 15:33:55 +0300 Subject: [PATCH 02/10] Adding ClickHouseException as base Excpetion --- .../client/api/ClickHouseException.java | 18 +++++ .../com/clickhouse/client/api/Client.java | 2 - .../api/{exception => }/ClientException.java | 4 +- .../client/api/ClientFaultCause.java | 1 + .../api/ClientMisconfigurationException.java | 2 - .../ConnectionInitiationException.java | 6 +- .../client/api/DataTransferException.java | 12 +++ .../client/api/ServerException.java | 75 +++++++++++++++++++ .../client/api/command/CommandResponse.java | 2 +- .../api/data_formats/NativeFormatReader.java | 2 +- ...owBinaryWithNamesAndTypesFormatReader.java | 2 +- .../internal/AbstractBinaryFormatReader.java | 2 +- .../internal/BinaryStreamReader.java | 2 +- .../internal/MapBackedRecord.java | 2 +- .../internal/SerializerUtils.java | 2 +- .../client/api/exception/ServerException.java | 47 ------------ .../client/api/exception/Utils.java | 34 --------- .../internal/ClickHouseLZ4InputStream.java | 2 +- .../api/internal/HttpAPIClientHelper.java | 35 ++++----- .../api/metadata/NoSuchColumnException.java | 2 +- .../client/api/query/NullValueException.java | 2 +- .../client/api/query/QueryResponse.java | 2 +- .../api/serde/DataSerializationException.java | 2 +- .../serde/SerializerNotFoundException.java | 2 +- .../com/clickhouse/client/ClientTests.java | 2 +- .../clickhouse/client/HttpTransportTests.java | 6 +- .../com/clickhouse/client/ProxyTests.java | 2 +- .../client/command/CommandTests.java | 4 +- .../clickhouse/client/insert/InsertTests.java | 2 +- .../clickhouse/client/query/QueryTests.java | 4 +- .../jdbc/internal/ExceptionUtils.java | 6 +- .../com/clickhouse/jdbc/ConnectionTest.java | 2 +- 32 files changed, 157 insertions(+), 133 deletions(-) create mode 100644 client-v2/src/main/java/com/clickhouse/client/api/ClickHouseException.java rename client-v2/src/main/java/com/clickhouse/client/api/{exception => }/ClientException.java (63%) rename client-v2/src/main/java/com/clickhouse/client/api/{exception => }/ConnectionInitiationException.java (54%) create mode 100644 client-v2/src/main/java/com/clickhouse/client/api/DataTransferException.java create mode 100644 client-v2/src/main/java/com/clickhouse/client/api/ServerException.java delete mode 100644 client-v2/src/main/java/com/clickhouse/client/api/exception/ServerException.java delete mode 100644 client-v2/src/main/java/com/clickhouse/client/api/exception/Utils.java diff --git a/client-v2/src/main/java/com/clickhouse/client/api/ClickHouseException.java b/client-v2/src/main/java/com/clickhouse/client/api/ClickHouseException.java new file mode 100644 index 000000000..83da17938 --- /dev/null +++ b/client-v2/src/main/java/com/clickhouse/client/api/ClickHouseException.java @@ -0,0 +1,18 @@ +package com.clickhouse.client.api; + +public class ClickHouseException extends RuntimeException { + protected boolean isRetryable = false; + + public ClickHouseException(String message) { + super(message); + } + + public ClickHouseException(String message, Throwable cause) { + super(message, cause); + } + + public ClickHouseException(Throwable cause) { + super(cause); + } + public boolean isRetryable() { return isRetryable; } +} diff --git a/client-v2/src/main/java/com/clickhouse/client/api/Client.java b/client-v2/src/main/java/com/clickhouse/client/api/Client.java index c5e97bca8..b014dc99f 100644 --- a/client-v2/src/main/java/com/clickhouse/client/api/Client.java +++ b/client-v2/src/main/java/com/clickhouse/client/api/Client.java @@ -12,8 +12,6 @@ import com.clickhouse.client.api.data_formats.internal.ProcessParser; import com.clickhouse.client.api.enums.Protocol; import com.clickhouse.client.api.enums.ProxyType; -import com.clickhouse.client.api.exception.ClientException; -import com.clickhouse.client.api.exception.ServerException; import com.clickhouse.client.api.http.ClickHouseHttpProto; import com.clickhouse.client.api.insert.InsertResponse; import com.clickhouse.client.api.insert.InsertSettings; diff --git a/client-v2/src/main/java/com/clickhouse/client/api/exception/ClientException.java b/client-v2/src/main/java/com/clickhouse/client/api/ClientException.java similarity index 63% rename from client-v2/src/main/java/com/clickhouse/client/api/exception/ClientException.java rename to client-v2/src/main/java/com/clickhouse/client/api/ClientException.java index 1b68db17e..7a967f816 100644 --- a/client-v2/src/main/java/com/clickhouse/client/api/exception/ClientException.java +++ b/client-v2/src/main/java/com/clickhouse/client/api/ClientException.java @@ -1,6 +1,6 @@ -package com.clickhouse.client.api.exception; +package com.clickhouse.client.api; -public class ClientException extends RuntimeException { +public class ClientException extends ClickHouseException { public ClientException(String message) { super(message); diff --git a/client-v2/src/main/java/com/clickhouse/client/api/ClientFaultCause.java b/client-v2/src/main/java/com/clickhouse/client/api/ClientFaultCause.java index d0e4f3212..95ff3a129 100644 --- a/client-v2/src/main/java/com/clickhouse/client/api/ClientFaultCause.java +++ b/client-v2/src/main/java/com/clickhouse/client/api/ClientFaultCause.java @@ -8,4 +8,5 @@ public enum ClientFaultCause { ConnectTimeout, ConnectionRequestTimeout, SocketTimeout, + ServerRetryable, } diff --git a/client-v2/src/main/java/com/clickhouse/client/api/ClientMisconfigurationException.java b/client-v2/src/main/java/com/clickhouse/client/api/ClientMisconfigurationException.java index 4fff95ebb..d296446c8 100644 --- a/client-v2/src/main/java/com/clickhouse/client/api/ClientMisconfigurationException.java +++ b/client-v2/src/main/java/com/clickhouse/client/api/ClientMisconfigurationException.java @@ -1,7 +1,5 @@ package com.clickhouse.client.api; -import com.clickhouse.client.api.exception.ClientException; - /** * Represents errors caused by a client misconfiguration. */ diff --git a/client-v2/src/main/java/com/clickhouse/client/api/exception/ConnectionInitiationException.java b/client-v2/src/main/java/com/clickhouse/client/api/ConnectionInitiationException.java similarity index 54% rename from client-v2/src/main/java/com/clickhouse/client/api/exception/ConnectionInitiationException.java rename to client-v2/src/main/java/com/clickhouse/client/api/ConnectionInitiationException.java index 1d6ffa0f4..b4679d9b5 100644 --- a/client-v2/src/main/java/com/clickhouse/client/api/exception/ConnectionInitiationException.java +++ b/client-v2/src/main/java/com/clickhouse/client/api/ConnectionInitiationException.java @@ -1,12 +1,14 @@ -package com.clickhouse.client.api.exception; +package com.clickhouse.client.api; -public class ConnectionInitiationException extends ClientException { +public class ConnectionInitiationException extends ClickHouseException { public ConnectionInitiationException(String message) { super(message); + this.isRetryable = true; } public ConnectionInitiationException(String message, Throwable cause) { super(message, cause); + this.isRetryable = true; } } diff --git a/client-v2/src/main/java/com/clickhouse/client/api/DataTransferException.java b/client-v2/src/main/java/com/clickhouse/client/api/DataTransferException.java new file mode 100644 index 000000000..033beb2ae --- /dev/null +++ b/client-v2/src/main/java/com/clickhouse/client/api/DataTransferException.java @@ -0,0 +1,12 @@ +package com.clickhouse.client.api; + +public class DataTransferException extends ClickHouseException { + + public DataTransferException(String message) { + super(message); + } + + public DataTransferException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/client-v2/src/main/java/com/clickhouse/client/api/ServerException.java b/client-v2/src/main/java/com/clickhouse/client/api/ServerException.java new file mode 100644 index 000000000..6fffe3bd8 --- /dev/null +++ b/client-v2/src/main/java/com/clickhouse/client/api/ServerException.java @@ -0,0 +1,75 @@ +package com.clickhouse.client.api; + +public class ServerException extends ClickHouseException { + + public static final int CODE_UNKNOWN = 0; + + public static final int TABLE_NOT_FOUND = 60; + + private final int code; + + private final int transportProtocolCode; + + public ServerException(int code, String message) { + this(code, message, 500); + } + + public ServerException(int code, String message, int transportProtocolCode) { + super(message); + this.code = code; + this.transportProtocolCode = transportProtocolCode; + this.isRetryable = discoverIsRetryable(code, message, transportProtocolCode); + } + + /** + * Returns CH server error code. May return 0 if code is unknown. + * @return - error code from server response + */ + public int getCode() { + return code; + } + + /** + * Returns error code of underlying transport protocol. For example, HTTP status. + * By default, will return {@code 500 } what is derived from HTTP Server Internal Error. + * + * @return - transport status code + */ + public int getTransportProtocolCode() { + return transportProtocolCode; + } + + public boolean isRetryable() { + return isRetryable; + } + + private boolean discoverIsRetryable(int code, String message, int transportProtocolCode) { + //Let's check if we have a ServerException to reference the error code + //https://github.com/ClickHouse/ClickHouse/blob/master/src/Common/ErrorCodes.cpp + switch (code) { // UNEXPECTED_END_OF_FILE + case 3: // UNEXPECTED_END_OF_FILE + case 107: // FILE_DOESNT_EXIST + case 159: // TIMEOUT_EXCEEDED + case 164: // READONLY + case 202: // TOO_MANY_SIMULTANEOUS_QUERIES + case 203: // NO_FREE_CONNECTION + case 209: // SOCKET_TIMEOUT + case 210: // NETWORK_ERROR + case 241: // MEMORY_LIMIT_EXCEEDED + case 242: // TABLE_IS_READ_ONLY + case 252: // TOO_MANY_PARTS + case 285: // TOO_FEW_LIVE_REPLICAS + case 319: // UNKNOWN_STATUS_OF_INSERT + case 425: // SYSTEM_ERROR + case 999: // KEEPER_EXCEPTION + return true; + case 0: + switch (transportProtocolCode) { // Bad request + case 400: // Bad request + case 500: // Internal server error + return true; + }; + }; + return false; + } +} diff --git a/client-v2/src/main/java/com/clickhouse/client/api/command/CommandResponse.java b/client-v2/src/main/java/com/clickhouse/client/api/command/CommandResponse.java index c7604f049..481edac4b 100644 --- a/client-v2/src/main/java/com/clickhouse/client/api/command/CommandResponse.java +++ b/client-v2/src/main/java/com/clickhouse/client/api/command/CommandResponse.java @@ -1,6 +1,6 @@ package com.clickhouse.client.api.command; -import com.clickhouse.client.api.exception.ClientException; +import com.clickhouse.client.api.ClientException; import com.clickhouse.client.api.metrics.OperationMetrics; import com.clickhouse.client.api.metrics.ServerMetrics; import com.clickhouse.client.api.query.QueryResponse; diff --git a/client-v2/src/main/java/com/clickhouse/client/api/data_formats/NativeFormatReader.java b/client-v2/src/main/java/com/clickhouse/client/api/data_formats/NativeFormatReader.java index 894182d12..e559080f9 100644 --- a/client-v2/src/main/java/com/clickhouse/client/api/data_formats/NativeFormatReader.java +++ b/client-v2/src/main/java/com/clickhouse/client/api/data_formats/NativeFormatReader.java @@ -1,6 +1,6 @@ package com.clickhouse.client.api.data_formats; -import com.clickhouse.client.api.exception.ClientException; +import com.clickhouse.client.api.ClientException; import com.clickhouse.client.api.data_formats.internal.AbstractBinaryFormatReader; import com.clickhouse.client.api.data_formats.internal.BinaryStreamReader; import com.clickhouse.client.api.metadata.TableSchema; diff --git a/client-v2/src/main/java/com/clickhouse/client/api/data_formats/RowBinaryWithNamesAndTypesFormatReader.java b/client-v2/src/main/java/com/clickhouse/client/api/data_formats/RowBinaryWithNamesAndTypesFormatReader.java index 5e5ded104..7eaa13d06 100644 --- a/client-v2/src/main/java/com/clickhouse/client/api/data_formats/RowBinaryWithNamesAndTypesFormatReader.java +++ b/client-v2/src/main/java/com/clickhouse/client/api/data_formats/RowBinaryWithNamesAndTypesFormatReader.java @@ -1,6 +1,6 @@ package com.clickhouse.client.api.data_formats; -import com.clickhouse.client.api.exception.ClientException; +import com.clickhouse.client.api.ClientException; import com.clickhouse.client.api.data_formats.internal.AbstractBinaryFormatReader; import com.clickhouse.client.api.data_formats.internal.BinaryStreamReader; import com.clickhouse.client.api.metadata.TableSchema; diff --git a/client-v2/src/main/java/com/clickhouse/client/api/data_formats/internal/AbstractBinaryFormatReader.java b/client-v2/src/main/java/com/clickhouse/client/api/data_formats/internal/AbstractBinaryFormatReader.java index 4ad78879f..625825a1a 100644 --- a/client-v2/src/main/java/com/clickhouse/client/api/data_formats/internal/AbstractBinaryFormatReader.java +++ b/client-v2/src/main/java/com/clickhouse/client/api/data_formats/internal/AbstractBinaryFormatReader.java @@ -1,7 +1,7 @@ package com.clickhouse.client.api.data_formats.internal; import com.clickhouse.client.api.ClientConfigProperties; -import com.clickhouse.client.api.exception.ClientException; +import com.clickhouse.client.api.ClientException; import com.clickhouse.client.api.data_formats.ClickHouseBinaryFormatReader; import com.clickhouse.client.api.internal.MapUtils; import com.clickhouse.client.api.internal.ServerSettings; diff --git a/client-v2/src/main/java/com/clickhouse/client/api/data_formats/internal/BinaryStreamReader.java b/client-v2/src/main/java/com/clickhouse/client/api/data_formats/internal/BinaryStreamReader.java index 1bdc1f358..577617678 100644 --- a/client-v2/src/main/java/com/clickhouse/client/api/data_formats/internal/BinaryStreamReader.java +++ b/client-v2/src/main/java/com/clickhouse/client/api/data_formats/internal/BinaryStreamReader.java @@ -1,6 +1,6 @@ package com.clickhouse.client.api.data_formats.internal; -import com.clickhouse.client.api.exception.ClientException; +import com.clickhouse.client.api.ClientException; import com.clickhouse.data.ClickHouseColumn; import com.clickhouse.data.ClickHouseDataType; import com.clickhouse.data.ClickHouseEnum; diff --git a/client-v2/src/main/java/com/clickhouse/client/api/data_formats/internal/MapBackedRecord.java b/client-v2/src/main/java/com/clickhouse/client/api/data_formats/internal/MapBackedRecord.java index 8cfae567e..f3e5d0856 100644 --- a/client-v2/src/main/java/com/clickhouse/client/api/data_formats/internal/MapBackedRecord.java +++ b/client-v2/src/main/java/com/clickhouse/client/api/data_formats/internal/MapBackedRecord.java @@ -1,6 +1,6 @@ package com.clickhouse.client.api.data_formats.internal; -import com.clickhouse.client.api.exception.ClientException; +import com.clickhouse.client.api.ClientException; import com.clickhouse.client.api.metadata.TableSchema; import com.clickhouse.client.api.query.GenericRecord; import com.clickhouse.client.api.query.NullValueException; diff --git a/client-v2/src/main/java/com/clickhouse/client/api/data_formats/internal/SerializerUtils.java b/client-v2/src/main/java/com/clickhouse/client/api/data_formats/internal/SerializerUtils.java index 7e818d6fc..916e1294b 100644 --- a/client-v2/src/main/java/com/clickhouse/client/api/data_formats/internal/SerializerUtils.java +++ b/client-v2/src/main/java/com/clickhouse/client/api/data_formats/internal/SerializerUtils.java @@ -1,7 +1,7 @@ package com.clickhouse.client.api.data_formats.internal; import com.clickhouse.client.api.Client; -import com.clickhouse.client.api.exception.ClientException; +import com.clickhouse.client.api.ClientException; import com.clickhouse.client.api.serde.POJOFieldDeserializer; import com.clickhouse.data.ClickHouseAggregateFunction; import com.clickhouse.data.ClickHouseColumn; diff --git a/client-v2/src/main/java/com/clickhouse/client/api/exception/ServerException.java b/client-v2/src/main/java/com/clickhouse/client/api/exception/ServerException.java deleted file mode 100644 index a90ed225d..000000000 --- a/client-v2/src/main/java/com/clickhouse/client/api/exception/ServerException.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.clickhouse.client.api.exception; - -public class ServerException extends RuntimeException { - - public static final int CODE_UNKNOWN = 0; - - public static final int TABLE_NOT_FOUND = 60; - - private final int code; - - private final int transportProtocolCode; - - private boolean isRetryable = false; - - public ServerException(int code, String message) { - this(code, message, 500); - } - - public ServerException(int code, String message, int transportProtocolCode) { - super(message); - this.code = code; - this.transportProtocolCode = transportProtocolCode; - this.isRetryable = Utils.isRetryable(code, message, transportProtocolCode); - } - - /** - * Returns CH server error code. May return 0 if code is unknown. - * @return - error code from server response - */ - public int getCode() { - return code; - } - - /** - * Returns error code of underlying transport protocol. For example, HTTP status. - * By default, will return {@code 500 } what is derived from HTTP Server Internal Error. - * - * @return - transport status code - */ - public int getTransportProtocolCode() { - return transportProtocolCode; - } - - public boolean isRetryable() { - return isRetryable; - } -} diff --git a/client-v2/src/main/java/com/clickhouse/client/api/exception/Utils.java b/client-v2/src/main/java/com/clickhouse/client/api/exception/Utils.java deleted file mode 100644 index ce2a14ee0..000000000 --- a/client-v2/src/main/java/com/clickhouse/client/api/exception/Utils.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.clickhouse.client.api.exception; - -public class Utils { - - public static boolean isRetryable(int code, String message, int transportProtocolCode) { - //Let's check if we have a ServerException to reference the error code - //https://github.com/ClickHouse/ClickHouse/blob/master/src/Common/ErrorCodes.cpp - switch (code) { // UNEXPECTED_END_OF_FILE - case 3: // UNEXPECTED_END_OF_FILE - case 107: // FILE_DOESNT_EXIST - case 159: // TIMEOUT_EXCEEDED - case 164: // READONLY - case 202: // TOO_MANY_SIMULTANEOUS_QUERIES - case 203: // NO_FREE_CONNECTION - case 209: // SOCKET_TIMEOUT - case 210: // NETWORK_ERROR - case 241: // MEMORY_LIMIT_EXCEEDED - case 242: // TABLE_IS_READ_ONLY - case 252: // TOO_MANY_PARTS - case 285: // TOO_FEW_LIVE_REPLICAS - case 319: // UNKNOWN_STATUS_OF_INSERT - case 425: // SYSTEM_ERROR - case 999: // KEEPER_EXCEPTION - return true; - case 0: - switch (transportProtocolCode) { // Bad request - case 400: // Bad request - case 500: // Internal server error - return true; - }; - }; - return false; - } -} diff --git a/client-v2/src/main/java/com/clickhouse/client/api/internal/ClickHouseLZ4InputStream.java b/client-v2/src/main/java/com/clickhouse/client/api/internal/ClickHouseLZ4InputStream.java index 58365f256..519ccf639 100644 --- a/client-v2/src/main/java/com/clickhouse/client/api/internal/ClickHouseLZ4InputStream.java +++ b/client-v2/src/main/java/com/clickhouse/client/api/internal/ClickHouseLZ4InputStream.java @@ -1,6 +1,6 @@ package com.clickhouse.client.api.internal; -import com.clickhouse.client.api.exception.ClientException; +import com.clickhouse.client.api.ClientException; import com.clickhouse.data.ClickHouseByteUtils; import com.clickhouse.data.ClickHouseCityHash; import com.clickhouse.data.ClickHouseUtils; diff --git a/client-v2/src/main/java/com/clickhouse/client/api/internal/HttpAPIClientHelper.java b/client-v2/src/main/java/com/clickhouse/client/api/internal/HttpAPIClientHelper.java index 1bcc10787..d310397fe 100644 --- a/client-v2/src/main/java/com/clickhouse/client/api/internal/HttpAPIClientHelper.java +++ b/client-v2/src/main/java/com/clickhouse/client/api/internal/HttpAPIClientHelper.java @@ -1,14 +1,7 @@ package com.clickhouse.client.api.internal; import com.clickhouse.client.ClickHouseSslContextProvider; -import com.clickhouse.client.api.Client; -import com.clickhouse.client.api.ClientConfigProperties; -import com.clickhouse.client.api.exception.ClientException; -import com.clickhouse.client.api.ClientFaultCause; -import com.clickhouse.client.api.ClientMisconfigurationException; -import com.clickhouse.client.api.exception.ConnectionInitiationException; -import com.clickhouse.client.api.ConnectionReuseStrategy; -import com.clickhouse.client.api.exception.ServerException; +import com.clickhouse.client.api.*; import com.clickhouse.client.api.data_formats.internal.SerializerUtils; import com.clickhouse.client.api.enums.ProxyType; import com.clickhouse.client.api.http.ClickHouseHttpProto; @@ -379,7 +372,7 @@ public Exception readError(ClassicHttpResponse httpResponse) { private AtomicLong timeToPoolVent = new AtomicLong(0); public ClassicHttpResponse executeRequest(Endpoint server, Map requestConfig, LZ4Factory lz4Factory, - IOCallback writeCallback) throws IOException { + IOCallback writeCallback) throws Exception { if (poolControl != null && timeToPoolVent.get() < System.currentTimeMillis()) { timeToPoolVent.set(System.currentTimeMillis() + POOL_VENT_TIMEOUT); poolControl.closeExpired(); @@ -432,14 +425,10 @@ public ClassicHttpResponse executeRequest(Endpoint server, Map r } catch (UnknownHostException e) { LOG.warn("Host '{}' unknown", server.getBaseURL()); - throw new ClientException("Unknown host", e); + throw new ConnectionInitiationException("Unknown host", e); } catch (ConnectException | NoRouteToHostException e) { LOG.warn("Failed to connect to '{}': {}", server.getBaseURL(), e.getMessage()); - throw new ClientException("Failed to connect", e); - } catch (ConnectionRequestTimeoutException | ServerException | NoHttpResponseException | ClientException | SocketTimeoutException e) { - throw e; - } catch (Exception e) { - throw new ClientException(e.getMessage(), e); + throw new ConnectionInitiationException("Failed to connect", e); } } @@ -651,6 +640,12 @@ public boolean shouldRetry(Throwable ex, Map requestSettings) { return retryCauses.contains(ClientFaultCause.SocketTimeout); } + // there are some db retryable error codes + if (ex instanceof ServerException || ex.getCause() instanceof ServerException) { + ServerException se = (ServerException) ex; + return se.isRetryable() && retryCauses.contains(ClientFaultCause.ServerRetryable); + } + return false; } @@ -664,11 +659,17 @@ public RuntimeException wrapException(String message, Exception cause) { if (cause instanceof ConnectionRequestTimeoutException || cause instanceof NoHttpResponseException || cause instanceof ConnectTimeoutException || - cause instanceof ConnectException) { + cause instanceof ConnectException || + cause instanceof UnknownHostException || + cause instanceof NoRouteToHostException) { return new ConnectionInitiationException(message, cause); } - return new ClientException(message, cause); + if (cause instanceof SocketTimeoutException || cause instanceof IOException) { + return new DataTransferException(message, cause); + } + // if we can not identify the exception explicitly we catch as our base exception ClickHouseException + return new ClickHouseException(message, cause); } diff --git a/client-v2/src/main/java/com/clickhouse/client/api/metadata/NoSuchColumnException.java b/client-v2/src/main/java/com/clickhouse/client/api/metadata/NoSuchColumnException.java index cc497f019..4b54067e6 100644 --- a/client-v2/src/main/java/com/clickhouse/client/api/metadata/NoSuchColumnException.java +++ b/client-v2/src/main/java/com/clickhouse/client/api/metadata/NoSuchColumnException.java @@ -1,6 +1,6 @@ package com.clickhouse.client.api.metadata; -import com.clickhouse.client.api.exception.ClientException; +import com.clickhouse.client.api.ClientException; public class NoSuchColumnException extends ClientException { diff --git a/client-v2/src/main/java/com/clickhouse/client/api/query/NullValueException.java b/client-v2/src/main/java/com/clickhouse/client/api/query/NullValueException.java index 07dbf5f33..bd699b2cf 100644 --- a/client-v2/src/main/java/com/clickhouse/client/api/query/NullValueException.java +++ b/client-v2/src/main/java/com/clickhouse/client/api/query/NullValueException.java @@ -1,6 +1,6 @@ package com.clickhouse.client.api.query; -import com.clickhouse.client.api.exception.ClientException; +import com.clickhouse.client.api.ClientException; /** * Throw when a null value cannot be returned because of data type. diff --git a/client-v2/src/main/java/com/clickhouse/client/api/query/QueryResponse.java b/client-v2/src/main/java/com/clickhouse/client/api/query/QueryResponse.java index 52c41546b..735fe6f58 100644 --- a/client-v2/src/main/java/com/clickhouse/client/api/query/QueryResponse.java +++ b/client-v2/src/main/java/com/clickhouse/client/api/query/QueryResponse.java @@ -1,7 +1,7 @@ package com.clickhouse.client.api.query; import com.clickhouse.client.api.ClientConfigProperties; -import com.clickhouse.client.api.exception.ClientException; +import com.clickhouse.client.api.ClientException; import com.clickhouse.client.api.http.ClickHouseHttpProto; import com.clickhouse.client.api.metrics.OperationMetrics; import com.clickhouse.client.api.metrics.ServerMetrics; diff --git a/client-v2/src/main/java/com/clickhouse/client/api/serde/DataSerializationException.java b/client-v2/src/main/java/com/clickhouse/client/api/serde/DataSerializationException.java index 0fb67d3ea..5e196a5e3 100644 --- a/client-v2/src/main/java/com/clickhouse/client/api/serde/DataSerializationException.java +++ b/client-v2/src/main/java/com/clickhouse/client/api/serde/DataSerializationException.java @@ -1,6 +1,6 @@ package com.clickhouse.client.api.serde; -import com.clickhouse.client.api.exception.ClientException; +import com.clickhouse.client.api.ClientException; public class DataSerializationException extends ClientException { diff --git a/client-v2/src/main/java/com/clickhouse/client/api/serde/SerializerNotFoundException.java b/client-v2/src/main/java/com/clickhouse/client/api/serde/SerializerNotFoundException.java index 72e1eb8fb..f49891ddc 100644 --- a/client-v2/src/main/java/com/clickhouse/client/api/serde/SerializerNotFoundException.java +++ b/client-v2/src/main/java/com/clickhouse/client/api/serde/SerializerNotFoundException.java @@ -1,6 +1,6 @@ package com.clickhouse.client.api.serde; -import com.clickhouse.client.api.exception.ClientException; +import com.clickhouse.client.api.ClientException; public class SerializerNotFoundException extends ClientException { diff --git a/client-v2/src/test/java/com/clickhouse/client/ClientTests.java b/client-v2/src/test/java/com/clickhouse/client/ClientTests.java index 9951301be..3499f1dc1 100644 --- a/client-v2/src/test/java/com/clickhouse/client/ClientTests.java +++ b/client-v2/src/test/java/com/clickhouse/client/ClientTests.java @@ -2,7 +2,7 @@ import com.clickhouse.client.api.Client; import com.clickhouse.client.api.ClientConfigProperties; -import com.clickhouse.client.api.exception.ClientException; +import com.clickhouse.client.api.ClientException; import com.clickhouse.client.api.ClientFaultCause; import com.clickhouse.client.api.ConnectionReuseStrategy; import com.clickhouse.client.api.enums.Protocol; diff --git a/client-v2/src/test/java/com/clickhouse/client/HttpTransportTests.java b/client-v2/src/test/java/com/clickhouse/client/HttpTransportTests.java index 495d61372..dbc41304f 100644 --- a/client-v2/src/test/java/com/clickhouse/client/HttpTransportTests.java +++ b/client-v2/src/test/java/com/clickhouse/client/HttpTransportTests.java @@ -2,11 +2,11 @@ import com.clickhouse.client.api.Client; import com.clickhouse.client.api.ClientConfigProperties; -import com.clickhouse.client.api.exception.ClientException; +import com.clickhouse.client.api.ClientException; import com.clickhouse.client.api.ClientFaultCause; -import com.clickhouse.client.api.exception.ConnectionInitiationException; +import com.clickhouse.client.api.ConnectionInitiationException; import com.clickhouse.client.api.ConnectionReuseStrategy; -import com.clickhouse.client.api.exception.ServerException; +import com.clickhouse.client.api.ServerException; import com.clickhouse.client.api.command.CommandResponse; import com.clickhouse.client.api.command.CommandSettings; import com.clickhouse.client.api.enums.Protocol; diff --git a/client-v2/src/test/java/com/clickhouse/client/ProxyTests.java b/client-v2/src/test/java/com/clickhouse/client/ProxyTests.java index 9fd4762e6..af2a510c3 100644 --- a/client-v2/src/test/java/com/clickhouse/client/ProxyTests.java +++ b/client-v2/src/test/java/com/clickhouse/client/ProxyTests.java @@ -1,7 +1,7 @@ package com.clickhouse.client; import com.clickhouse.client.api.Client; -import com.clickhouse.client.api.exception.ClientException; +import com.clickhouse.client.api.ClientException; import com.clickhouse.client.api.ClientMisconfigurationException; import com.clickhouse.client.api.enums.Protocol; import com.clickhouse.client.api.enums.ProxyType; diff --git a/client-v2/src/test/java/com/clickhouse/client/command/CommandTests.java b/client-v2/src/test/java/com/clickhouse/client/command/CommandTests.java index 06b95ac5e..c09842f71 100644 --- a/client-v2/src/test/java/com/clickhouse/client/command/CommandTests.java +++ b/client-v2/src/test/java/com/clickhouse/client/command/CommandTests.java @@ -5,8 +5,8 @@ import com.clickhouse.client.ClickHouseProtocol; import com.clickhouse.client.ClickHouseServerForTest; import com.clickhouse.client.api.Client; -import com.clickhouse.client.api.exception.ClientException; -import com.clickhouse.client.api.exception.ServerException; +import com.clickhouse.client.api.ClientException; +import com.clickhouse.client.api.ServerException; import com.clickhouse.client.api.command.CommandResponse; import com.clickhouse.client.api.enums.Protocol; import com.clickhouse.client.api.internal.ServerSettings; diff --git a/client-v2/src/test/java/com/clickhouse/client/insert/InsertTests.java b/client-v2/src/test/java/com/clickhouse/client/insert/InsertTests.java index e89904455..373ffb37e 100644 --- a/client-v2/src/test/java/com/clickhouse/client/insert/InsertTests.java +++ b/client-v2/src/test/java/com/clickhouse/client/insert/InsertTests.java @@ -6,7 +6,7 @@ import com.clickhouse.client.ClickHouseServerForTest; import com.clickhouse.client.api.Client; import com.clickhouse.client.api.ClientConfigProperties; -import com.clickhouse.client.api.exception.ClientException; +import com.clickhouse.client.api.ClientException; import com.clickhouse.client.api.DataTypeUtils; import com.clickhouse.client.api.command.CommandResponse; import com.clickhouse.client.api.command.CommandSettings; diff --git a/client-v2/src/test/java/com/clickhouse/client/query/QueryTests.java b/client-v2/src/test/java/com/clickhouse/client/query/QueryTests.java index 3a8650a86..ba9b8f018 100644 --- a/client-v2/src/test/java/com/clickhouse/client/query/QueryTests.java +++ b/client-v2/src/test/java/com/clickhouse/client/query/QueryTests.java @@ -7,9 +7,9 @@ import com.clickhouse.client.ClickHouseProtocol; import com.clickhouse.client.ClickHouseServerForTest; import com.clickhouse.client.api.Client; -import com.clickhouse.client.api.exception.ClientException; +import com.clickhouse.client.api.ClientException; import com.clickhouse.client.api.DataTypeUtils; -import com.clickhouse.client.api.exception.ServerException; +import com.clickhouse.client.api.ServerException; import com.clickhouse.client.api.command.CommandResponse; import com.clickhouse.client.api.command.CommandSettings; import com.clickhouse.client.api.data_formats.ClickHouseBinaryFormatReader; diff --git a/jdbc-v2/src/main/java/com/clickhouse/jdbc/internal/ExceptionUtils.java b/jdbc-v2/src/main/java/com/clickhouse/jdbc/internal/ExceptionUtils.java index 19f4ccf83..b3a64fe4e 100644 --- a/jdbc-v2/src/main/java/com/clickhouse/jdbc/internal/ExceptionUtils.java +++ b/jdbc-v2/src/main/java/com/clickhouse/jdbc/internal/ExceptionUtils.java @@ -1,9 +1,9 @@ package com.clickhouse.jdbc.internal; -import com.clickhouse.client.api.exception.ClientException; +import com.clickhouse.client.api.ClientException; import com.clickhouse.client.api.ClientMisconfigurationException; -import com.clickhouse.client.api.exception.ConnectionInitiationException; -import com.clickhouse.client.api.exception.ServerException; +import com.clickhouse.client.api.ConnectionInitiationException; +import com.clickhouse.client.api.ServerException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/jdbc-v2/src/test/java/com/clickhouse/jdbc/ConnectionTest.java b/jdbc-v2/src/test/java/com/clickhouse/jdbc/ConnectionTest.java index e8a9d68c1..7d3e9e26e 100644 --- a/jdbc-v2/src/test/java/com/clickhouse/jdbc/ConnectionTest.java +++ b/jdbc-v2/src/test/java/com/clickhouse/jdbc/ConnectionTest.java @@ -5,7 +5,7 @@ import com.clickhouse.client.ClickHouseServerForTest; import com.clickhouse.client.api.Client; import com.clickhouse.client.api.ClientConfigProperties; -import com.clickhouse.client.api.exception.ServerException; +import com.clickhouse.client.api.ServerException; import com.clickhouse.client.api.internal.ServerSettings; import com.clickhouse.jdbc.internal.ClientInfoProperties; import com.clickhouse.jdbc.internal.DriverProperties; From cf0887e95771c67270fdc69ceabec25ada1d150b Mon Sep 17 00:00:00 2001 From: mzitnik Date: Tue, 24 Jun 2025 16:03:35 +0300 Subject: [PATCH 03/10] Change to ClickHouseException --- .../java/com/clickhouse/client/insert/InsertTests.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/client-v2/src/test/java/com/clickhouse/client/insert/InsertTests.java b/client-v2/src/test/java/com/clickhouse/client/insert/InsertTests.java index 373ffb37e..903abdf93 100644 --- a/client-v2/src/test/java/com/clickhouse/client/insert/InsertTests.java +++ b/client-v2/src/test/java/com/clickhouse/client/insert/InsertTests.java @@ -4,10 +4,7 @@ import com.clickhouse.client.ClickHouseNode; import com.clickhouse.client.ClickHouseProtocol; import com.clickhouse.client.ClickHouseServerForTest; -import com.clickhouse.client.api.Client; -import com.clickhouse.client.api.ClientConfigProperties; -import com.clickhouse.client.api.ClientException; -import com.clickhouse.client.api.DataTypeUtils; +import com.clickhouse.client.api.*; import com.clickhouse.client.api.command.CommandResponse; import com.clickhouse.client.api.command.CommandSettings; import com.clickhouse.client.api.data_formats.RowBinaryFormatWriter; @@ -235,7 +232,7 @@ public void testInsertingPOJOWithNullValueForNonNullableColumn() throws Exceptio try (InsertResponse response = client.insert(tableName, Collections.singletonList(pojo), settings).get(30, TimeUnit.SECONDS)) { fail("Should have thrown an exception"); - } catch (ClientException e) { + } catch (ClickHouseException e) { e.printStackTrace(); assertTrue(e.getCause() instanceof IllegalArgumentException); } From c0692bc9e044af661a75b6df2bb7f6b6231e3959 Mon Sep 17 00:00:00 2001 From: mzitnik Date: Tue, 24 Jun 2025 17:56:59 +0300 Subject: [PATCH 04/10] Clean wrap of expection in the internal layer. --- .../clickhouse/client/api/internal/HttpAPIClientHelper.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client-v2/src/main/java/com/clickhouse/client/api/internal/HttpAPIClientHelper.java b/client-v2/src/main/java/com/clickhouse/client/api/internal/HttpAPIClientHelper.java index d310397fe..1d28f82d0 100644 --- a/client-v2/src/main/java/com/clickhouse/client/api/internal/HttpAPIClientHelper.java +++ b/client-v2/src/main/java/com/clickhouse/client/api/internal/HttpAPIClientHelper.java @@ -425,10 +425,10 @@ public ClassicHttpResponse executeRequest(Endpoint server, Map r } catch (UnknownHostException e) { LOG.warn("Host '{}' unknown", server.getBaseURL()); - throw new ConnectionInitiationException("Unknown host", e); + throw e; } catch (ConnectException | NoRouteToHostException e) { LOG.warn("Failed to connect to '{}': {}", server.getBaseURL(), e.getMessage()); - throw new ConnectionInitiationException("Failed to connect", e); + throw e; } } From 64964bd8aaaf9e6d9d65557bfa84e3190158d4ef Mon Sep 17 00:00:00 2001 From: mzitnik Date: Tue, 24 Jun 2025 21:44:44 +0300 Subject: [PATCH 05/10] Added ServerRetryable to defaults --- client-v2/src/main/java/com/clickhouse/client/api/Client.java | 2 +- .../java/com/clickhouse/client/api/ClientConfigProperties.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/client-v2/src/main/java/com/clickhouse/client/api/Client.java b/client-v2/src/main/java/com/clickhouse/client/api/Client.java index b014dc99f..21b567adf 100644 --- a/client-v2/src/main/java/com/clickhouse/client/api/Client.java +++ b/client-v2/src/main/java/com/clickhouse/client/api/Client.java @@ -813,7 +813,7 @@ public Builder setClientNetworkBufferSize(int size) { /** * Sets list of causes that should be retried on. - * Default {@code [NoHttpResponse, ConnectTimeout, ConnectionRequestTimeout]} + * Default {@code [NoHttpResponse, ConnectTimeout, ConnectionRequestTimeout, ServerRetryable]} * Use {@link ClientFaultCause#None} to disable retries. * * @param causes - list of causes diff --git a/client-v2/src/main/java/com/clickhouse/client/api/ClientConfigProperties.java b/client-v2/src/main/java/com/clickhouse/client/api/ClientConfigProperties.java index 06e0a9153..c46858fc1 100644 --- a/client-v2/src/main/java/com/clickhouse/client/api/ClientConfigProperties.java +++ b/client-v2/src/main/java/com/clickhouse/client/api/ClientConfigProperties.java @@ -120,7 +120,7 @@ public enum ClientConfigProperties { CLIENT_RETRY_ON_FAILURE("client_retry_on_failures", String.join(",", ClientFaultCause.NoHttpResponse.name(), ClientFaultCause.ConnectTimeout.name(), - ClientFaultCause.ConnectionRequestTimeout.name())), + ClientFaultCause.ConnectionRequestTimeout.name(), ClientFaultCause.ServerRetryable.name())), CLIENT_NAME("client_name"), From ba72853912714833247e432422a6984711ec207f Mon Sep 17 00:00:00 2001 From: mzitnik Date: Wed, 25 Jun 2025 08:26:38 +0300 Subject: [PATCH 06/10] throw real exception instead of wrapping with ClientException --- .../src/main/java/com/clickhouse/client/api/Client.java | 7 ++++--- .../src/test/java/com/clickhouse/client/ClientTests.java | 2 +- .../java/com/clickhouse/client/HttpTransportTests.java | 1 + 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/client-v2/src/main/java/com/clickhouse/client/api/Client.java b/client-v2/src/main/java/com/clickhouse/client/api/Client.java index 21b567adf..cc7890fd2 100644 --- a/client-v2/src/main/java/com/clickhouse/client/api/Client.java +++ b/client-v2/src/main/java/com/clickhouse/client/api/Client.java @@ -1464,7 +1464,8 @@ public CompletableFuture insert(String tableName, } } } - throw new ClientException("Insert request failed after attempts: " + (retries + 1) + " - Duration: " + (System.nanoTime() - startTime), lastException); + LOG.warn("Insert request failed after attempts: " + (retries + 1) + " - Duration: " + (System.nanoTime() - startTime)); + throw lastException; }; return runAsyncOperation(responseSupplier, settings.getAllSettings()); @@ -1586,8 +1587,8 @@ public CompletableFuture query(String sqlQuery, Map Date: Wed, 25 Jun 2025 08:42:47 +0300 Subject: [PATCH 07/10] Change to the correct Exception --- .../src/test/java/com/clickhouse/client/HttpTransportTests.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client-v2/src/test/java/com/clickhouse/client/HttpTransportTests.java b/client-v2/src/test/java/com/clickhouse/client/HttpTransportTests.java index 74cb89302..931e2cfa0 100644 --- a/client-v2/src/test/java/com/clickhouse/client/HttpTransportTests.java +++ b/client-v2/src/test/java/com/clickhouse/client/HttpTransportTests.java @@ -281,7 +281,7 @@ public void testInsertAndNoHttpResponseFailure(String body, int maxRetries, Thro try { function.apply(mockServerClient); - } catch (ClientException e) { + } catch (ConnectionInitiationException e) { e.printStackTrace(); if (!shouldFail) { Assert.fail("Unexpected exception", e); From d7dac9ef8cdd18fc6c2b378a57fae025fb6d25ce Mon Sep 17 00:00:00 2001 From: mzitnik Date: Wed, 25 Jun 2025 10:11:00 +0300 Subject: [PATCH 08/10] Support in to two diffreant error code that can cause the issue --- .../test/java/com/clickhouse/client/HttpTransportTests.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client-v2/src/test/java/com/clickhouse/client/HttpTransportTests.java b/client-v2/src/test/java/com/clickhouse/client/HttpTransportTests.java index 931e2cfa0..6669e8dd9 100644 --- a/client-v2/src/test/java/com/clickhouse/client/HttpTransportTests.java +++ b/client-v2/src/test/java/com/clickhouse/client/HttpTransportTests.java @@ -778,7 +778,8 @@ public void testErrorWithSendProgressHeaders() throws Exception { try (QueryResponse resp = client.query("INSERT INTO test_omm_table SELECT randomString(16) FROM numbers(300000000)", settings).get()) { } catch (ServerException e) { - Assert.assertEquals(e.getCode(), 241); + // 241 - MEMORY_LIMIT_EXCEEDED or 243 -NOT_ENOUGH_SPACE + Assert.assertTrue(e.getCode() == 241 || e.getCode() == 242); } } } From 88cab896ed3d3f82f6e08c9cacfc5872cc6ff0f7 Mon Sep 17 00:00:00 2001 From: mzitnik Date: Wed, 25 Jun 2025 10:40:36 +0300 Subject: [PATCH 09/10] Fix error code 243 -NOT_ENOUGH_SPACE --- .../src/test/java/com/clickhouse/client/HttpTransportTests.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client-v2/src/test/java/com/clickhouse/client/HttpTransportTests.java b/client-v2/src/test/java/com/clickhouse/client/HttpTransportTests.java index 6669e8dd9..d451ec645 100644 --- a/client-v2/src/test/java/com/clickhouse/client/HttpTransportTests.java +++ b/client-v2/src/test/java/com/clickhouse/client/HttpTransportTests.java @@ -779,7 +779,7 @@ public void testErrorWithSendProgressHeaders() throws Exception { } catch (ServerException e) { // 241 - MEMORY_LIMIT_EXCEEDED or 243 -NOT_ENOUGH_SPACE - Assert.assertTrue(e.getCode() == 241 || e.getCode() == 242); + Assert.assertTrue(e.getCode() == 241 || e.getCode() == 243); } } } From b3986f2a1876f57e7fe283973dccc3c98cd37aa1 Mon Sep 17 00:00:00 2001 From: mzitnik Date: Thu, 26 Jun 2025 14:38:17 +0300 Subject: [PATCH 10/10] Remove ServerException wrong logic --- .../java/com/clickhouse/client/api/ServerException.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/client-v2/src/main/java/com/clickhouse/client/api/ServerException.java b/client-v2/src/main/java/com/clickhouse/client/api/ServerException.java index 6fffe3bd8..0c6ed7574 100644 --- a/client-v2/src/main/java/com/clickhouse/client/api/ServerException.java +++ b/client-v2/src/main/java/com/clickhouse/client/api/ServerException.java @@ -63,12 +63,6 @@ private boolean discoverIsRetryable(int code, String message, int transportProto case 425: // SYSTEM_ERROR case 999: // KEEPER_EXCEPTION return true; - case 0: - switch (transportProtocolCode) { // Bad request - case 400: // Bad request - case 500: // Internal server error - return true; - }; }; return false; }