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

Allan McRae allan at archlinux.org
Thu Jul 31 19:24:18 EDT 2014

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?

> 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