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

Anatol Pomozov anatol.pomozov at gmail.com
Fri Mar 6 04:56:29 UTC 2020


Hi

On Thu, Mar 5, 2020 at 5:14 AM Allan McRae <allan at archlinux.org> wrote:
>
> On 5/3/20 6:38 am, Anatol Pomozov 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*::
>
> *ConcurrentDownloadStreams =* 5
>
> I'd prefer just "ParallelDownloads" or "ConcurrentDownloads"  Streams is
> technical terminology.

Sure, I reverted the option name back to ParallelDownloads.

>
> > +     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.
> > +
>
> I need to think of whether that is a sane implementation for this
> setting being 0.
>
> Clafiy that when unset, downloads proceed one at a time.

Ok, if the option is not set then the struct field is initialized with
1 (download stream).

>
> >
> >  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
>
> OK
>
> > 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);
>
> Can you document this function.

Done.

>
> >
> >  /** @} */
> >
> > 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;
> > +}
>
> OK.
>
> > \ 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 */
>
> Get rid of the  "0 - no limit" comment.  The range is defined by the
> type, and it does not include "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;
>
> So...  unsetting the variable in pacman.conf does not turn off the
> feature.  That would be unexpected.
>
> Default should 1.  If you allow the varaible to be specified without a
> number, then that could default to 5.

Ok I set the field default to 1. And moved "5" as a default to
pacman.conf. If the option is not set in pacman.conf then value "1" is
used.

>
> >
> >       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);
>
> Follow the example in "man strtol", though you need to check for a
> positive number.  And potential overflow?  Probably best to dump that to
> a utility function.

Done.

>
> Again... are you having the ability to specify "ConcurrentDownload..."
> in pacman.conf without a value?
>
> >               } 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);
> >
>
> OK.
>
> >       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;
>
> When the variable name is exactly the comment, you probably don't need
> the comment!  Again, "no limit" is not right.
>
> >       /* select -Sc behavior */
> >       unsigned short cleanmethod;
> >       alpm_list_t *holdpkg;


Patch V2 has been sent to the maillist. PTAL.


More information about the pacman-dev mailing list