Bug 170395 - [Debug] ASSERT(!throwScope.exception()) on imported/w3c/web-platform-tests/fetch/api/cors/cors-preflight-status-worker.html
Summary: [Debug] ASSERT(!throwScope.exception()) on imported/w3c/web-platform-tests/fe...
Status: RESOLVED FIXED
Alias: None
Product: WebKit
Classification: Unclassified
Component: JavaScriptCore (show other bugs)
Version: WebKit Local Build
Hardware: Unspecified Unspecified
: P2 Normal
Assignee: youenn fablet
URL:
Keywords: InRadar
Depends on:
Blocks:
 
Reported: 2017-04-02 11:34 PDT by Alexey Proskuryakov
Modified: 2017-04-06 19:45 PDT (History)
6 users (show)

See Also:


Attachments
Adding early assertions (2.36 KB, patch)
2017-04-04 11:35 PDT, youenn fablet
no flags Details | Formatted Diff | Diff
Adding early assertions - fixing release builds (2.38 KB, patch)
2017-04-04 12:38 PDT, youenn fablet
no flags Details | Formatted Diff | Diff
Patch (2.25 KB, patch)
2017-04-06 17:30 PDT, youenn fablet
no flags Details | Formatted Diff | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Alexey Proskuryakov 2017-04-02 11:34:41 PDT
imported/w3c/web-platform-tests/fetch/api/cors/cors-preflight-status.html very frequently asserts:

https://webkit-test-results.webkit.org/dashboards/flakiness_dashboard.html#showAllRuns=true&tests=imported%2Fw3c%2Fweb-platform-tests%2Ffetch%2Fapi%2Fcors%2Fcors-preflight-status.html

Thread 24 Crashed:: WebCore: Worker
0   com.apple.JavaScriptCore      	0x0000000111327457 WTFCrash + 39 (Assertions.cpp:323)
1   com.apple.JavaScriptCore      	0x00000001109d968d JSC::Interpreter::executeCall(JSC::ExecState*, JSC::JSObject*, JSC::CallType, JSC::CallData const&, JSC::JSValue, JSC::ArgList const&) + 205 (Interpreter.cpp:897)
2   com.apple.JavaScriptCore      	0x000000011013879e JSC::call(JSC::ExecState*, JSC::JSValue, JSC::CallType, JSC::CallData const&, JSC::JSValue, JSC::ArgList const&) + 190 (CallData.cpp:39)
3   com.apple.WebCore             	0x00000001199ecc9f WebCore::DeferredPromise::callFunction(JSC::ExecState&, JSC::JSValue, JSC::JSValue) + 287 (JSDOMPromise.cpp:59)
4   com.apple.WebCore             	0x0000000119440d15 WebCore::DeferredPromise::reject(JSC::ExecState&, JSC::JSValue) + 85 (JSDOMPromise.h:127)
5   com.apple.WebCore             	0x00000001199ed16f WebCore::DeferredPromise::reject(int, WTF::String const&) + 287 (JSDOMPromise.cpp:109)
6   com.apple.WebCore             	0x0000000119031cd7 void WebCore::DOMPromiseBase::reject<WebCore::$_0>(WebCore::$_0&&) + 71 (JSDOMPromise.h:167)
7   com.apple.WebCore             	0x0000000119031b38 WebCore::FetchResponse::BodyLoader::didFail() + 264 (FetchResponse.cpp:141)
8   com.apple.WebCore             	0x000000011902d269 WebCore::FetchLoader::didFail(WebCore::ResourceError const&) + 41 (FetchLoader.cpp:152)
Comment 1 Radar WebKit Bug Importer 2017-04-02 11:35:01 PDT
<rdar://problem/31394017>
Comment 2 Alexey Proskuryakov 2017-04-02 11:50:42 PDT
First occurrence on 2017-03-09.
Comment 3 Alexey Proskuryakov 2017-04-02 11:56:03 PDT
Marked as flaky assert in r214727.
Comment 4 youenn fablet 2017-04-04 09:02:18 PDT
I doubt this is imported/w3c/web-platform-tests/fetch/api/cors/cors-preflight-status.html since there is no worker here.
Might be LayoutTests/imported/w3c/web-platform-tests/fetch/api/cors/cors-preflight-status-worker.html if it is run just before cors-preflight-status.html
Comment 5 youenn fablet 2017-04-04 09:04:09 PDT
From https://build.webkit.org/builders/Apple%20Sierra%20Debug%20WK1%20(Tests)/builds/334/steps/layout-test/logs/stdio

