[pacman-dev] [PATCH] libalpm: download rates becoming negative

Andrew Gregory andrew.gregory.8 at gmail.com
Mon Apr 19 12:06:26 UTC 2021


On 04/19/21 at 10:26am, Morgan Adamiec wrote:
> 
> 
> On 19/04/2021 05:53, Andrew Gregory wrote:
> > On 04/18/21 at 11:31pm, morganamilo wrote:
> >> When a download fails on one mirror a new download is started on the
> >> next mirror. This new download will have the initial size of whatever
> >> has been downloaded so far, as well as the ammount downloaded reset to
> >> 0.
> >>
> >> To account for this, when a download changes mirror, save how much has
> >> been downloaded so far and add that to dlcb calls.
> >> ---
> >>  lib/libalpm/dload.c | 14 ++++++++++++--
> >>  lib/libalpm/dload.h |  1 +
> >>  2 files changed, 13 insertions(+), 2 deletions(-)
> >>
> >> diff --git a/lib/libalpm/dload.c b/lib/libalpm/dload.c
> >> index a4c42f8d..27a7748a 100644
> >> --- a/lib/libalpm/dload.c
> >> +++ b/lib/libalpm/dload.c
> >> @@ -207,8 +207,8 @@ static int dload_progress_cb(void *file, curl_off_t dltotal, curl_off_t dlnow,
> >>  
> >>  	/* do NOT include initial_size since it wasn't part of the package's
> >>  	 * download_size (nor included in the total download size callback) */
> >> -	cb_data.total = dltotal;
> >> -	cb_data.downloaded = dlnow;
> >> +	cb_data.total = dltotal + payload->resetprogress;
> >> +	cb_data.downloaded = dlnow + payload->resetprogress;
> >>  	payload->handle->dlcb(payload->remote_name, ALPM_DOWNLOAD_PROGRESS, &cb_data);
> >>  	payload->prevprogress = current_size;
> >>  
> >> @@ -440,6 +440,16 @@ static int curl_retry_next_server(CURLM *curlm, CURL *curl, struct dload_payload
> >>  		fseek(payload->localf, 0, SEEK_SET);
> >>  	}
> >>  
> >> +
> >> +	/* reset progress for next server */
> >> +	payload->resetprogress += payload->prevprogress - payload->initial_size;
> >> +	payload->unlink_on_fail = 0;
> > 
> > Without looking at the rest of the patch, how does this line not just
> > straight up break unlink_on_fail functionality for any download that
> > falls back to another server?
> > 
> 
> Honestly don't really know. I was using
> e83e868a77865d42a33076605f9a90a165f7c93a as a base and it was done there.
> 
> I guess the point is that curl_check_finished_download() will set
> unlink_on_fail = 1 in most situations, so we reset it to 0 on retry
> knowing it may then be set to 1 again on the next check_finished.
> 
> Though I guess this breaks tempfile downloads which should always be
> unlink_on_fail = 1.
> 
> 
> Also looking at the code above:
> 
> if(payload->unlink_on_fail) {
> 	/* we keep the file for a new retry but remove its data 	if any */
> 	fflush(payload->localf);
> 	if(ftruncate(fileno(payload->localf), 0)) {
> 		RET_ERR(handle, ALPM_ERR_SYSTEM, -1);
> 	}
> 	fseek(payload->localf, 0, SEEK_SET);
> }
> 
> I don't see why we'd want to wipe the file instead of trying to resume.

Because the file may not be the same after we fallback to a different
server.

> In fact I don't see the point of this variable at all. Why would we ever
> not want to unlink on fail?

So that it can be resumed later.


More information about the pacman-dev mailing list