Title: [279864] trunk/Source/WebCore
Revision
279864
Author
[email protected]
Date
2021-07-12 21:39:26 -0700 (Mon, 12 Jul 2021)

Log Message

[curl] Can't finish loading some websites after r271946 started throttling low priority resources
https://bugs.webkit.org/show_bug.cgi?id=227863

Reviewed by Don Olmstead.

NetworkLoadScheduler started throttling low priority resource
loading since r271946. It uses curl_easy_pause to pause the
resource loads. CURLMOPT_MAX_HOST_CONNECTIONS is set to 6 to limit
the number of connections per host. In the certain condition,
curl_multi_fdset can constantly return -1 if 6 handles of the same
host are paused.

This patch changes CurlRequest::start not to actually start the
job if it is suspended.

* platform/network/curl/CurlRequest.cpp:
(WebCore::CurlRequest::start):
(WebCore::CurlRequest::suspend):
(WebCore::CurlRequest::resume):
(WebCore::CurlRequest::setupTransfer):
(WebCore::CurlRequest::setRequestPaused):
* platform/network/curl/CurlRequest.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (279863 => 279864)


--- trunk/Source/WebCore/ChangeLog	2021-07-13 02:05:38 UTC (rev 279863)
+++ trunk/Source/WebCore/ChangeLog	2021-07-13 04:39:26 UTC (rev 279864)
@@ -1,3 +1,28 @@
+2021-07-12  Fujii Hironori  <[email protected]>
+
+        [curl] Can't finish loading some websites after r271946 started throttling low priority resources
+        https://bugs.webkit.org/show_bug.cgi?id=227863
+
+        Reviewed by Don Olmstead.
+
+        NetworkLoadScheduler started throttling low priority resource
+        loading since r271946. It uses curl_easy_pause to pause the
+        resource loads. CURLMOPT_MAX_HOST_CONNECTIONS is set to 6 to limit
+        the number of connections per host. In the certain condition,
+        curl_multi_fdset can constantly return -1 if 6 handles of the same
+        host are paused.
+
+        This patch changes CurlRequest::start not to actually start the
+        job if it is suspended.
+
+        * platform/network/curl/CurlRequest.cpp:
+        (WebCore::CurlRequest::start):
+        (WebCore::CurlRequest::suspend):
+        (WebCore::CurlRequest::resume):
+        (WebCore::CurlRequest::setupTransfer):
+        (WebCore::CurlRequest::setRequestPaused):
+        * platform/network/curl/CurlRequest.h:
+
 2021-07-12  Tim Horton  <[email protected]>
 
         BifurcatedGraphicsContext can't draw text

Modified: trunk/Source/WebCore/platform/network/curl/CurlRequest.cpp (279863 => 279864)


--- trunk/Source/WebCore/platform/network/curl/CurlRequest.cpp	2021-07-13 02:05:38 UTC (rev 279863)
+++ trunk/Source/WebCore/platform/network/curl/CurlRequest.cpp	2021-07-13 04:39:26 UTC (rev 279864)
@@ -46,7 +46,7 @@
     : m_client(client)
     , m_messageQueue(WTFMove(messageQueue))
     , m_request(request.isolatedCopy())
-    , m_shouldSuspend(shouldSuspend == ShouldSuspend::Yes)
+    , m_startState(shouldSuspend == ShouldSuspend::Yes ? StartState::StartSuspended : StartState::WaitingForStart)
     , m_enableMultipart(enableMultipart == EnableMultipart::Yes)
     , m_formDataStream(m_request.httpBody())
     , m_captureExtraMetrics(captureExtraMetrics == CaptureNetworkLoadMetrics::Extended)
@@ -110,6 +110,16 @@
 
     ASSERT(isMainThread());
 
+    switch (m_startState) {
+    case StartState::DidStart:
+        ASSERT(false);
+        [[fallthrough]];
+    case StartState::StartSuspended:
+        return;
+    }
+
+    m_startState = StartState::DidStart;
+
     if (m_request.url().isLocalFile())
         invokeDidReceiveResponseForFile(m_request.url());
     else
@@ -141,7 +151,7 @@
         runOnWorkerThreadIfRequired([this, protectedThis = makeRef(*this)]() {
             didCancelTransfer();
         });
-    } else
+    } else if (m_startState == StartState::DidStart)
         scheduler.cancel(this);
 
     invalidateClient();
@@ -163,7 +173,17 @@
 {
     ASSERT(isMainThread());
 
-    setRequestPaused(true);
+    switch (m_startState) {
+    case StartState::StartSuspended:
+        ASSERT(false);
+        [[fallthrough]];
+    case StartState::WaitingForStart:
+        m_startState = StartState::StartSuspended;
+        break;
+    case StartState::DidStart:
+        setRequestPaused(true);
+        break;
+    }
 }
 
 void CurlRequest::resume()
@@ -170,7 +190,18 @@
 {
     ASSERT(isMainThread());
 
-    setRequestPaused(false);
+    switch (m_startState) {
+    case StartState::WaitingForStart:
+        ASSERT(false);
+        [[fallthrough]];
+    case StartState::StartSuspended:
+        m_startState = StartState::WaitingForStart;
+        start();
+        break;
+    case StartState::DidStart:
+        setRequestPaused(false);
+        break;
+    }
 }
 
 /* `this` is protected inside this method. */
@@ -238,9 +269,6 @@
 
     m_curlHandle->setTimeout(timeoutInterval());
 
-    if (m_shouldSuspend)
-        setRequestPaused(true);
-
     m_performStartTime = MonotonicTime::now();
 
     return m_curlHandle->handle();
@@ -643,7 +671,7 @@
         Locker locker { m_pauseStateMutex };
 
         auto savedState = shouldBePaused();
-        m_shouldSuspend = m_isPausedOfRequest = paused;
+        m_isPausedOfRequest = paused;
         if (shouldBePaused() == savedState)
             return;
     }

Modified: trunk/Source/WebCore/platform/network/curl/CurlRequest.h (279863 => 279864)


--- trunk/Source/WebCore/platform/network/curl/CurlRequest.h	2021-07-13 02:05:38 UTC (rev 279863)
+++ trunk/Source/WebCore/platform/network/curl/CurlRequest.h	2021-07-13 04:39:26 UTC (rev 279864)
@@ -175,9 +175,11 @@
     String m_password;
     unsigned long m_authType { CURLAUTH_ANY };
     bool m_shouldDisableServerTrustEvaluation { false };
-    bool m_shouldSuspend { false };
     bool m_enableMultipart { false };
 
+    enum class StartState : uint8_t { StartSuspended, WaitingForStart, DidStart };
+    StartState m_startState;
+    
     std::unique_ptr<CurlHandle> m_curlHandle;
     CurlFormDataStream m_formDataStream;
     std::unique_ptr<CurlMultipartHandle> m_multipartHandle;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to