18:20:23.064 25505 worker/2 imported/w3c/web-platform-tests/fetch/api/cors/cors-preflight-status-worker.html output stderr lines:
18:20:23.064 25505   ASSERTION FAILED: !throwScope.exception()
18:20:23.064 25505   /Volumes/Data/slave/sierra-debug/build/Source/JavaScriptCore/interpreter/Interpreter.cpp(897) : JSC::JSValue JSC::Interpreter::executeCall(CallFrame *, JSC::JSObject *, JSC::CallType, const JSC::CallData &, JSC::JSValue, const JSC::ArgList &)
18:20:23.064 25505   1   0x1061bc8bd WTFCrash
18:20:23.064 25505   2   0x105ab271b JSC::Interpreter::executeCall(JSC::ExecState*, JSC::JSObject*, JSC::CallType, JSC::CallData const&, JSC::JSValue, JSC::ArgList const&)
18:20:23.064 25505   3   0x10528d5b8 JSC::call(JSC::ExecState*, JSC::JSValue, JSC::CallType, JSC::CallData const&, JSC::JSValue, JSC::ArgList const&)
18:20:23.064 25505   4   0x10528d86a JSC::profiledCall(JSC::ExecState*, JSC::ProfilingReason, JSC::JSValue, JSC::CallType, JSC::CallData const&, JSC::JSValue, JSC::ArgList const&)
18:20:23.064 25505   5   0x105be9ea8 JSC::JSJobMicrotask::run(JSC::ExecState*)
18:20:23.064 25505   6   0x10ef0d834 WebCore::JSGlobalObjectCallback::call()
18:20:23.064 25505   7   0x10ef0d671 WebCore::JSGlobalObjectTask::JSGlobalObjectTask(WebCore::JSDOMGlobalObject*, WTF::Ref<JSC::Microtask>&&)::$_0::operator()(WebCore::ScriptExecutionContext&) const
18:20:23.065 25505   8   0x10ef0d514 WTF::Function<void (WebCore::ScriptExecutionContext&)>::CallableWrapper<WebCore::JSGlobalObjectTask::JSGlobalObjectTask(WebCore::JSDOMGlobalObject*, WTF::Ref<JSC::Microtask>&&)::$_0>::call(WebCore::ScriptExecutionContext&)
18:20:23.065 25505 worker/2 imported/w3c/web-platform-tests/fetch/api/cors/cors-preflight-status-worker.html passed
Comment 6 youenn fablet 2017-04-04 09:22:41 PDT
executeCall is hitting a throwScope.exception() in executeCall.
In DeferredPromise::reject, we create a DOM exception which might generate such thing.
It might be that the creation of the exception is not happening correctly when we are closing abruptly the Worker.
Comment 7 Mark Lam 2017-04-04 09:25:27 PDT
(In reply to youenn fablet from comment #6)
> executeCall is hitting a throwScope.exception() in executeCall.
> In DeferredPromise::reject, we create a DOM exception which might generate
> such thing.
> It might be that the creation of the exception is not happening correctly
> when we are closing abruptly the Worker.

Shouldn't DeferredPromise::reject() catch all exceptions?
Comment 8 youenn fablet 2017-04-04 10:12:20 PDT
(In reply to Mark Lam from comment #7)
> (In reply to youenn fablet from comment #6)
> > executeCall is hitting a throwScope.exception() in executeCall.
> > In DeferredPromise::reject, we create a DOM exception which might generate
> > such thing.
> > It might be that the creation of the exception is not happening correctly
> > when we are closing abruptly the Worker.
> 
> Shouldn't DeferredPromise::reject() catch all exceptions?

We could make DeferredPromise::reject() exit early (and not call executeCall) when creation of the JSValue is not going right and is making throwScope.exception() to be true.
I would think that this is only happening in the context of Workers though.
We added several tweaks specific to Workers (see createDeferredPromise for instance).

In Window environment, we should then just ASSERT() while in Worker environment we should return early.
Comment 9 youenn fablet 2017-04-04 11:35:33 PDT
Created attachment 306182 [details]
Adding early assertions
Comment 10 youenn fablet 2017-04-04 12:38:10 PDT
Created attachment 306186 [details]
Adding early assertions - fixing release builds
Comment 11 Mark Lam 2017-04-04 12:39:43 PDT
Comment on attachment 306186 [details]
Adding early assertions - fixing release builds

r=me
Comment 12 WebKit Commit Bot 2017-04-04 14:11:41 PDT
Comment on attachment 306186 [details]
Adding early assertions - fixing release builds

Clearing flags on attachment: 306186

Committed r214897: <http://trac.webkit.org/changeset/214897>
Comment 13 WebKit Commit Bot 2017-04-04 14:11:43 PDT
All reviewed patches have been landed.  Closing bug.
Comment 14 Geoffrey Garen 2017-04-04 17:00:04 PDT
Comment on attachment 306186 [details]
Adding early assertions - fixing release builds

How does this patch solve the original problem, that there was a pending JS exception when we called into the JS reject handler?

I don't see any code in this patch to handle or clear the exception -- only code to assert that there was no exception.

Put another way, the purpose of a catch scope is provide access to a clearException() function. But this patch never calls clearException(). So why does it declare a catch scope?
Comment 15 Mark Lam 2017-04-04 17:02:28 PDT
(In reply to Geoffrey Garen from comment #14)
> Comment on attachment 306186 [details]
> Adding early assertions - fixing release builds
> 
> How does this patch solve the original problem, that there was a pending JS
> exception when we called into the JS reject handler?
> 
> I don't see any code in this patch to handle or clear the exception -- only
> code to assert that there was no exception.
> 
> Put another way, the purpose of a catch scope is provide access to a
> clearException() function. But this patch never calls clearException(). So
> why does it declare a catch scope?

Since this failure is intermittent, Youenn intended to use this patch to test whether the failure came from createDOMException().  Further action depends on what we see from the bots as a result of that.
Comment 16 Geoffrey Garen 2017-04-04 17:26:30 PDT
Got it. Thanks!
Comment 17 youenn fablet 2017-04-04 17:32:12 PDT
Let's see what happens
Comment 18 youenn fablet 2017-04-06 09:25:47 PDT
From https://build.webkit.org/results/Apple%20El%20Capitan%20Debug%20WK1%20(Tests)/r214947%20(361)/DumpRenderTree-2305-crash-log.txt
Thread 32 Crashed:: WebCore: Worker
0   com.apple.JavaScriptCore      	0x000000010253b867 WTFCrash + 39 (Assertions.cpp:323)
1   com.apple.WebCore             	0x000000010aba11b8 WebCore::DeferredPromise::reject(int, WTF::String const&) + 424 (JSDOMPromise.cpp:117)
2   com.apple.WebCore             	0x000000010a1e6167 void WebCore::DOMPromiseBase::reject<WebCore::$_0>(WebCore::$_0&&) + 71 (JSDOMPromise.h:167)
3   com.apple.WebCore             	0x000000010a1e5fc8 WebCore::FetchResponse::BodyLoader::didFail() + 264 (FetchResponse.cpp:141)
4   com.apple.WebCore             	0x000000010a1e16f9 WebCore::FetchLoader::didFail(WebCore::ResourceError const&) + 41 (FetchLoader.cpp:152)
5   com.apple.WebCore             	0x000000010c6b1e52 WebCore::ThreadableLoaderClientWrapper::didFail(WebCore::ResourceError const&) + 66 (ThreadableLoaderClientWrapper.h:88)

We are hitting the new assertion.
Same applies to https://build.webkit.org/results/Apple%20iOS%2010%20Simulator%20Debug%20WK2%20(Tests)/r214957%20(404)/com.apple.WebKit.WebContent.Development-16889-crash-log.txt

Assumption is probably correct
Comment 19 youenn fablet 2017-04-06 09:28:16 PDT
An older crash from this same test is different, probably also proving that we have issues elsewhere and that the way we stop workers are probably not working well with promises.

Thread 25 Crashed:: WebCore: Worker
0   com.apple.JavaScriptCore      	0x0000000103df2077 WTFCrash + 39 (Assertions.cpp:323)
1   com.apple.JavaScriptCore      	0x00000001036cb63d JSC::Interpreter::executeCall(JSC::ExecState*, JSC::JSObject*, JSC::CallType, JSC::CallData const&, JSC::JSValue, JSC::ArgList const&) + 205 (Interpreter.cpp:897)
2   com.apple.JavaScriptCore      	0x0000000102e8c23e JSC::call(JSC::ExecState*, JSC::JSValue, JSC::CallType, JSC::CallData const&, JSC::JSValue, JSC::ArgList const&) + 190 (CallData.cpp:39)
3   com.apple.JavaScriptCore      	0x0000000102e8c47a JSC::profiledCall(JSC::ExecState*, JSC::ProfilingReason, JSC::JSValue, JSC::CallType, JSC::CallData const&, JSC::JSValue, JSC::ArgList const&) + 106 (CallData.cpp:59)
4   com.apple.JavaScriptCore      	0x0000000103808e26 JSC::JSJobMicrotask::run(JSC::ExecState*) + 518 (JSJob.cpp:75)
5   com.apple.WebCore             	0x000000010c416222 WebCore::JSGlobalObjectCallback::call() + 418 (JSDOMGlobalObjectTask.cpp:69)
6   com.apple.WebCore             	0x000000010c415421 WebCore::JSGlobalObjectTask::JSGlobalObjectTask(WebCore::JSDOMGlobalObject*, WTF::Ref<JSC::Microtask>&&)::$_0::operator()(WebCore::ScriptExecutionContext&) const + 33 (JSDOMGlobalObjectTask.cpp:90)
7   com.apple.WebCore             	0x000000010c415377 WTF::Function<void (WebCore::ScriptExecutionContext&)>::CallableWrapper<WebCore::JSGlobalObjectTask::JSGlobalObjectTask(WebCore::JSDOMGlobalObject*, WTF::Ref<JSC::Microtask>&&)::$_0>::call(WebCore::ScriptExecutionContext&) + 55 (Function.h:89)
Comment 20 youenn fablet 2017-04-06 17:30:32 PDT
Created attachment 306443 [details]
Patch
Comment 21 youenn fablet 2017-04-06 17:35:39 PDT
(In reply to youenn fablet from comment #20)
> Created attachment 306443 [details]
> Patch

This patch only fixes the low-level issue.
Ideally, we should not need to do that since the early return based on isSuspended() should be the sufficient.
Might be good to add a FIXME maybe.
Comment 22 Mark Lam 2017-04-06 17:36:31 PDT
Comment on attachment 306443 [details]
Patch

r=me
Comment 23 WebKit Commit Bot 2017-04-06 19:45:48 PDT
Comment on attachment 306443 [details]
Patch

Clearing flags on attachment: 306443

Committed r215083: <http://trac.webkit.org/changeset/215083>
Comment 24 WebKit Commit Bot 2017-04-06 19:45:50 PDT
All reviewed patches have been landed.  Closing bug.