[ 
https://issues.apache.org/jira/browse/HTTPCORE-200?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Eugene Kirpichov updated HTTPCORE-200:
--------------------------------------

    Summary: ContentLengthInputStream.close() is not interruptible and may take 
an arbitrarily long time to complete  (was: ContentLengthInputStream.close() is 
not interruptible)

> ContentLengthInputStream.close() is not interruptible and may take an 
> arbitrarily long time to complete
> -------------------------------------------------------------------------------------------------------
>
>                 Key: HTTPCORE-200
>                 URL: https://issues.apache.org/jira/browse/HTTPCORE-200
>             Project: HttpComponents HttpCore
>          Issue Type: Bug
>          Components: HttpCore
>    Affects Versions: 4.0
>            Reporter: Eugene Kirpichov
>
> The method ContentLengthInputStream.close() reads the entity content to end.
> It does so in a non-interruptible fashion, and thus, if the entity content is 
> too long (or even infinite), the method may take too much time or not 
> terminate at all.
> I have actually observed this behavior: my program does a time-limited web 
> crawl and, after the time limit is exceeded, interrupts the crawler thread 
> and expects it to finish soon. The thread didn't finish in several minutes 
> after the interrupt, because it was stuck in consumeContent() for some very 
> large entity.
> Actually, execution time of this method for an entity of size N is limited by 
> soTimeout * N / ContentLengthInputStream.BUFFER_SIZE for the worst case where 
> each call to read() in the close() method almost causes a socket timeout. 
> This upper limit is definitely too large, especially for a method that is 
> supposed to release resources.
> It would of course be best if interrupting the thread just caused an 
> IOException in the underlying SocketInputStream.read(), but I know that this 
> functionality is not implemented in the JVM (and probably not going to be), 
> so we need a workaround.
> I suggest that ContentLengthInputStream.close() (or someone down its call 
> stack) check for Thread.currentThread.isInterrputed() between reads from the 
> socket and throw an InterruptedIOException if it returns true. Probably, this 
> might be done in AbstractSessionInputBuffer.fillBuffer().
> If done so, execution time of this method will be limited by 2*soTimeout, 
> which is already acceptable and at least predictable.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


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

Reply via email to