readwrite_data: loop less

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
This commit is contained in:
Daniel Stenberg 2023-12-11 19:36:27 +01:00
parent 8706b68010
commit 1da640abb6
No known key found for this signature in database
GPG Key ID: 5CC908FDB71E12C2

View File

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