Hi Mark,

tested on a lighter sample reproducing the issue pretty easily (real one
would need 8.5) and your patch fixed it keeping the sample working fine

Romain Manni-Bucau
@rmannibucau <https://twitter.com/rmannibucau> |  Blog
<https://blog-rmannibucau.rhcloud.com> | Old Wordpress Blog
<http://rmannibucau.wordpress.com> | Github <https://github.com/rmannibucau> |
LinkedIn <https://www.linkedin.com/in/rmannibucau> | Tomitriber
<http://www.tomitribe.com> | JavaEE Factory
<https://javaeefactory-rmannibucau.rhcloud.com>

2016-09-03 20:38 GMT+02:00 Mark Thomas <ma...@apache.org>:

> On 03/09/2016 18:08, Romain Manni-Bucau wrote:
> > This is an interesting quote cause i understand as it is implemented in
> > tomcat but also means any usage would potentially lead to deadlocks or
> > container integration to ensure thread safety is done right making in
> both
> > cases the spec unusable or hard to use from a user perspective. Should it
> > be pushed back to the spec?
>
> It wouldn't hurt for the EG to clarify exactly what they meant by
> "...will not take effect until...". If it is intended that it might
> include blocking the thread making the call, stating that explicitly
> would be good.
>
> Meanwhile, try the following patch and let me know how you get on. It
> achieves the same result (hopefully) without the blocking. The unit
> tests pass but I want to think about it some more (and add some
> comments) before committing.
>
> http://people.apache.org/~markt/patches/2016-09-03-
> async-refactoring-tc9-v1.patch
>
> Mark
>
>
> >
> > Le 3 sept. 2016 18:28, "Mark Thomas" <ma...@apache.org> a écrit :
> >
> >> On 02/09/2016 15:47, Romain Manni-Bucau wrote:
> >>> ~business code (simplified):
> >>>
> >>> public void myBusiness(AsyncResponse wrapperOfAsyncContext) {
> >>>     new Thread() {
> >>>         @Override
> >>>         public void run() {
> >>>             wrapperOfAsyncContext.synchronizedDispatch();
> >>>         }
> >>>     }.start();
> >>>     wrapperOfAsyncContext.synchronizedMethod();
> >>> }
> >>>
> >>> If timing is good (and encountered enough to say it is in real life)
> then
> >>> both method call will lock cause:
> >>>
> >>> 1. for the user thread: the dispatch call will call
> >> pauseNonContainerThread
> >>> to wait the myBusiness thread to end (actually a bit more but you get
> the
> >>> idea)
> >>> 2. synchronizedMethod will lock on synchronizedDispatch
> >>>
> >>> so synchronizedMethod is lock on synchronizedDispatch which is lock on
> >>> the pauseNonContainerThread of the caller/http thread so both threads
> are
> >>> locked.
> >>
> >> Hmm.
> >>
> >> The relevant text from the Servlet spec is (for both dispatch() and
> >> complete()) is:
> >>
> >> "If any of the dispatch methods are called before the
> >> container-initiated dispatch that called startAsync has returned to the
> >> container, then the call will not take effect until after the
> >> container-initiated dispatch has returned to the container."
> >>
> >> The critical question is what does "...will not take effect until..."
> mean.
> >>
> >> Currently, Tomcat implements this as "...will block until...". I'll look
> >> into what it would take to implement this as "...note the request and
> >> execute it once...". Whether or not we change this will depend a lot on
> >> how complicated the change would be.
> >>
> >> Mark
> >>
> >>
> >> ---------------------------------------------------------------------
> >> To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
> >> For additional commands, e-mail: dev-h...@tomcat.apache.org
> >>
> >>
> >
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
> For additional commands, e-mail: dev-h...@tomcat.apache.org
>
>

Reply via email to