cxf-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Tadayoshi Sato (JIRA)" <j...@apache.org>
Subject [jira] [Updated] (CXF-7109) ClientCallback may be invoked twice when Async HTTP Transport is used
Date Wed, 26 Oct 2016 03:55:58 GMT

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

Tadayoshi Sato updated CXF-7109:
--------------------------------
    Fix Version/s: 3.2.0

> ClientCallback may be invoked twice when Async HTTP Transport is used
> ---------------------------------------------------------------------
>
>                 Key: CXF-7109
>                 URL: https://issues.apache.org/jira/browse/CXF-7109
>             Project: CXF
>          Issue Type: Bug
>          Components: Core, Transports
>    Affects Versions: 3.1.8
>         Environment: RHEL 6.8
>            Reporter: Tadayoshi Sato
>            Assignee: Freeman Fang
>             Fix For: 3.2.0
>
>
> With Async HTTP Transport ({{cxf-rt-transports-http-hc}}) enabled, the {{ClientCallback}}
object passed for the invocation of the client may be called twice when a failure occurs during
the invocation:
> {code:java}
> Client client = ...
> client.invoke(new ClientCallback { ... }, opName, params);
> {code}
> At this moment, this issue is reproduced only on RHEL 6.8, but code analysis shows that
it's a general multithreading issue with Async HTTP Transport and in theory it can happen
on any platform.
> Here is what I've found with the code analysis:
> If for some reason the target endpoint is not reachable, this issue can happen when the
callback for Apache HC {{HttpAsyncClient}} \[1] is invoked and thus shuts down {{SharedOutputBuffer}}
earlier than {{HTTPConduit}} tries to write it before closing the conduit itself \[2].
> \[1] https://github.com/apache/cxf/blob/cxf-3.1.8/rt/transports/http-hc/src/main/java/org/apache/cxf/transport/http/asyncclient/AsyncHTTPConduit.java#L464
> \[2] https://github.com/apache/cxf/blob/cxf-3.1.8/rt/transports/http-hc/src/main/java/org/apache/cxf/transport/http/asyncclient/SharedOutputBuffer.java#L231
> When the above issue happens, the interceptor chain's fault observer is eventually invoked
twice, once from the response workqueue thread \[3] that is spawn by the Apache HC {{HttpAsyncClient}}
callback and the second time from the requesting thread at the interceptor chain \[4]; Thus
the client callback is also invoked twice \[5]!
> \[3] https://github.com/apache/cxf/blob/cxf-3.1.8/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPConduit.java#L1177
> \[4] https://github.com/apache/cxf/blob/cxf-3.1.8/core/src/main/java/org/apache/cxf/phase/PhaseInterceptorChain.java#L366
> \[5] https://github.com/apache/cxf/blob/cxf-3.1.8/core/src/main/java/org/apache/cxf/interceptor/ClientOutFaultObserver.java#L59
> Why it happens so reliably only on RHEL 6.8 is still unclear (probably due to some thread
scheduling logic specific to the kernel for RHEL 6.8), but since it's essentially an ordering
issue for two distinct threads, in theory it can happen on any platforms. In general, CXF
should really enforce that every client callback be invoked once and only once.



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

Mime
View raw message