Hi Romain,

Yes, there are things which worry me as well, but we are talking about client 
here, not the server. When 
response is received, it is there, and if client disconnects, should not impact 
server or status code anyhow. 
However, the processing chain on the client side may not be completed, and 
probably in some cases client may
expect a slightly different response ... For the note, MP Rest Client TCK does 
not use CXF server(s), it uses 
Wiremock.

Best Regards,
    Andriy Redko

RMB> Hi Andriy,


RMB> This is what I suspected and actually it triggers a question: if I have an 
interceptor which must work on the
RMB> response, how can it be executed before the response is actually sent? 
Typically a 200 can become a 500 because the
RMB> client disconnected or so, so if you don't behave as CXF does today you 
can have some wrong data in your interceptors - or filters if you use the spec 
directly.


RMB> Personally I think we should use phases (Priorities in jaxrs IIRC) to 
support that. In other words, it should be
RMB> possible to execute code after the response was actually sent but 
serialization etc happens before the completion happens.


RMB> Does it make any sense?


RMB> Romain



RMB> Le ven. 7 juin 2019 à 17:45, Andriy Redko <[email protected]> a écrit :

RMB> Hi Roman,

RMB>  Sorry, took me a bit longer to troubleshoot the test cases but at this 
point the picture 
RMB>  is very clear. So yeah, test in question is not deterministic (flaky, in 
other words) due
RMB>  to the way CXF handles async flows (in this case, on client side). The 
interceptors are
RMB>  called in the context of the dedicated work pool. The response completion 
is tied to the moment
RMB>  the stream is closed, after that the interceptors chain is resumed. Which 
essentially 
RMB>  is the cause why the test may fail from time to time:

RMB>  1) Response is completed, the callback is triggered (worker thread), 
completing the CompletableFuture
RMB>  2) The interceptor chain is still ongoing (worker thread)
RMB>  3) The test unblocks (main thread) and proceed with assertions
RMB>  4) Here we come with the timing issue

RMB>  It turned out to be very easy to reproduce, however it also seems to be 
the issue 
RMB>  specific to CXF implementation. We could make the test more reliable (but 
it would leak 
RMB>  CXF specifics, either directly or indirectly) or we could delay the 
response completion
RMB>  till the moment interceptors do actually finish the processing, could be 
not trivial change 
RMB>  though. Do you have any thoughts on that?


RMB>  Best Regards,
RMB>      Andriy Redko


 AR>> Hi Romain,

 AR>> Run the test suite probably few dozen times on Windows and Ubuntu boxes, 
got it failing a few times on Ubuntu (but no failures on Windows):

 AR>> [INFO] RequestHandlerClass from context returned 
com.github.tomakehurst.wiremock.http.AdminRequestHandler. Normalized mapped 
under returned 'null'
 AR>> [ERROR] Tests run: 145, Failures: 1, Errors: 0, Skipped: 1, Time elapsed: 
90.181 s <<< FAILURE! - in TestSuitealized mapped under returned 'null'
 AR>> [ERROR] 
testAsyncInvocationInterceptorProvider(org.eclipse.microprofile.rest.client.tck.asynctests.AsyncMethodTest)
 Time elapsed: 0.103 s  <<< FAILURE!
 AR>> java.lang.AssertionError: expected [80] but found [null]
 AR>>         at
 AR>> 
org.eclipse.microprofile.rest.client.tck.asynctests.AsyncMethodTest.testAsyncInvocationInterceptorProvider(AsyncMethodTest.java:235)

 AR>> [INFO]
 AR>> [INFO] Results:
 AR>> [INFO]
 AR>> [ERROR] Failures:
 AR>> [ERROR]   
AsyncMethodTest>Arquillian.run:138->testAsyncInvocationInterceptorProvider:235 
expected [80] but found [null]
 AR>> [INFO]
 AR>> [ERROR] Tests run: 145, Failures: 1, Errors: 0, Skipped: 1
 AR>> [INFO]

 AR>> Yes, you are right, the test is non-deterministic. Trying to understand 
what is going on, may take some time.
 AR>> Thanks for noticing it.

 AR>> Best Regards,
 AR>>     Andriy Redko


 RMB>>> Hi Andriy,


 RMB>>> Result is random but it is
 RMB>>> 
org.eclipse.microprofile.rest.client.tck.asynctests.AsyncMethodTest.testAsyncInvocationInterceptorProvider



 RMB>>> Le dim. 2 juin 2019 à 19:12, Andriy Redko <[email protected]> a écrit :

 RMB>>> Hi Romain,

 RMB>>>  Yes, the async flows are difficult to test, which test cases for MP 
rest client are
 RMB>>>  intermittently failing for you? I would be able to take a look. Thanks.

 RMB>>>  Best Regards,
 RMB>>>      Andriy Redko

  RMB>>>> Hi everyone,

  RMB>>>> I just realize - thanks for failling test on jenkins, that part of 
the test
  RMB>>>> suite is not deterministic.
  RMB>>>> It mainly affects async calls. I found some opentracing ones - fixed 
by
  RMB>>>> 
https://github.com/apache/cxf/pull/561/commits/23cbbb9db73a74913fd4294f805032f923ffcf09
  RMB>>>> -
  RMB>>>> and there are some in MP rest client TCK (async interceptor provider).

  RMB>>>> I didn't dig deep into the root cause but I suspect we ack the client
  RMB>>>> before the full chain is processed on the server side.
  RMB>>>> Does it ring any bell to anyone?

  RMB>>>> Romain Manni-Bucau
  RMB>>>> @rmannibucau <https://twitter.com/rmannibucau> |  Blog
  RMB>>>> <https://rmannibucau.metawerx.net/> | Old Blog
  RMB>>>> <http://rmannibucau.wordpress.com> | Github 
<https://github.com/rmannibucau> |
  RMB>>>> LinkedIn <https://www.linkedin.com/in/rmannibucau> | Book
  RMB>>>> 
<https://www.packtpub.com/application-development/java-ee-8-high-performance>





Reply via email to