Title: [254706] trunk/Source/WebKit
Revision
254706
Author
[email protected]
Date
2020-01-16 13:45:50 -0800 (Thu, 16 Jan 2020)

Log Message

Add finite timeout when synchronously terminating a service worker
https://bugs.webkit.org/show_bug.cgi?id=206325
<rdar://problem/58183380>

Patch by Alex Christensen <[email protected]> on 2020-01-16
Reviewed by Youenn Fablet.

When this message reply is never received, it hangs everything.
If we haven't received verification that a service worker was terminated in 10 seconds, unhang everything
and tell the UI process to terminate the hanging service worker process. Continue handling messages during
these 10 seconds to hopefully turn a bad hang into no perceptible hang.

* NetworkProcess/ServiceWorker/WebSWServerToContextConnection.cpp:
(WebKit::WebSWServerToContextConnection::syncTerminateWorker):

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (254705 => 254706)


--- trunk/Source/WebKit/ChangeLog	2020-01-16 21:31:59 UTC (rev 254705)
+++ trunk/Source/WebKit/ChangeLog	2020-01-16 21:45:50 UTC (rev 254706)
@@ -1,3 +1,19 @@
+2020-01-16  Alex Christensen  <[email protected]>
+
+        Add finite timeout when synchronously terminating a service worker
+        https://bugs.webkit.org/show_bug.cgi?id=206325
+        <rdar://problem/58183380>
+
+        Reviewed by Youenn Fablet.
+
+        When this message reply is never received, it hangs everything.
+        If we haven't received verification that a service worker was terminated in 10 seconds, unhang everything
+        and tell the UI process to terminate the hanging service worker process. Continue handling messages during
+        these 10 seconds to hopefully turn a bad hang into no perceptible hang.
+
+        * NetworkProcess/ServiceWorker/WebSWServerToContextConnection.cpp:
+        (WebKit::WebSWServerToContextConnection::syncTerminateWorker):
+
 2020-01-16  Brady Eidson  <[email protected]>
 
         Make the callAsyncJavaScriptFunction function actually be async (so await works).

Modified: trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerToContextConnection.cpp (254705 => 254706)


--- trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerToContextConnection.cpp	2020-01-16 21:31:59 UTC (rev 254705)
+++ trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerToContextConnection.cpp	2020-01-16 21:45:50 UTC (rev 254706)
@@ -32,6 +32,7 @@
 #include "Logging.h"
 #include "NetworkConnectionToWebProcess.h"
 #include "NetworkProcess.h"
+#include "NetworkProcessProxyMessages.h"
 #include "ServiceWorkerFetchTask.h"
 #include "ServiceWorkerFetchTaskMessages.h"
 #include "WebCoreArgumentCoders.h"
@@ -107,7 +108,8 @@
 
 void WebSWServerToContextConnection::syncTerminateWorker(ServiceWorkerIdentifier serviceWorkerIdentifier)
 {
-    sendSync(Messages::WebSWContextManagerConnection::SyncTerminateWorker(serviceWorkerIdentifier), Messages::WebSWContextManagerConnection::SyncTerminateWorker::Reply());
+    if (!sendSync(Messages::WebSWContextManagerConnection::SyncTerminateWorker(serviceWorkerIdentifier), Messages::WebSWContextManagerConnection::SyncTerminateWorker::Reply(), 0, 10_s, IPC::SendSyncOption::ForceDispatchWhenDestinationIsWaitingForUnboundedSyncReply))
+        m_connection.networkProcess().parentProcessConnection()->send(Messages::NetworkProcessProxy::TerminateUnresponsiveServiceWorkerProcesses(registrableDomain(), m_connection.sessionID()), 0);
 }
 
 void WebSWServerToContextConnection::findClientByIdentifierCompleted(uint64_t requestIdentifier, const Optional<ServiceWorkerClientData>& data, bool hasSecurityError)

Modified: trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp (254705 => 254706)


--- trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp	2020-01-16 21:31:59 UTC (rev 254705)
+++ trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp	2020-01-16 21:45:50 UTC (rev 254706)
@@ -425,6 +425,12 @@
     page->logDiagnosticMessage(message, description, shouldSample);
 }
 
