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

Freeman Fang reassigned CXF-7109:
---------------------------------

    Assignee: Freeman Fang

> 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
>
> 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)

Reply via email to