]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
readwrite_data: loop less
authorDaniel Stenberg <daniel@haxx.se>
Mon, 11 Dec 2023 18:36:27 +0000 (19:36 +0100)
committerDaniel Stenberg <daniel@haxx.se>
Thu, 14 Dec 2023 15:13:28 +0000 (16:13 +0100)
This function is made to loop in order to drain incoming data
faster. Completely removing the loop has a measerably negative impact on
transfer speeds.

Downsides with the looping include

- it might call the progress callback much more seldom. Especially if
  the write callback is slow.

- rate limiting becomes less exact

- a single transfer might "starve out" other parallel transfers

- QUIC timers for other connections can't be maintained correctly

The long term fix should be to remove the loop and optimize coming back
to avoid the transfer speed penalty.

This fix lower the max loop count to reduce the starvation problem, and
avoids the loop completely for when rate-limiting is in progress.

Ref: #12488
Ref: https://curl.se/mail/lib-2023-12/0012.html
Closes #12504

lib/transfer.c

index d92b7edd41dcceb7c19d2a06510b1c708f301620..3afefd4dfc151a13c0adb2368e29e8649bee65a6 100644 (file)
@@ -427,9 +427,8 @@ static CURLcode readwrite_data(struct Curl_easy *data,
   char *buf;
   size_t blen;
   size_t consumed;
-  int maxloops = 100;
-  curl_off_t max_recv = data->set.max_recv_speed?
-                        data->set.max_recv_speed : CURL_OFF_T_MAX;
+  int maxloops = 10;
+  curl_off_t max_recv = data->set.max_recv_speed ? 0 : CURL_OFF_T_MAX;
   bool data_eof_handled = FALSE;
 
   DEBUGASSERT(data->state.buffer);