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

Anatol Pomozov anatol.pomozov at gmail.com
Mon Apr 19 16:10:34 UTC 2021


Hi

On Sun, Apr 18, 2021, 12:32 morganamilo <morganamilo at archlinux.org> 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.
>

Thanks for tracking down this bug. I wonder if it is the same issue that
was reported a while ago ("UI is broken with slow downloads").

>
> 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;
> +
> +       if(payload->allow_resume) {
> +               payload->initial_size = payload->prevprogress;
> +       }
> +
> +
>         /* Set curl with the new URL */
>         curl_easy_setopt(curl, CURLOPT_URL, payload->fileurl);
>
> diff --git a/lib/libalpm/dload.h b/lib/libalpm/dload.h
> index 8f3d17b4..abfd9466 100644
> --- a/lib/libalpm/dload.h
> +++ b/lib/libalpm/dload.h
> @@ -42,6 +42,7 @@ struct dload_payload {
>         off_t initial_size;
>         off_t max_size;
>         off_t prevprogress;
> +       off_t resetprogress; /* progress made before we try a new server */
>         int force;
>         int allow_resume;
>         int errors_ok;
> --
> 2.31.1
>


More information about the pacman-dev mailing list