Adding a couple more V8 folks who may have thoughts. On Thu, Nov 8, 2018 at 1:59 AM Kentaro Hara <hara...@chromium.org> wrote:
> On Thu, Nov 8, 2018 at 1:10 AM Yuki Shiino <yukishi...@chromium.org> > wrote: > >> +adamk, cbruni to get more attention from V8 team. This needs V8 team's >> support. >> >> Actually, I intended haraken's (a3) at my proposal (a), but I'm afraid >> that changing an existing API HasCaught() would break backward >> compatibility. So, I'm also proposing to add a new V8 API like >> v8::TryCatch::HasPendingException or v8::TryCatch::HasCaughtOrTerminated or >> whatever we call it. >> >> By the way, the example code is just an example. Usually we don't have >> two TryCatch blocks next to each other, and Blink is rethrowing the >> exception in most cases. I just forgot to write rethrow in the example. >> That's not a point. Let me revise the example. >> >> Main thread: >> v8::Isolate* worker_isolate = ...; >> worker_isolate->TerminateExecution(); // Terminates the worker >> isolate. >> >> Worker thread (worker isolate): >> Foo(); // The v8::Isolate terminates during execution of Foo. >> Bar(); >> >> where Foo and Bar are the followings. >> >> void Foo() { >> v8::TryCatch try_catch1(isolate); >> // Call V8 APIs. The v8::Isolate gets terminated at this point. >> if (try_catch1.HasCaught()) { // => true due to the termination >> exception. >> // Rethrow or report the error to global error handlers. >> return; >> } >> } >> >> void Bar() { >> v8::TryCatch try_catch2(isolate); >> // Call V8 APIs. V8 APIs fail because the isolate is terminating. >> if (try_catch2.HasCaught()) { // => false because no new exception >> is thrown inside |try_catch2| scope. >> // Rethrow or report the error to global error handlers. >> return; >> } >> // Blink reaches here. :( >> } >> > > Hmm, I'm a bit confused. > > If Foo() rethrows the exception, why does the worker thread continue > execution and call Bar()? That will cause a problem even when the worker is > not terminated (because the worker continues execution ignoring the thrown > exception)...? > > Also I might want to understand how widely the problem is happening. First > of all, it is not realistic to handle worker's sudden termination in 100% > cases (unless we add checks to all V8 API calls in the Blink code base). So > the best thing we can do is to insert the termination check to places that > may call scripts (e.g., V8ScriptRunner, EventListener, Promise resolve / > reject etc) and reduce the crash rate. We could introduce > HasCaughtOrTerminated() if it helps to reduce the crash rate, but I want to > make sure that assumption is correct. My intuition is that it will be more > useful to identify places that may call scripts often and insert the > termination checks if missing. > I'd similarly like to understand how much this happens in practice. > A proposed solution looks like the following. >> >> v8::TryCatch try_catch(isolate); >> // ... >> if (try_catch.*HasCaughtOrTerminated*()) { >> v8::Local<v8::Exception> exception = try_catch. >> *CaughtExceptionOrTerminationException*(); >> // Do a job with |exception|. >> return; >> } >> >> where HasCaughtOrTerminated returns true when the isolate is terminating >> even if no exception is thrown inside the TryCatch scope, and >> CaughtExceptionOrTerminationException returns a thrown exception if an >> exception is thrown inside the TryCatch scope or the termination exception >> if the isolate is terminating. >> > As to the problem itself, I have a clarifying questions: doesn't Blink already have some choke point to determine whether it's "ok to call script now"? If so that'd be a more natural place to add this handling than TryCatch. - Adam > Cheers, >> Yuki Shiino >> >> >> 2018年11月8日(木) 17:38 Kentaro Hara <hara...@chromium.org>: >> >>> Thanks, I got it :) >>> >>> My proposal would be: >>> >>> (a3) Make HasCaught() return true when the isolate is terminated. >>> >>> I'm not sure if (a) or (a2) is a good idea because the fact that we >>> didn't call ReThrow() means that we (intentionally) suppressed the >>> exception. Thoughts? >>> >>> >>> >>> >>> On Wed, Nov 7, 2018 at 9:51 PM Yuki Shiino <yukishi...@chromium.org> >>> wrote: >>> >>>> Are you assuming that the worker is terminated while it's calling >>>>> DoSomethingElseWithV8()? If yes, why does HasCaught() not return true? If >>>>> no, what's a problem of continuing execution? >>>> >>>> >>>> No, the worker is terminated while DoSomethingWithV8 (without "Else"), >>>> and Blink continues running more V8 code at DoSomethingElseWithV8. Two >>>> pieces of code run consecutively. >>>> >>>> Worker thread (worker isolate): >>>> { >>>> v8::TryCatch try_catch(isolate); >>>> DoSomethingWithV8(); // The Isolate terminates here. >>>> if (try_catch.HasCaught()) { // => true due to termination >>>> // Handle error or termination. >>>> return; >>>> } >>>> } >>>> { >>>> v8::TryCatch try_catch(isolate); >>>> DoSomethingElseWithV8(); // V8 APIs fail because the Isolate is >>>> terminating. >>>> if (try_catch.HasCaught()) { // => false because no new >>>> exception is thrown inside the v8::TryCatch. >>>> return; // Blink doesn't reach here. >>>> } >>>> // Blink reach here instead. :( >>>> } >>>> >>>> IIUC, the second try_catch.HasCaught() doesn't return true because >>>> there is no new exception thrown inside the v8::TryCatch scope, although V8 >>>> APIs fail inside DoSomethingElseWithV8 due to a pending termination >>>> exception. >>>> >>>> Cheers, >>>> Yuki Shiino >>>> >>>> >>>> 2018年11月8日(木) 3:18 Kentaro Hara <hara...@chromium.org>: >>>> >>>>> Sorry, I'm not sure if I understand your example... >>>>> >>>>> >>>>> On Wed, Nov 7, 2018 at 2:21 AM Yutaka Hirano <yhir...@chromium.org> >>>>> wrote: >>>>> >>>>>> +ricea@ >>>>>> >>>>>> On Wed, Nov 7, 2018 at 6:44 PM Yuki Shiino <yukishi...@chromium.org> >>>>>> wrote: >>>>>> >>>>>>> Hi V8-team and platform-architecture-dev, >>>>>>> >>>>>>> TL;DR: We'd like to extend v8::TryCatch APIs a little. >>>>>>> >>>>>>> We're having an issue how to handle worker termination, i.e. >>>>>>> v8::Isolate termination. Roughly speaking, the situation is like below. >>>>>>> >>>>>>> Main thread: >>>>>>> v8::Isolate* worker_isolate = ...; >>>>>>> worker_isolate->TerminateExecution(); // Terminates the worker >>>>>>> isolate. >>>>>>> >>>>>>> Worker thread (worker isolate): >>>>>>> v8::TryCatch try_catch(isolate); >>>>>>> DoSomethingWithV8(); // The Isolate terminates here. >>>>>>> if (try_catch.HasCaught()) { // => true due to termination >>>>>>> // Handle error or termination. >>>>>>> return; >>>>>>> } >>>>>>> >>>>>>> No problem so far. Worker thread MUST NOT run any V8 code no longer >>>>>>> because the Isolate is terminating. However, Blink is not perfect, and >>>>>>> it's pretty tough for Blink to stop everything with 100% correctness. >>>>>>> Occasionally (or rarely) Blink continues running more V8 code like >>>>>>> below. >>>>>>> >>>>>>> Worker thread (worker isolate): >>>>>>> v8::TryCatch try_catch(isolate); >>>>>>> DoSomethingElseWithV8(); >>>>>>> if (try_catch.HasCaught()) { // => false because no new >>>>>>> exception is thrown inside the v8::TryCatch. >>>>>>> return; // Blink doesn't reach here. >>>>>>> } >>>>>>> // Blink reach here instead. :( >>>>>>> >>>>>>> If v8::TryCatch::HasCaught() returned true, Blink would be able to >>>>>>> handle it as error and Blink would work much better than now (Blink is >>>>>>> now >>>>>>> crashing). >>>>>>> >>>>>> >>>>> Are you assuming that the worker is terminated while it's calling >>>>> DoSomethingElseWithV8()? If yes, why does HasCaught() not return true? If >>>>> no, what's a problem of continuing execution? >>>>> >>>>> >>>>> >>>>>>> So, proposals here are something like below (not yet so concrete). >>>>>>> >>>>>>> a) Make v8::TryCatch::HasCaught() return true if there already >>>>>>> exists a pending exception. (Maybe this is no good.) >>>>>>> b) Make a new API like v8::TryCatch::HasPendingException() and make >>>>>>> it return true. Blink rewrites all HasCaught() to the new one. >>>>>>> >>>>>>> Similarly, >>>>>>> >>>>>>> a2) Make v8::TryCatch::Exception() return a pending exception if >>>>>>> there already exists. >>>>>>> b2) Make a new API like v8::TryCatch::PendingException() and make it >>>>>>> return a thrown exception or pending exception in the isolate if any. >>>>>>> Blink rewrites all Exception() to the new one. >>>>>>> >>>>>>> What do you think of the issue and proposals? >>>>>>> >>>>>>> Cheers, >>>>>>> Yuki Shiino >>>>>>> >>>>>>> -- >>>>>> You received this message because you are subscribed to the Google >>>>>> Groups "platform-architecture-dev" group. >>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>> send an email to platform-architecture-dev+unsubscr...@chromium.org. >>>>>> To post to this group, send email to >>>>>> platform-architecture-...@chromium.org. >>>>>> To view this discussion on the web visit >>>>>> https://groups.google.com/a/chromium.org/d/msgid/platform-architecture-dev/CABihn6ER8q9QABC3ROCSkm6V4w%2BDb0xEqRvjgzwBpMG9DmiG1Q%40mail.gmail.com >>>>>> <https://groups.google.com/a/chromium.org/d/msgid/platform-architecture-dev/CABihn6ER8q9QABC3ROCSkm6V4w%2BDb0xEqRvjgzwBpMG9DmiG1Q%40mail.gmail.com?utm_medium=email&utm_source=footer> >>>>>> . >>>>>> >>>>> >>>>> >>>>> -- >>>>> Kentaro Hara, Tokyo, Japan >>>>> >>>> >>> >>> -- >>> Kentaro Hara, Tokyo, Japan >>> >> > > -- > Kentaro Hara, Tokyo, Japan > > -- > You received this message because you are subscribed to the Google Groups > "platform-architecture-dev" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to platform-architecture-dev+unsubscr...@chromium.org. > To post to this group, send email to > platform-architecture-...@chromium.org. > To view this discussion on the web visit > https://groups.google.com/a/chromium.org/d/msgid/platform-architecture-dev/CABg10jx51JXHEt0H9z%3DzT%3D0GnhDf79QjhGtVxRc%3Dy-RXjHXUyw%40mail.gmail.com > <https://groups.google.com/a/chromium.org/d/msgid/platform-architecture-dev/CABg10jx51JXHEt0H9z%3DzT%3D0GnhDf79QjhGtVxRc%3Dy-RXjHXUyw%40mail.gmail.com?utm_medium=email&utm_source=footer> > . > -- -- v8-users mailing list v8-users@googlegroups.com http://groups.google.com/group/v8-users --- You received this message because you are subscribed to the Google Groups "v8-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to v8-users+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.