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