[pacman-dev] [PATCH] Introduce event types for start/end database list download

Allan McRae allan at archlinux.org
Wed Apr 29 01:30:51 UTC 2020


On 17/4/20 12:31 pm, Anatol Pomozov wrote:
> Multiplexed database/files downloads will use multiple progress bars.
> The UI logic is quite complicated and printing error messages while
> handling multiple progress bars is going to be challenging.
> 
> Instead we are going to save all ALPM error messages to a list and flush
> it at the end of the download process. Use on_progress variable that
> blocks error messages printing.
> 

This is going to be fun... If you have a 100 package update and your
first mirror is down, you will end up with 100 error messages at the
end.  e.g.

$ sudo ./build/pacman -Sy
:: Synchronizing package databases...
 testing                45.4 KiB  24.5 KiB/s 00:02 [##############] 100%
 core                  134.6 KiB  61.8 KiB/s 00:02 [##############] 100%
 extra                1646.0 KiB   741 KiB/s 00:02 [##############] 100%
 community-testing     621.3 KiB   468 KiB/s 00:01 [##############] 100%
 community               4.9 MiB  2.12 MiB/s 00:02 [##############] 100%
error: failed retrieving file 'extra.db' from allanmcrae.com : The
requested URL returned error: 404
error: failed retrieving file 'testing.db' from allanmcrae.com : The
requested URL returned error: 404
error: failed retrieving file 'core.db' from allanmcrae.com : The
requested URL returned error: 404
error: failed retrieving file 'community-testing.db' from allanmcrae.com
: The requested URL returned error: 404
error: failed retrieving file 'community.db' from allanmcrae.com : The
requested URL returned error: 404

This is patch is fine, but we should perhaps change the output to count
the failures from each server.

Also, it is not an error to fail retrieving a package or database if you
get if from the next server.  So this could be changed to a warning.

e.g.
warning: failed retrieving 5 files from allanmcrae.com

This is nothing directly to do with this patch - just something we need
to tidy.


> Signed-off-by: Anatol Pomozov <anatol.pomozov at gmail.com>
> ---
>  lib/libalpm/alpm.h    |  6 ++++++
>  lib/libalpm/be_sync.c |  7 +++++++
>  src/pacman/callback.c | 13 +++++++++++--
>  3 files changed, 24 insertions(+), 2 deletions(-)
> 
> diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h
> index 2cf20343..aee5aa0d 100644
> --- a/lib/libalpm/alpm.h
> +++ b/lib/libalpm/alpm.h
> @@ -403,6 +403,12 @@ typedef enum _alpm_event_type_t {
>  	 * arguments. */
>  	ALPM_EVENT_SCRIPTLET_INFO,
>  	/** Files will be downloaded from a repository. */

/** Database files will be....

> +	ALPM_EVENT_DB_RETRIEVE_START,
> +	/** Files were downloaded from a repository. */
> +	ALPM_EVENT_DB_RETRIEVE_DONE,
> +	/** Not all files were successfully downloaded from a repository. */
> +	ALPM_EVENT_DB_RETRIEVE_FAILED,
> +	/** Files will be downloaded from a repository. */

/** Package files will be...

>  	ALPM_EVENT_RETRIEVE_START,

As we are splitting db and package events, this should be changed to:

ALPM_EVENT_PKG_RETRIEVE_START

>  	/** Files were downloaded from a repository. */
>  	ALPM_EVENT_RETRIEVE_DONE,
> diff --git a/lib/libalpm/be_sync.c b/lib/libalpm/be_sync.c
> index 1be40650..826c11e6 100644
> --- a/lib/libalpm/be_sync.c
> +++ b/lib/libalpm/be_sync.c
> @@ -308,6 +308,7 @@ int SYMEXPORT alpm_dbs_update(alpm_handle_t *handle, alpm_list_t *dbs, int force
>  	int ret = -1;
>  	mode_t oldmask;
>  	alpm_list_t *payloads = NULL;
> +	alpm_event_t event;
>  
>  	/* Sanity checks */
>  	CHECK_HANDLE(handle, return -1);
> @@ -382,10 +383,16 @@ int SYMEXPORT alpm_dbs_update(alpm_handle_t *handle, alpm_list_t *dbs, int force
>  		}
>  	}
>  
> +	event.type = ALPM_EVENT_DB_RETRIEVE_START;
> +	EVENT(handle, &event);
>  	ret = _alpm_multi_download(handle, payloads, syncpath);
>  	if(ret < 0) {
> +		event.type = ALPM_EVENT_DB_RETRIEVE_FAILED;
> +		EVENT(handle, &event);
>  		goto cleanup;
>  	}
> +	event.type = ALPM_EVENT_DB_RETRIEVE_DONE;
> +	EVENT(handle, &event);
>  
>  	for(i = dbs; i; i = i->next) {
>  		alpm_db_t *db = i->data;
> diff --git a/src/pacman/callback.c b/src/pacman/callback.c
> index 8fb89b39..585eae09 100644
> --- a/src/pacman/callback.c
> +++ b/src/pacman/callback.c
> @@ -280,8 +280,12 @@ void cb_event(alpm_event_t *event)
>  		case ALPM_EVENT_SCRIPTLET_INFO:
>  			fputs(event->scriptlet_info.line, stdout);
>  			break;
> +		case ALPM_EVENT_DB_RETRIEVE_START:
> +			on_progress = 1;
> +			break;
>  		case ALPM_EVENT_RETRIEVE_START:
>  			colon_printf(_("Retrieving packages...\n"));
> +			on_progress = 1;
>  			break;
>  		case ALPM_EVENT_DISKSPACE_START:
>  			if(config->noprogressbar) {
> @@ -338,6 +342,13 @@ void cb_event(alpm_event_t *event)
>  				}
>  			}
>  			break;
> +		case ALPM_EVENT_DB_RETRIEVE_DONE:
> +		case ALPM_EVENT_DB_RETRIEVE_FAILED:
> +		case ALPM_EVENT_RETRIEVE_DONE:
> +		case ALPM_EVENT_RETRIEVE_FAILED:
> +			flush_output_list();
> +			on_progress = 0;
> +			break;
>  		/* all the simple done events, with fallthrough for each */
>  		case ALPM_EVENT_FILECONFLICTS_DONE:
>  		case ALPM_EVENT_CHECKDEPS_DONE:
> @@ -349,8 +360,6 @@ void cb_event(alpm_event_t *event)
>  		case ALPM_EVENT_KEY_DOWNLOAD_DONE:
>  		case ALPM_EVENT_LOAD_DONE:
>  		case ALPM_EVENT_DISKSPACE_DONE:
> -		case ALPM_EVENT_RETRIEVE_DONE:
> -		case ALPM_EVENT_RETRIEVE_FAILED:
>  		case ALPM_EVENT_HOOK_DONE:
>  		case ALPM_EVENT_HOOK_RUN_DONE:
>  		/* we can safely ignore those as well */
> 


More information about the pacman-dev mailing list