[ 
https://issues.apache.org/jira/browse/SOLR-13605?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17717926#comment-17717926
 ] 

ASF subversion and git services commented on SOLR-13605:
--------------------------------------------------------

Commit 98168d23d63a10d6bfb0e1b3cdcba24fe77764f9 in solr's branch 
refs/heads/branch_9x from Eric Pugh
[ https://gitbox.apache.org/repos/asf?p=solr.git;h=98168d23d63 ]

SOLR-13605: HttpSolrClient.Builder.withHttpClient() is useless for the purpose 
of setting client scoped so/connect timeouts (#1565)

Properly handling HttpClient properties.
---------

Co-authored-by: Alex Deparvu <stilla...@apache.org>


> HttpSolrClient.Builder.withHttpClient() is useless for the purpose of setting 
> client scoped so/connect timeouts
> ---------------------------------------------------------------------------------------------------------------
>
>                 Key: SOLR-13605
>                 URL: https://issues.apache.org/jira/browse/SOLR-13605
>             Project: Solr
>          Issue Type: Bug
>            Reporter: Chris M. Hostetter
>            Priority: Major
>          Time Spent: 2.5h
>  Remaining Estimate: 0h
>
> TL;DR: trying to use {{HttpSolrClient.Builder.withHttpClient}} is useless for 
> the the purpose of specifying an {{HttpClient}} with the default "timeouts" 
> you want to use on all requests, because of how {{HttpSolrClient.Builder}} 
> and {{HttpClientUtil.createDefaultRequestConfigBuilder()}} hardcode values 
> thta get set on every {{HttpRequest}}.
> This internally affects code that uses things like 
> {{UpdateShardHandler.getDefaultHttpClient()}}, 
> {{UpdateShardHandler.getUpdateOnlyHttpClient()}} 
> {{UpdateShardHandler.getRecoveryOnlyHttpClient()}}, etc...
> ----
> While looking into the patch in SOLR-13532, I realized that the way 
> {{HttpSolrClient.Builder}} and it's super class {{SolrClientBuilder}} work, 
> the following code doesn't do what a reasonable person would expect...
> {code:java}
> SolrParams clientParams = params(HttpClientUtil.PROP_SO_TIMEOUT, 12345,
>                                  HttpClientUtil.PROP_CONNECTION_TIMEOUT, 
> 67890);
> HttpClient httpClient = HttpClientUtil.createClient(clientParams);
> HttpSolrClient solrClient = new HttpSolrClient.Builder(ANY_BASE_SOLR_URL)
>         .withHttpClient(httpClient)
>         .build();
> {code}
> When {{solrClient}} is used to execute a request, neither of the properties 
> passed to {{HttpClientUtil.createClient(...)}} will matter - the 
> {{HttpSolrClient.Builder}} (via inheritence from {{SolrClientBuilder}} has 
> the following hardcoded values...
> {code:java}
>   // SolrClientBuilder
>   protected Integer connectionTimeoutMillis = 15000;
>   protected Integer socketTimeoutMillis = 120000;
> {code}
> ...which unless overridden by calls to {{withConnectionTimeout()}} and 
> {{withSocketTimeout()}} will get set on the {{HttpSolrClient}} object, and 
> used on every request...
> {code:java}
>     // protected HttpSolrClient constructor
>     this.connectionTimeout = builder.connectionTimeoutMillis;
>     this.soTimeout = builder.socketTimeoutMillis;
> {code}
> It would be tempting to try and do something like this to work around the 
> problem...
> {code:java}
> SolrParams clientParams = params(HttpClientUtil.PROP_SO_TIMEOUT, 12345,
>                                  HttpClientUtil.PROP_CONNECTION_TIMEOUT, 
> 67890);
> HttpClient httpClient = HttpClientUtil.createClient(clientParams);
> HttpSolrClient solrClient = new HttpSolrClient.Builder(ANY_BASE_SOLR_URL)
>         .withHttpClient(httpClient)
>         .withSocketTimeout(null)
>         .withConnectionTimeout(null)
>         .build();
> {code}
> ...except for 2 problems:
>  # In {{HttpSolrClient.executeMethod}}, if the values of 
> {{this.connectionTimeout}} or {{this.soTimeout}} are null, then the values 
> from {{HttpClientUtil.createDefaultRequestConfigBuilder();}} get used, which 
> has it's own hardcoded defaults.
>  # {{withSocketTimeout}} and {{withConnectionTimeout}} take an int, not a 
> (nullable) Integer.
> So then maybe something like this would work? - particularly since at the 
> {{HttpClient}} / {{HttpRequest}} / {{RequestConfig}} level, a "-1" set on the 
> {{HttpRequest}}'s {{RequestConfig}} is suppose to mean "use the (client) 
> default" ...
> {code:java}
> SolrParams clientParams = params(HttpClientUtil.PROP_SO_TIMEOUT, 12345,
>                                  HttpClientUtil.PROP_CONNECTION_TIMEOUT, 
> 67890);
> HttpClient httpClient = HttpClientUtil.createClient(clientParams);
> HttpSolrClient client = new HttpSolrClient.Builder(ANY_BASE_SOLR_URL)
>         .withHttpClient(httpClient)
>         .withSocketTimeout(-1)
>         .withConnectionTimeout(-1)
>         .build();
> {code}
> ...except that if we do *that* we get an IllegalArgumentException...
> {code:java}
>   // SolrClientBuilder
>   public B withConnectionTimeout(int connectionTimeoutMillis) {
>     if (connectionTimeoutMillis < 0) {
>       throw new IllegalArgumentException("connectionTimeoutMillis must be a 
> non-negative integer.");
>     }
> {code}
> This is madness, and eliminates most/all of the known value of using 
> {{.withHttpClient}}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscr...@solr.apache.org
For additional commands, e-mail: issues-h...@solr.apache.org

Reply via email to