hc-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Archie Cobbs (JIRA)" <j...@apache.org>
Subject [jira] Commented: (HTTPCLIENT-731) Interrupting a connecting HTTP request thread incorrectly becomes a timeout exception
Date Thu, 24 Jan 2008 21:26:34 GMT

    [ https://issues.apache.org/jira/browse/HTTPCLIENT-731?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12562224#action_12562224

Archie Cobbs commented on HTTPCLIENT-731:

Good point. To fix this, there should be a call to "task.interrupt()" just before the new
IOException is created (in both places), e.g.:

            } catch (InterruptedException e) {
                throw (IOException)new IOException("thread interrupted").initCause(e);

This will preserve the previous behavior with respect to the supervised thread. Thanks.

> Interrupting a connecting  HTTP request thread incorrectly becomes a timeout exception
> --------------------------------------------------------------------------------------
>                 Key: HTTPCLIENT-731
>                 URL: https://issues.apache.org/jira/browse/HTTPCLIENT-731
>             Project: HttpComponents HttpClient
>          Issue Type: Improvement
>          Components: HttpClient
>    Affects Versions: 3.1 Final
>         Environment: Java 1.5 Linux
>            Reporter: Archie Cobbs
>         Attachments: HTTPCLIENT-731.txt
> Consider this logic in {{TimeoutController.java}}:
> {noformat}
>     public static void execute(Thread task, long timeout) throws TimeoutException {
>         task.start();
>         try {
>             task.join(timeout);
>         } catch (InterruptedException e) {
>             /* if somebody interrupts us he knows what he is doing */
>         }
>         if (task.isAlive()) {
>             task.interrupt();
>             throw new TimeoutException();
>         }
>     }
> {noformat}
> The effect of this is that if thread A is in the middle of performing an HTTP request
and happens to be waiting for the socket to connect, and then thread B interrupts thread A,
thread A will throw a {{TimeoutException}}, even if the actual timeout is far off in the future.
> In other words, interrupting a requesting thread that happens to be waiting for a socket
to connect is incorrectly interpreted as a connection timeout, which is incorrect.
> In my application, this causes the client to incorrectly believe the server is down,
when in actuality some other part of the client is simply trying to cancel an outstanding
RPC request.
> I realize that invoking {{HttpMethodBase.abort()}} would be a better way to abort the
RPC request and am working on refactoring my code to do that.
> However, this "translation" of a thread interruption into a timeout event is still incorrect.
Furthermore, this behavior is undocumented AFAICT.
> Suggestion for improvement: Convert thread interruptions into the equivalent of {{abort()}}
and document this behavior.

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-unsubscribe@hc.apache.org
For additional commands, e-mail: dev-help@hc.apache.org

View raw message