Avoid setting connection request timeout (#30384)
We've been setting this value to 500ms in the default low-level REST client configuration, misunderstanding the effect that it would have. This proved very problematic, as it ends up causing `TimeoutException` returned from the leased pool in some cases even for successful requests. Closes #24069
This commit is contained in:
parent
0c6789bc72
commit
ee6abef87b
|
@ -43,7 +43,6 @@ public final class RestClientBuilder {
|
||||||
public static final int DEFAULT_CONNECT_TIMEOUT_MILLIS = 1000;
|
public static final int DEFAULT_CONNECT_TIMEOUT_MILLIS = 1000;
|
||||||
public static final int DEFAULT_SOCKET_TIMEOUT_MILLIS = 30000;
|
public static final int DEFAULT_SOCKET_TIMEOUT_MILLIS = 30000;
|
||||||
public static final int DEFAULT_MAX_RETRY_TIMEOUT_MILLIS = DEFAULT_SOCKET_TIMEOUT_MILLIS;
|
public static final int DEFAULT_MAX_RETRY_TIMEOUT_MILLIS = DEFAULT_SOCKET_TIMEOUT_MILLIS;
|
||||||
public static final int DEFAULT_CONNECTION_REQUEST_TIMEOUT_MILLIS = 500;
|
|
||||||
public static final int DEFAULT_MAX_CONN_PER_ROUTE = 10;
|
public static final int DEFAULT_MAX_CONN_PER_ROUTE = 10;
|
||||||
public static final int DEFAULT_MAX_CONN_TOTAL = 30;
|
public static final int DEFAULT_MAX_CONN_TOTAL = 30;
|
||||||
|
|
||||||
|
@ -196,8 +195,7 @@ public final class RestClientBuilder {
|
||||||
//default timeouts are all infinite
|
//default timeouts are all infinite
|
||||||
RequestConfig.Builder requestConfigBuilder = RequestConfig.custom()
|
RequestConfig.Builder requestConfigBuilder = RequestConfig.custom()
|
||||||
.setConnectTimeout(DEFAULT_CONNECT_TIMEOUT_MILLIS)
|
.setConnectTimeout(DEFAULT_CONNECT_TIMEOUT_MILLIS)
|
||||||
.setSocketTimeout(DEFAULT_SOCKET_TIMEOUT_MILLIS)
|
.setSocketTimeout(DEFAULT_SOCKET_TIMEOUT_MILLIS);
|
||||||
.setConnectionRequestTimeout(DEFAULT_CONNECTION_REQUEST_TIMEOUT_MILLIS);
|
|
||||||
if (requestConfigCallback != null) {
|
if (requestConfigCallback != null) {
|
||||||
requestConfigBuilder = requestConfigCallback.customizeRequestConfig(requestConfigBuilder);
|
requestConfigBuilder = requestConfigCallback.customizeRequestConfig(requestConfigBuilder);
|
||||||
}
|
}
|
||||||
|
|
|
@ -177,4 +177,24 @@ public class RestClientBuilderTests extends RestClientTestCase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This test verifies that we don't change the default value for the connection request timeout as that causes problems.
|
||||||
|
* See https://github.com/elastic/elasticsearch/issues/24069
|
||||||
|
*/
|
||||||
|
public void testDefaultConnectionRequestTimeout() throws IOException {
|
||||||
|
RestClientBuilder builder = RestClient.builder(new HttpHost("localhost", 9200));
|
||||||
|
builder.setRequestConfigCallback(new RestClientBuilder.RequestConfigCallback() {
|
||||||
|
@Override
|
||||||
|
public RequestConfig.Builder customizeRequestConfig(RequestConfig.Builder requestConfigBuilder) {
|
||||||
|
RequestConfig requestConfig = requestConfigBuilder.build();
|
||||||
|
assertEquals(RequestConfig.DEFAULT.getConnectionRequestTimeout(), requestConfig.getConnectionRequestTimeout());
|
||||||
|
//this way we get notified if the default ever changes
|
||||||
|
assertEquals(-1, requestConfig.getConnectionRequestTimeout());
|
||||||
|
return requestConfigBuilder;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
try (RestClient restClient = builder.build()) {
|
||||||
|
assertNotNull(restClient);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,6 +32,7 @@ import org.apache.http.entity.ContentType;
|
||||||
import org.apache.http.entity.StringEntity;
|
import org.apache.http.entity.StringEntity;
|
||||||
import org.apache.http.impl.client.BasicCredentialsProvider;
|
import org.apache.http.impl.client.BasicCredentialsProvider;
|
||||||
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
|
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
|
||||||
|
import org.apache.http.nio.entity.NStringEntity;
|
||||||
import org.apache.http.util.EntityUtils;
|
import org.apache.http.util.EntityUtils;
|
||||||
import org.elasticsearch.mocksocket.MockHttpServer;
|
import org.elasticsearch.mocksocket.MockHttpServer;
|
||||||
import org.junit.AfterClass;
|
import org.junit.AfterClass;
|
||||||
|
@ -48,6 +49,9 @@ import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.CopyOnWriteArrayList;
|
||||||
|
import java.util.concurrent.CountDownLatch;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import static org.elasticsearch.client.RestClientTestUtil.getAllStatusCodes;
|
import static org.elasticsearch.client.RestClientTestUtil.getAllStatusCodes;
|
||||||
import static org.elasticsearch.client.RestClientTestUtil.getHttpMethods;
|
import static org.elasticsearch.client.RestClientTestUtil.getHttpMethods;
|
||||||
|
@ -159,6 +163,42 @@ public class RestClientSingleHostIntegTests extends RestClientTestCase {
|
||||||
httpServer = null;
|
httpServer = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests sending a bunch of async requests works well (e.g. no TimeoutException from the leased pool)
|
||||||
|
* See https://github.com/elastic/elasticsearch/issues/24069
|
||||||
|
*/
|
||||||
|
public void testManyAsyncRequests() throws Exception {
|
||||||
|
int iters = randomIntBetween(500, 1000);
|
||||||
|
final CountDownLatch latch = new CountDownLatch(iters);
|
||||||
|
final List<Exception> exceptions = new CopyOnWriteArrayList<>();
|
||||||
|
for (int i = 0; i < iters; i++) {
|
||||||
|
Request request = new Request("PUT", "/200");
|
||||||
|
request.setEntity(new NStringEntity("{}", ContentType.APPLICATION_JSON));
|
||||||
|
restClient.performRequestAsync(request, new ResponseListener() {
|
||||||
|
@Override
|
||||||
|
public void onSuccess(Response response) {
|
||||||
|
latch.countDown();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFailure(Exception exception) {
|
||||||
|
exceptions.add(exception);
|
||||||
|
latch.countDown();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
assertTrue("timeout waiting for requests to be sent", latch.await(10, TimeUnit.SECONDS));
|
||||||
|
if (exceptions.isEmpty() == false) {
|
||||||
|
AssertionError error = new AssertionError("expected no failures but got some. see suppressed for first 10 of ["
|
||||||
|
+ exceptions.size() + "] failures");
|
||||||
|
for (Exception exception : exceptions.subList(0, Math.min(10, exceptions.size()))) {
|
||||||
|
error.addSuppressed(exception);
|
||||||
|
}
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* End to end test for headers. We test it explicitly against a real http client as there are different ways
|
* End to end test for headers. We test it explicitly against a real http client as there are different ways
|
||||||
* to set/add headers to the {@link org.apache.http.client.HttpClient}.
|
* to set/add headers to the {@link org.apache.http.client.HttpClient}.
|
||||||
|
|
Loading…
Reference in New Issue