+void NetworkProcessProxy::terminateUnresponsiveServiceWorkerProcesses(WebCore::RegistrableDomain&& domain, PAL::SessionID sessionID)
+{
+    for (auto* processPool : WebProcessPool::allProcessPools())
+        processPool->terminateServiceWorkerProcess(domain, sessionID);
+}
+
 void NetworkProcessProxy::logDiagnosticMessageWithResult(WebPageProxyIdentifier pageID, const String& message, const String& description, uint32_t result, WebCore::ShouldSample shouldSample)
 {
     WebPageProxy* page = WebProcessProxy::webPage(pageID);

Modified: trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h (254705 => 254706)


--- trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h	2020-01-16 21:31:59 UTC (rev 254705)
+++ trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h	2020-01-16 21:45:50 UTC (rev 254706)
@@ -174,6 +174,7 @@
     void didSyncAllCookies();
 
     void testProcessIncomingSyncMessagesWhenWaitingForSyncReply(WebPageProxyIdentifier, Messages::NetworkProcessProxy::TestProcessIncomingSyncMessagesWhenWaitingForSyncReplyDelayedReply&&);
+    void terminateUnresponsiveServiceWorkerProcesses(WebCore::RegistrableDomain&&, PAL::SessionID);
 
     ProcessThrottler& throttler() { return m_throttler; }
     void updateProcessAssertion();

Modified: trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.messages.in (254705 => 254706)


--- trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.messages.in	2020-01-16 21:31:59 UTC (rev 254705)
+++ trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.messages.in	2020-01-16 21:45:50 UTC (rev 254706)
@@ -30,6 +30,7 @@
     DidSyncAllCookies()
 
     TestProcessIncomingSyncMessagesWhenWaitingForSyncReply(WebKit::WebPageProxyIdentifier pageID) -> (bool handled) Synchronous
+    TerminateUnresponsiveServiceWorkerProcesses(WebCore::RegistrableDomain domain, PAL::SessionID sessionId)
 
     SetIsHoldingLockedFiles(bool isHoldingLockedFiles)
 

Modified: trunk/Source/WebKit/UIProcess/WebProcessPool.cpp (254705 => 254706)


--- trunk/Source/WebKit/UIProcess/WebProcessPool.cpp	2020-01-16 21:31:59 UTC (rev 254705)
+++ trunk/Source/WebKit/UIProcess/WebProcessPool.cpp	2020-01-16 21:45:50 UTC (rev 254706)
@@ -1783,6 +1783,17 @@
 #endif
 }
 
+void WebProcessPool::terminateServiceWorkerProcess(const WebCore::RegistrableDomain& domain, const PAL::SessionID& sessionID)
+{
+#if ENABLE(SERVICE_WORKER)
+    auto protectedThis = makeRef(*this);
+    if (auto process = m_serviceWorkerProcesses.get({ domain, sessionID })) {
+        process->disableServiceWorkers();
+        process->requestTermination(ProcessTerminationReason::ExceededCPULimit);
+    }
+#endif
+}
+
 void WebProcessPool::syncNetworkProcessCookies()
 {
     ensureNetworkProcess().syncAllCookies();

Modified: trunk/Source/WebKit/UIProcess/WebProcessPool.h (254705 => 254706)


--- trunk/Source/WebKit/UIProcess/WebProcessPool.h	2020-01-16 21:31:59 UTC (rev 254705)
+++ trunk/Source/WebKit/UIProcess/WebProcessPool.h	2020-01-16 21:45:50 UTC (rev 254706)
@@ -326,6 +326,7 @@
     void sendNetworkProcessWillSuspendImminentlyForTesting();
     void sendNetworkProcessDidResume();
     void terminateServiceWorkers();
+    void terminateServiceWorkerProcess(const WebCore::RegistrableDomain&, const PAL::SessionID&);
 
     void syncNetworkProcessCookies();
     void syncLocalStorage(CompletionHandler<void()>&& callback);
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to