[pacman-dev] [PATCH] pacman: add option --max-recv-speed
Dave Reisner
d at falconindy.com
Sat Sep 7 17:36:31 EDT 2013
On Sat, Sep 07, 2013 at 10:29:31PM +0100, Sami Kerola wrote:
> My dad was watching internet connected television, while I decided to
> check fixes for Arch. There were new kernel, some libreoffice stuff, and
> so on making the download to be more than few megabytes. When I
> downloaded the packages television sound track was affected annoying way.
> Obviosly my download was affecting a stream that had greater service
> quality expectancy. This patch will allow an user to polite and throttle
> down bandwidth usage in benefit for others.
>
> Signed-off-by: Sami Kerola <kerolasa at iki.fi>
> ---
I've been extremely hesistant to accept patches that tune the downloader
-- it really ought to be an invisible thing that "just works". If you
really need this functionality, I'd suggest using XferCommand in
/etc/pacman.conf.
> doc/pacman.8.txt | 5 +++++
> lib/libalpm/alpm.h | 5 +++++
> lib/libalpm/dload.c | 4 ++++
> lib/libalpm/handle.c | 13 +++++++++++++
> lib/libalpm/handle.h | 1 +
> src/pacman/conf.c | 1 +
> src/pacman/conf.h | 2 ++
> src/pacman/pacman.c | 6 ++++++
> 8 files changed, 37 insertions(+)
>
> diff --git a/doc/pacman.8.txt b/doc/pacman.8.txt
> index 574995c..da8fa1b 100644
> --- a/doc/pacman.8.txt
> +++ b/doc/pacman.8.txt
> @@ -362,6 +362,11 @@ Sync Options[[SO]]
> packages that are no longer installed; use two to remove all files
> from the cache. In both cases, you will have a yes or no option to
> remove packages and/or unused downloaded databases.
> +
> +*\--max-recv-speed* <bits>::
> + Define maximum transfer rate in bits per seconds. This option is
> + useful when network bandwidth is scarce resource, and other users
> + of the network has greater service expecations.
One might argue that QoS on a network device is a far better mechanism
for dictating this rather than hoping that clients tune it on their own.
> +
> If you use a network shared cache, see the 'CleanMethod' option in
> linkman:pacman.conf[5].
> diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h
> index b049007..bc77641 100644
> --- a/lib/libalpm/alpm.h
> +++ b/lib/libalpm/alpm.h
> @@ -533,6 +533,11 @@ int alpm_option_get_usesyslog(alpm_handle_t *handle);
> /** Sets whether to use syslog (0 is FALSE, TRUE otherwise). */
> int alpm_option_set_usesyslog(alpm_handle_t *handle, int usesyslog);
>
> +/** Returns maximum download receive speed. */
> +int alpm_option_get_max_recv_speed(alpm_handle_t *handle);
> +/** Sets maximum download receive speed. */
> +int alpm_option_set_max_recv_speed(alpm_handle_t *handle, int rate);
> +
> /** @name Accessors to the list of no-upgrade files.
> * These functions modify the list of files which should
> * not be updated by package installation.
> diff --git a/lib/libalpm/dload.c b/lib/libalpm/dload.c
> index 8537b3d..25f2423 100644
> --- a/lib/libalpm/dload.c
> +++ b/lib/libalpm/dload.c
> @@ -331,6 +331,10 @@ static void curl_set_handle_opts(struct dload_payload *payload,
> (intmax_t)st.st_size);
> payload->initial_size = st.st_size;
> }
> +
> + if(payload->handle->max_recv_speed) {
> + curl_easy_setopt(curl, CURLOPT_MAX_RECV_SPEED_LARGE, payload->handle->max_recv_speed);
> + }
> }
>
> static void mask_signal(int signum, void (*handler)(int),
> diff --git a/lib/libalpm/handle.c b/lib/libalpm/handle.c
> index 53c86c5..b061efd 100644
> --- a/lib/libalpm/handle.c
> +++ b/lib/libalpm/handle.c
> @@ -181,6 +181,12 @@ alpm_cb_progress SYMEXPORT alpm_option_get_progresscb(alpm_handle_t *handle)
> return handle->progresscb;
> }
>
> +int SYMEXPORT alpm_option_get_max_recv_speed(alpm_handle_t *handle)
> +{
> + CHECK_HANDLE(handle, return -1);
> + return handle->max_recv_speed;
> +}
> +
> const char SYMEXPORT *alpm_option_get_root(alpm_handle_t *handle)
> {
> CHECK_HANDLE(handle, return NULL);
> @@ -314,6 +320,13 @@ int SYMEXPORT alpm_option_set_progresscb(alpm_handle_t *handle, alpm_cb_progress
> return 0;
> }
>
> +int SYMEXPORT alpm_option_set_max_recv_speed(alpm_handle_t *handle, int rate)
> +{
> + CHECK_HANDLE(handle, return -1);
> + handle->max_recv_speed = rate;
> + return 0;
> +}
> +
> static char *canonicalize_path(const char *path)
> {
> char *new_path;
> diff --git a/lib/libalpm/handle.h b/lib/libalpm/handle.h
> index 5e84d58..f5b4baf 100644
> --- a/lib/libalpm/handle.h
> +++ b/lib/libalpm/handle.h
> @@ -90,6 +90,7 @@ struct __alpm_handle_t {
> char *arch; /* Architecture of packages we should allow */
> double deltaratio; /* Download deltas if possible; a ratio value */
> int usesyslog; /* Use syslog instead of logfile? */ /* TODO move to frontend */
> + int max_recv_speed; /* Maximum download receive speed. */
> int checkspace; /* Check disk space before installing */
> alpm_siglevel_t siglevel; /* Default signature verification level */
> alpm_siglevel_t localfilesiglevel; /* Signature verification level for local file
> diff --git a/src/pacman/conf.c b/src/pacman/conf.c
> index cd357ab..e6112f1 100644
> --- a/src/pacman/conf.c
> +++ b/src/pacman/conf.c
> @@ -682,6 +682,7 @@ static int setup_libalpm(void)
> alpm_option_set_eventcb(handle, cb_event);
> alpm_option_set_questioncb(handle, cb_question);
> alpm_option_set_progresscb(handle, cb_progress);
> + alpm_option_set_max_recv_speed(handle, config->max_recv_speed);
>
> config->logfile = config->logfile ? config->logfile : strdup(LOGFILE);
> ret = alpm_option_set_logfile(handle, config->logfile);
> diff --git a/src/pacman/conf.h b/src/pacman/conf.h
> index dcd3204..30ccd60 100644
> --- a/src/pacman/conf.h
> +++ b/src/pacman/conf.h
> @@ -47,6 +47,7 @@ typedef struct __config_t {
> unsigned short checkspace;
> unsigned short usesyslog;
> unsigned short color;
> + unsigned int max_recv_speed;
> double deltaratio;
> char *arch;
> char *print_format;
> @@ -143,6 +144,7 @@ enum {
> OP_ASEXPLICIT,
> OP_ARCH,
> OP_PRINTFORMAT,
> + OP_MAXRECVSPEED,
> OP_GPGDIR,
> OP_DBONLY,
> OP_FORCE,
> diff --git a/src/pacman/pacman.c b/src/pacman/pacman.c
> index 24fd57f..c1c6705 100644
> --- a/src/pacman/pacman.c
> +++ b/src/pacman/pacman.c
> @@ -177,6 +177,7 @@ static void usage(int op, const char * const myname)
> addlist(_(" --force force install, overwrite conflicting files\n"));
> addlist(_(" --asdeps install packages as non-explicitly installed\n"));
> addlist(_(" --asexplicit install packages as explicitly installed\n"));
> + addlist(_(" --max-recv-speed <bits> limit download speed to bits per second (libcurl)\n"));
> addlist(_(" --ignore <pkg> ignore a package upgrade (can be used more than once)\n"));
> addlist(_(" --ignoregroup <grp>\n"
> " ignore a group upgrade (can be used more than once)\n"));
> @@ -510,6 +511,10 @@ static int parsearg_trans(int opt)
> check_optarg();
> config->print_format = strdup(optarg);
> break;
> + case OP_MAXRECVSPEED:
> + check_optarg();
> + config->max_recv_speed = (unsigned int)atoi(optarg);
> + break;
> default: return 1;
> }
> return 0;
> @@ -645,6 +650,7 @@ static int parseargs(int argc, char *argv[])
> {"asexplicit", no_argument, 0, OP_ASEXPLICIT},
> {"arch", required_argument, 0, OP_ARCH},
> {"print-format", required_argument, 0, OP_PRINTFORMAT},
> + {"max-recv-speed", required_argument, 0, OP_MAXRECVSPEED},
> {"gpgdir", required_argument, 0, OP_GPGDIR},
> {"dbonly", no_argument, 0, OP_DBONLY},
> {"color", required_argument, 0, OP_COLOR},
> --
> 1.8.4
>
>
More information about the pacman-dev
mailing list