On 04/12/2019 14:20, Rémy Maucherat wrote:
> On Wed, Dec 4, 2019 at 12:44 PM Rémy Maucherat <r...@apache.org
> <mailto:r...@apache.org>> wrote:
> 
>     On Wed, Dec 4, 2019 at 11:51 AM Mark Thomas <ma...@apache.org
>     <mailto:ma...@apache.org>> wrote:
> 
>         On 04/12/2019 10:25, Rémy Maucherat wrote:
>         > On Wed, Dec 4, 2019 at 11:11 AM Mark Thomas
>         <m...@homeinbox.net <mailto:m...@homeinbox.net>
>         > <mailto:m...@homeinbox.net <mailto:m...@homeinbox.net>>> wrote:
>         >
>         >     On 04/12/2019 09:58, Mark Thomas wrote:
>         >     > On 04/12/2019 09:27, Mark Thomas wrote:
>         >     >> On 04/12/2019 07:55, Rémy Maucherat wrote:
>         >     >
>         >     > <snip/>
>         >     >
>         >     >>> Blocking is also used for HTTP/2 where it seems to
>         work. If the
>         >     write
>         >     >>> buffer is full, 0 bytes are written and the socket is
>         indeed
>         >     passed to
>         >     >>> the poller but until the operation is complete it is
>         supposed to be
>         >     >>> blocked here:
>         >     >>>
>         >   
>          
> https://github.com/apache/tomcat/blob/master/java/org/apache/tomcat/util/net/SocketWrapperBase.java#L1430
>         >     >>
>         >     >> That helps a lot. I can try and see why things aren't
>         blocking there.
>         >     >
>         >     > Some progress. The thread does wait there but it is getting
>         >     released too
>         >     > early. I'm guessing something is calling notify(). I'm
>         planning to add
>         >     > more debug to figure out what / why.
>         >
>         >     Found it.
>         >
>         >     The wait on line 1430 (see link above) waits for the
>         write/read timeout.
>         >     The problem was that this wait was timing out, allowing
>         the code to
>         >     continue before the Poller timed out a few milliseconds
>         later and called
>         >     the CompletionHander which ultimately sets the SendResult
>         the WebSocket
>         >     code is looking for.
>         >
>         >     I'm currently testing using:
>         >
>         >     state.wait()
>         >
>         >     rather than
>         >
>         >     state.wait(unit.toMillis(timeout));
>         >
>         >
>         > Well, it would remove the enforcement of the overall timeout
>         since the
>         > write could be made up of multiple operations. But I think I
>         get the
>         > idea that it's imperfect (once the IO is running, you cannot
>         stop it
>         > this way).
> 
>         Could we record the start time of the write (or similar) and
>         adjust the
>         timeout passed the Poller accordingly?
> 
> 
>     Yes, it's usually this kind of strategy, but it's complex :( I may
>     keep the wait(timeout) instead but make the processing of the failed
>     more robust.
> 
> 
> It seemed unreasonably complex for what it is and the breakage risk was
> really high too, so I preferred making the call of the "user" completion
> handler robust. Let me know if it doesn't work well enough but it seems
> ok with the test you gave (no null send result).

Thanks for the quick turnaround. All looks good to me.

> I will revisit this after the next build.

Ack.

Mark

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

Reply via email to