Gordon Daugherty created HTTPCLIENT-2133:
--------------------------------------------

             Summary: "Connection pool shut down" Exceptions occur after Error 
such as OOM is thrown while making an HTTP request
                 Key: HTTPCLIENT-2133
                 URL: https://issues.apache.org/jira/browse/HTTPCLIENT-2133
             Project: HttpComponents HttpClient
          Issue Type: Bug
          Components: HttpClient (classic)
    Affects Versions: 5.0 Beta2, 4.5.13, 4.5.12, 4.5.11, 4.5.10, 4.5.9, 4.5.8, 
4.5.7, 4.5.6
            Reporter: Gordon Daugherty


The change made in HTTPCLIENT-1924 was an improvement but introduced a new 
problem.

Scenario:

Software initializes and begins using an HttpClient like so:
{{}}
{code:java}
    PoolingHttpClientConnectionManager cm = connectionManagerBuilder.build();   
 
    HttpClient client = 
HttpClientBuilder.create().setConnectionManager(cm).build();

    HttpComponentsClientHttpRequestFactory factory = new 
HttpComponentsClientHttpRequestFactory(client);
    factory.setReadTimeout(clientConfiguration.getReadTimeoutMs());
    factory.setConnectTimeout(clientConfiguration.getConnectTimeoutMs());
    
factory.setConnectionRequestTimeout(clientConfiguration.getTimeoutConnectionRequestMs());
    factory.setBufferRequestBody(bufferRequestResponse(clientConfiguration));
    
    RestTemplate restTemplate = new RestTemplate(factory);
    restTemplate.setErrorHandler(new 
HttpClientErrorHandlerSpringBridge(clientConfiguration.getErrorHandler()));
    restTemplate.setInterceptors(this.interceptors);
    restTemplate.setMessageConverters(this.messageConverters);
    return restTemplate;{code}
{{Note that this }}{{PoolingHttpClientConnectionManager instance is used by 
only one }}{{HttpClient. It is not being shared. }}

Later while using the RestTemplate and in turn this HttpClient the software 
experiences an OOM Error. Perhaps caused by an unexpectedly large response 
payload. When that error occurs near the end of class 
org.apache.http.impl.execchain.MainClientExec's "execute" method it gets 
handled by this code:
{code:java}
        } catch (final Error error) {
            connManager.shutdown();
            throw error;
        }
{code}
The problem is that while the software that's using the affected HttpClient 
instance knows than an OOM Error occurred and presumably handles that it can't 
know that a pool was shut down and that the HttpClient is now unusable.

Consider modifying the solution that was applied in HTTPCLIENT-1924 to instead 
mimic how exceptions are handled in class MainClientExec:
{code:java}
        } catch (final Error error) {
// REMOVE:            connManager.shutdown();
            connHolder.abortConnection();
            if (proxyAuthState.isConnectionBased()) {
                proxyAuthState.reset();
            }
            if (targetAuthState.isConnectionBased()) {
                targetAuthState.reset();
            }
            throw error;
        }
{code}
This alternate solution will release the connection back to the pool in a state 
where the pool will not attempt to reuse it. This prevents leaks without 
preventing continued use of the HttpClient and its supporting connection pool.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

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

Reply via email to