On Nov 26, 2013, at 10:13 AM, Daniel Mikusa <dmik...@gopivotal.com> wrote:

> On Nov 26, 2013, at 6:06 AM, Mark Thomas <ma...@apache.org> wrote:
> 
>> On 26/11/2013 10:46, Mark Thomas wrote:
>>> On 25/11/2013 17:39, Daniel Mikusa wrote:
>>>> On Nov 25, 2013, at 12:19 PM, "Caldarale, Charles R"
>>>> <chuck.caldar...@unisys.com> wrote:
>>>> 
>>>>>> From: Daniel Mikusa [mailto:dmik...@gopivotal.com] Subject:
>>>>>> Another Non-blocking IO Question
>>>>> 
>>>>>> Most of the time it works, but in one case I'm seeing requests
>>>>>> hang.
>>>>> 
>>>>> You know the ritual:
>>>>> 
>>>>> 1) Tomcat version? 2) JDK version? 3) Thread dump?
>>>> 
>>>> Doh… Tomcat trunk.  JDK 1.7.0_45.
>>>> 
>>>> Took some thread dumps, but I don't think that's going to help here.
>>>> There are no blocking threads or threads waiting on external
>>>> resources.  The issue is that the async context is not being closed
>>>> and, in my example this is not happening cause "onAllDataRead()" is
>>>> not being called.  Which back to my question, can I depend on
>>>> "onAllDataRead()" being called always or are there certain cases
>>>> where it won't get called?
>>> 
>>> You should be able to rely on onAllDataRead() being called.
>>> 
>>>>>> in this case "onWritePossible" (i.e. my WriteListener) is reading
>>>>>> the data.
>>>>> 
>>>>> That seems to be against the spirit of the spec, albeit not the
>>>>> letter.  Spec clarification might be needed here.
>>> 
>>> The nature of the Servlet 3.1 non-blocking API is such that if copying
>>> data from request to response that the entire body may be read and the
>>> entire response written without any calls to onDataAvailable() or
>>> onWritePossible(). (That case is handled.). Depending on network
>>> conditions you may see either or both of onDataAvailable() and
>>> onWritePossible().
>>> 
>>> The code doesn't currently handle it correctly if the request is
>>> finished during onWritePossible(). I need to add that but it is a little
>>> more complicated as there could be multiple onWritePossible() calls
>>> after the request has been finished.
>>> 
>>> Your test case would be very helpful.
>> 
>> Should be fixed in trunk but I still won;t say no to a test case.
> 
> I pulled down the latest trunk and my test is no longer hanging, so that 
> looks good.  It is throwing an NPE, but that could be my fault.  I haven't 
> investigated that yet.

NPE seems to be caused by my test case code.  I was throwing a RuntimeException 
in onAllDataRead() to show that it wasn't being called.  Now that it's being 
called, the exception is being caught and triggering the NPE. 

It's generating an NPE because the exception is caught and in the catch block 
it's calling "onError(t)" for my write listener, however I completed the 
context prior to the exception being thrown so res.getWriteListener() is null.

Test case, completes the context and throws an exception...

                @Override
                public void onAllDataRead() throws IOException {
                    asyncContext.complete();
                    throw new RuntimeException("I never get called!");
                }

CoyoteAdapter line #370 is catching my exception, but res.getWriteListener() is 
null.

                    } catch (Throwable t) {
                        ExceptionUtils.handleThrowable(t);
                        res.getWriteListener().onError(t);  // <-- throws an NPE
                        throw t;
                   }

This is similar to what I reported in a different thread.

  http://markmail.org/message/mslnx7uggzftabkb

Dan

> 
> Here's a link to the test case.  I didn't see a BZ, so I just put it up on 
> github.
> 
>  https://gist.github.com/dmikusa-pivotal/7660005
> 
> Dan
> 
>> 
>> Mark
>> 
>> 
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
>> For additional commands, e-mail: users-h...@tomcat.apache.org
>> 
> 


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

Reply via email to