[pacman-dev] [PATCH 1/2] Add config option to specify amount of concurrent download streams

Anatol Pomozov anatol.pomozov at gmail.com
Wed Mar 4 21:29:04 UTC 2020


On Wed, Mar 4, 2020 at 12:39 PM Anatol Pomozov <anatol.pomozov at gmail.com> wrote:
>
> It includes pacman.conf new 'ConcurrentDownloadStreams' option that
> specifies how many concurrent downloads curl starts in parallel.
>
> The value is set to '5' by default. Setting it to '0' removes upper
> limit on number of concurrent downloads.
>
> Add alpm_option_set_concurrent_download_streams() ALPM function that
> allows to set this config option programmatically.
>
> Signed-off-by: Anatol Pomozov <anatol.pomozov at gmail.com>
> ---
>  doc/pacman.conf.5.asciidoc |  5 +++++
>  etc/pacman.conf.in         |  1 +
>  lib/libalpm/alpm.h         |  1 +
>  lib/libalpm/handle.c       | 12 ++++++++++++
>  lib/libalpm/handle.h       |  1 +
>  src/pacman/conf.c          |  6 ++++++
>  src/pacman/conf.h          |  2 ++
>  7 files changed, 28 insertions(+)
>
> diff --git a/doc/pacman.conf.5.asciidoc b/doc/pacman.conf.5.asciidoc
> index b297e332..fb00ad18 100644
> --- a/doc/pacman.conf.5.asciidoc
> +++ b/doc/pacman.conf.5.asciidoc
> @@ -205,6 +205,11 @@ Options
>         Disable defaults for low speed limit and timeout on downloads. Use this
>         if you have issues downloading files with proxy and/or security gateway.
>
> +*ConcurrentDownloadStreams*::
> +       Specifies number of concurrent download streams. This value is set to 5
> +       by default. Setting this value to 0 removes upper limit of concurrent
> +       streams i.e. all files start downloading in parallel.
> +
>
>  Repository Sections
>  -------------------
> diff --git a/etc/pacman.conf.in b/etc/pacman.conf.in
> index 7446944f..0a857ef2 100644
> --- a/etc/pacman.conf.in
> +++ b/etc/pacman.conf.in
> @@ -34,6 +34,7 @@ Architecture = auto
>  #TotalDownload
>  CheckSpace
>  #VerbosePkgLists
> +#ConcurrentDownloadStreams = 5
>
>  # PGP signature checking
>  #SigLevel = Optional
> diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h
> index c2a069ad..1e488847 100644
> --- a/lib/libalpm/alpm.h
> +++ b/lib/libalpm/alpm.h
> @@ -902,6 +902,7 @@ int alpm_option_get_remote_file_siglevel(alpm_handle_t *handle);
>  int alpm_option_set_remote_file_siglevel(alpm_handle_t *handle, int level);
>
>  int alpm_option_set_disable_dl_timeout(alpm_handle_t *handle, unsigned short disable_dl_timeout);
> +int alpm_option_set_concurrent_download_streams(alpm_handle_t *handle, unsigned int streams_num);
>
>  /** @} */
>
> diff --git a/lib/libalpm/handle.c b/lib/libalpm/handle.c
> index fc7c1faf..a74086d9 100644
> --- a/lib/libalpm/handle.c
> +++ b/lib/libalpm/handle.c
> @@ -856,3 +856,15 @@ int SYMEXPORT alpm_option_set_disable_dl_timeout(alpm_handle_t *handle,
>  #endif
>         return 0;
>  }
> +
> +int SYMEXPORT alpm_option_set_concurrent_download_streams(alpm_handle_t *handle,
> +               unsigned int streams_num)
> +{
> +       CHECK_HANDLE(handle, return -1);
> +#ifdef HAVE_LIBCURL
> +       handle->concurrent_download_streams = streams_num;
> +#else
> +       (void)streams_num; /* silence unused variable warnings */
> +#endif
> +       return 0;
> +}
> \ No newline at end of file
> diff --git a/lib/libalpm/handle.h b/lib/libalpm/handle.h
> index c343f6e0..d6fe435c 100644
> --- a/lib/libalpm/handle.h
> +++ b/lib/libalpm/handle.h
> @@ -61,6 +61,7 @@ struct __alpm_handle_t {
>         /* libcurl handle */
>         CURL *curl;             /* reusable curl_easy handle */
>         unsigned short disable_dl_timeout;
> +       unsigned int concurrent_download_streams; /* Number of parallel downloads, 0 - no limit */
>  #endif
>
>  #ifdef HAVE_LIBGPGME
> diff --git a/src/pacman/conf.c b/src/pacman/conf.c
> index f9de386f..1b224eb6 100644
> --- a/src/pacman/conf.c
> +++ b/src/pacman/conf.c
> @@ -110,6 +110,8 @@ config_t *config_new(void)
>                 newconfig->localfilesiglevel = ALPM_SIG_USE_DEFAULT;
>                 newconfig->remotefilesiglevel = ALPM_SIG_USE_DEFAULT;
>         }
> +       /* By default use 5 concurrent download streams */
> +       newconfig->concurrent_download_streams = 5;
>
>         newconfig->colstr.colon   = ":: ";
>         newconfig->colstr.title   = "";
> @@ -677,6 +679,9 @@ static int _parse_options(const char *key, char *value,
>                                 return 1;
>                         }
>                         FREELIST(values);
> +               } else if(strcmp(key, "ConcurrentDownloadStreams") == 0) {
> +                       /* TODO: what is the best way to handle int conversion errors? */
> +                       config->concurrent_download_streams = atoi(value);

Here is a question I have. What is the best way to handle int
conversion errors for this option?

>                 } else {
>                         pm_printf(ALPM_LOG_WARNING,
>                                         _("config file %s, line %d: directive '%s' in section '%s' not recognized.\n"),
> @@ -845,6 +850,7 @@ static int setup_libalpm(void)
>         alpm_option_set_noextracts(handle, config->noextract);
>
>         alpm_option_set_disable_dl_timeout(handle, config->disable_dl_timeout);
> +       alpm_option_set_concurrent_download_streams(handle, config->concurrent_download_streams);
>
>         for(i = config->assumeinstalled; i; i = i->next) {
>                 char *entry = i->data;
> diff --git a/src/pacman/conf.h b/src/pacman/conf.h
> index d954e637..33773efd 100644
> --- a/src/pacman/conf.h
> +++ b/src/pacman/conf.h
> @@ -115,6 +115,8 @@ typedef struct __config_t {
>         /* When downloading, display the amount downloaded, rate, ETA, and percent
>          * downloaded of the total download list */
>         unsigned short totaldownload;
> +       /* Number of concurrent download streams, 0 - no limit */
> +       unsigned int concurrent_download_streams;
>         /* select -Sc behavior */
>         unsigned short cleanmethod;
>         alpm_list_t *holdpkg;
> --
> 2.25.1
>


More information about the pacman-dev mailing list