Skip to content

Commit 41b3e29

Browse files
committed
added retry on 503
1 parent 29cf395 commit 41b3e29

File tree

3 files changed

+36
-12
lines changed

3 files changed

+36
-12
lines changed

clickhouse-http-client/src/main/java/com/clickhouse/client/http/ApacheHttpConnectionImpl.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.apache.hc.client5.http.socket.PlainConnectionSocketFactory;
3131
import org.apache.hc.client5.http.ssl.DefaultHostnameVerifier;
3232
import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory;
33+
import org.apache.hc.core5.http.ConnectionClosedException;
3334
import org.apache.hc.core5.http.Header;
3435
import org.apache.hc.core5.http.HttpHost;
3536
import org.apache.hc.core5.http.HttpRequest;
@@ -253,12 +254,19 @@ protected ClickHouseHttpResponse post(ClickHouseConfig config, String sql, Click
253254

254255
int retryAttempts = config.getBoolOption(ClickHouseHttpOption.AHC_RETRY_ON_FAILURE) ? 2 : 1;
255256
for (int attempt = 0; attempt < retryAttempts; attempt++) {
257+
boolean isLastAttempt = attempt == retryAttempts - 1;
256258
log.debug("HTTP request attempt " + attempt);
257259
try {
258260
response = client.execute(post);
261+
262+
if (!isLastAttempt && (response.getCode() == HttpURLConnection.HTTP_UNAVAILABLE)) {
263+
log.debug("HTTP request failed with status code 503, retrying...");
264+
continue;
265+
}
266+
259267
break;
260-
} catch (NoHttpResponseException e) {
261-
if ((retryAttempts - attempt - 1) == 0) {
268+
} catch (NoHttpResponseException | ConnectionClosedException e) {
269+
if (isLastAttempt) {
262270
throw new ConnectException(e.getMessage());
263271
} else {
264272
continue;

clickhouse-http-client/src/main/java/com/clickhouse/client/http/config/ClickHouseHttpOption.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@ public enum ClickHouseHttpOption implements ClickHouseOption {
7070
/**
7171
* Whether to retry on failure with AsyncHttpClient. Failure includes some 'critical' IO exceptions:
7272
* <ul>
73-
* <li>{@code java.net.UnknownHostException}</li>
7473
* <li>{@code org.apache.hc.core5.http.ConnectionClosedException}</li>
7574
* <li>{@code org.apache.hc.core5.http.NoHttpResponseException}</li>
7675
* </ul>

clickhouse-http-client/src/test/java/com/clickhouse/client/http/ApacheHttpConnectionImplTest.java

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,11 @@
2828
import com.github.tomakehurst.wiremock.client.WireMock;
2929
import com.github.tomakehurst.wiremock.http.Fault;
3030
import com.github.tomakehurst.wiremock.stubbing.Scenario;
31+
import com.github.tomakehurst.wiremock.stubbing.StubMapping;
3132
import org.apache.hc.client5.http.socket.PlainConnectionSocketFactory;
33+
import org.apache.hc.core5.http.HttpStatus;
3234
import org.testng.Assert;
35+
import org.testng.annotations.DataProvider;
3336
import org.testng.annotations.Test;
3437

3538
public class ApacheHttpConnectionImplTest extends ClickHouseHttpClientTest {
@@ -150,18 +153,12 @@ public void testFailureWhileRequest() {
150153
}
151154
}
152155

153-
@Test(groups = {"unit"})
154-
public void testRetryOnFailure() {
156+
@Test(groups = {"unit"}, dataProvider = "retryOnFailureProvider")
157+
public void testRetryOnFailure(StubMapping failureStub) {
155158
faultyServer = new WireMockServer(9090);
156159
faultyServer.start();
157160
try {
158-
faultyServer.addStubMapping(WireMock.post(WireMock.anyUrl())
159-
.withRequestBody(WireMock.equalTo("SELECT 1"))
160-
.inScenario("Retry")
161-
.whenScenarioStateIs(Scenario.STARTED)
162-
.willReturn(WireMock.aResponse().withFault(Fault.EMPTY_RESPONSE))
163-
.willSetStateTo("Failed")
164-
.build());
161+
faultyServer.addStubMapping(failureStub);
165162
faultyServer.addStubMapping(WireMock.post(WireMock.anyUrl())
166163
.withRequestBody(WireMock.equalTo("SELECT 1"))
167164
.inScenario("Retry")
@@ -190,4 +187,24 @@ public void testRetryOnFailure() {
190187
faultyServer.stop();
191188
}
192189
}
190+
191+
@DataProvider(name = "retryOnFailureProvider")
192+
private static StubMapping[] retryOnFailureProvider() {
193+
return new StubMapping[] {
194+
WireMock.post(WireMock.anyUrl())
195+
.withRequestBody(WireMock.equalTo("SELECT 1"))
196+
.inScenario("Retry")
197+
.whenScenarioStateIs(Scenario.STARTED)
198+
.willReturn(WireMock.aResponse().withFault(Fault.EMPTY_RESPONSE))
199+
.willSetStateTo("Failed")
200+
.build()
201+
,WireMock.post(WireMock.anyUrl())
202+
.withRequestBody(WireMock.equalTo("SELECT 1"))
203+
.inScenario("Retry")
204+
.whenScenarioStateIs(Scenario.STARTED)
205+
.willReturn(WireMock.aResponse().withStatus(HttpStatus.SC_SERVICE_UNAVAILABLE))
206+
.willSetStateTo("Failed")
207+
.build()
208+
};
209+
}
193210
}

0 commit comments

Comments
 (0)