Skip to content

Commit

Permalink
readwrite_data: loop less
Browse files Browse the repository at this point in the history
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
  • Loading branch information
bagder committed Dec 14, 2023
1 parent 8706b68 commit 1da640a
Showing 1 changed file with 2 additions and 3 deletions.
5 changes: 2 additions & 3 deletions lib/transfer.c
Expand Up @@ -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);
Expand Down

0 comments on commit 1da640a

Please sign in to comment.