Andrew Shore created HTTPCLIENT-1728:
----------------------------------------

             Summary: AWS SDK Java Request Timeout
                 Key: HTTPCLIENT-1728
                 URL: https://issues.apache.org/jira/browse/HTTPCLIENT-1728
             Project: HttpComponents HttpClient
          Issue Type: Bug
          Components: HttpClient
    Affects Versions: 4.4.1
            Reporter: Andrew Shore
            Priority: Minor


This is a bit of an open ended question and not a bug in the Apache client but 
a bug in our code. To give a bit of background we've recently implemented a 
request timeout feature that works by launching a timer task that keeps a 
reference to the current running request and aborts it when it wakes up. This 
has been working well but we've recently gotten reports that it can put a 
connection in a bad state on the pool. We suspect this is due to using the 
request objects, which are explicitly documented as not thread safe, in a multi 
threaded fashion. We seem to be aborting the connection while or after it's 
being released to the pool which results in an IllegalStateException on the 
next request. We were wondering if there was a safer way to implement this 
feature that doesn't result in connections being put into a bad state.

Here's the code that starts the timer.
https://github.com/aws/aws-sdk-java/blob/master/aws-java-sdk-core/src/main/java/com/amazonaws/http/AmazonHttpClient.java#L856-L879
And here's the timer task implementation that aborts the request.
https://github.com/aws/aws-sdk-java/blob/master/aws-java-sdk-core/src/main/java/com/amazonaws/http/timers/request/HttpRequestAbortTaskImpl.java

Stack trace of connection in bad state
java.lang.IllegalStateException: Connection is not open
        at org.apache.http.util.Asserts.check(Asserts.java:34)
        at 
org.apache.http.impl.SocketHttpClientConnection.assertOpen(SocketHttpClientConnection.java:75)
        at 
org.apache.http.impl.AbstractHttpClientConnection.receiveResponseEntity(AbstractHttpClientConnection.java:293)
        at 
org.apache.http.impl.conn.ManagedClientConnectionImpl.receiveResponseEntity(ManagedClientConnectionImpl.java:192)
        at 
org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:273)
        at 
com.amazonaws.http.protocol.SdkHttpRequestExecutor.doReceiveResponse(SdkHttpRequestExecutor.java:82)
        at 
org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:123)
        at 
org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:682)
        at 
org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:486)
        at 
org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:863)
        at 
org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
        at 
org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:57)
        at 
com.amazonaws.http.AmazonHttpClient.executeOneRequest(AmazonHttpClient.java:822)
        at 
com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:576)
        at 
com.amazonaws.http.AmazonHttpClient.doExecute(AmazonHttpClient.java:362)
        at 
com.amazonaws.http.AmazonHttpClient.executeWithTimer(AmazonHttpClient.java:328)
        at 
com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:307)
        at 
com.amazonaws.services.kinesis.AmazonKinesisClient.invoke(AmazonKinesisClient.java:1753)
        at 
com.amazonaws.services.kinesis.AmazonKinesisClient.getRecords(AmazonKinesisClient.java:783)
        at 
com.amazonaws.services.catalog.search.kinesis.Shard.getStreamRecordsResult(Shard.java:180)
        at 
com.amazonaws.services.catalog.search.kinesis.Shard.enqueueStreamRecords(Shard.java:157)
        at 
com.amazonaws.services.catalog.search.kinesis.Shard.getRecordFromQueue(Shard.java:136)
        at 
com.amazonaws.services.catalog.search.kinesis.Shard.popNextRecord(Shard.java:125)
        at 
com.amazonaws.services.catalog.search.eventstream.ShardEventProcessor.processEvents(ShardEventProcessor.java:82)
        at 
com.amazonaws.services.catalog.search.eventstream.ShardEventsTask.startProcessing(ShardEventsTask.java:60)
        at 
com.amazonaws.services.catalog.search.eventstream.ShardEventsTask.call(ShardEventsTask.java:45)
        at 
com.amazonaws.services.catalog.search.eventstream.ShardEventsTask.call(ShardEventsTask.java:8)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to