[pacman-dev] [PATCH] alpm: Fix wrong xferred/total sizes when resuming downloads

Olivier Brunel jjk at jjacky.com
Thu Jul 31 19:28:54 EDT 2014

On 08/01/14 01:24, Allan McRae wrote:
> On 01/08/14 03:42, Olivier Brunel wrote:
>> When a package is already partially downloaded in the cache, its download
>> size will only be of what's left to be downloaded. Since pkg->download_size
>> is what's used when calculating the total download size for the totaldl
>> callback, same thing apply.
>> However, the download progress callback was including this initial size,
>> which would thus lead to invalid values (and percentage) used in frontends.
>> That is, the progress bar could e.g. go further than 100%
>> In the case of pacman, there is a sanity check for different historical
>> reason (44a57c89), so before the possible "overflow" was noticed, the total
>> download size/progress reported was wrong. Once caught, the TotalDownload
>> option was ignored and it would use individual file download values as
>> fallback instead.
> Can I clarify that this issue on more than 100% being "shown" only
> applied to TotalDownload?

Absolutely; without TotalDownload there was no going over 100% or
anything like that.

(Just as mentioned below the fact that the size & progress bar wouldn't
be related to the download size but the package size, but nothing
actually incorrect.)

>> Signed-off-by: Olivier Brunel <jjk at jjacky.com>
>> ---
>> Including the initial size during the dl progress cb was added in 283bf7e8,
>> which clearly states the goal of having the progress bar bumped when resuming a
>> download.
>> I'm not sure if this is really the best thing to do anyway though, since the
>> download size announced by pacman prior is that of what's left to be downloaded
>> only, but the progress bar is then of the package size instead, which is a bit
>> wrong/misleading, not to mention totally bogus when it comes to TotalDownload,
>> since the package size might be greater than the actual total download size.
>> With this fix, the progress bar will simply go from 0% to 100% and only refer to
>> the download size, and everything remains correct with TotalDownload.
>>  lib/libalpm/dload.c | 4 +++-
>>  1 file changed, 3 insertions(+), 1 deletion(-)
>> diff --git a/lib/libalpm/dload.c b/lib/libalpm/dload.c
>> index 88ea427..3e72bd4 100644
>> --- a/lib/libalpm/dload.c
>> +++ b/lib/libalpm/dload.c
>> @@ -131,7 +131,9 @@ static int dload_progress_cb(void *file, double dltotal, double dlnow,
>>  		payload->handle->dlcb(payload->remote_name, 0, (off_t)dltotal);
>>  	}
>> -	payload->handle->dlcb(payload->remote_name, current_size, total_size);
>> +	/* do NOT include initial_size since it wasn't part of the package's
>> +	 * download_size (nor included in the total download size callback) */
>> +	payload->handle->dlcb(payload->remote_name, (off_t)dlnow, (off_t)dltotal);
>>  	payload->prevprogress = current_size;

More information about the pacman-dev mailing list