[pacman-dev] [PATCH v2] Swap alpm_db_update() implementation to multiplexed version

Allan McRae allan at archlinux.org
Thu May 7 08:01:10 UTC 2020


On 7/5/20 11:49 am, Anatol Pomozov wrote:
> Now when all callers of the old alpm_db_update() function are gone we can
> remove this implementation. And then rename alpm_dbs_update() function to
> alpm_db_update().
> 
> Signed-off-by: Anatol Pomozov <anatol.pomozov at gmail.com>
> ---

../src/pacman/util.c: In function ‘sync_syncdbs’:
../src/pacman/util.c:156:2: error: ‘multibar_move_completed_up’
undeclared (first use in this function)
  156 |  multibar_move_completed_up = 0;
      |  ^~~~~~~~~~~~~~~~~~~~~~~~~~
../src/pacman/util.c:156:2: note: each undeclared identifier is reported
only once for each function it appears in



>  README                |   3 +
>  lib/libalpm/alpm.h    |  40 +---------
>  lib/libalpm/be_sync.c | 167 +-----------------------------------------
>  src/pacman/util.c     |   2 +-
>  4 files changed, 7 insertions(+), 205 deletions(-)
> 
> diff --git a/README b/README
> index f5bbaf02..6aa68374 100644
> --- a/README
> +++ b/README
> @@ -664,5 +664,8 @@ API CHANGES BETWEEN 5.2 AND 6.0
>  - ALPM_EVENT_PKGDOWNLOAD_START, ALPM_EVENT_PKGDOWNLOAD_DONE, ALPM_EVENT_PKGDOWNLOAD_FAILED
>  
>  [CHANGED]
> +- alpm_db_update() changed its signature and now accepts a list of databases
> +  rather than a single database. This is need to handle database downloading
> +  in a multiplexed way.
>  
>  [ADDED]
> diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h
> index 903e2fbc..3ea66ccc 100644
> --- a/lib/libalpm/alpm.h
> +++ b/lib/libalpm/alpm.h
> @@ -1039,42 +1039,6 @@ int alpm_db_add_server(alpm_db_t *db, const char *url);
>  int alpm_db_remove_server(alpm_db_t *db, const char *url);
>  /** @} */
>  
> -/** Update a package database
> - *
> - * An update of the package database \a db will be attempted. Unless
> - * \a force is true, the update will only be performed if the remote
> - * database was modified since the last update.
> - *
> - * This operation requires a database lock, and will return an applicable error
> - * if the lock could not be obtained.
> - *
> - * Example:
> - * @code
> - * alpm_list_t *syncs = alpm_get_syncdbs();
> - * for(i = syncs; i; i = alpm_list_next(i)) {
> - *     alpm_db_t *db = alpm_list_getdata(i);
> - *     result = alpm_db_update(0, db);
> - *
> - *     if(result < 0) {
> - *	       printf("Unable to update database: %s\n", alpm_strerrorlast());
> - *     } else if(result == 1) {
> - *         printf("Database already up to date\n");
> - *     } else {
> - *         printf("Database updated\n");
> - *     }
> - * }
> - * @endcode
> - *
> - * @note After a successful update, the \link alpm_db_get_pkgcache()
> - * package cache \endlink will be invalidated
> - * @param force if true, then forces the update, otherwise update only in case
> - * the database isn't up to date
> - * @param db pointer to the package database to update
> - * @return 0 on success, -1 on error (pm_errno is set accordingly), 1 if up to
> - * to date
> - */
> -int alpm_db_update(int force, alpm_db_t *db);
> -
>  /** Update package databases
>   *
>   * An update of the package databases in the list \a dbs will be attempted.
> @@ -1087,7 +1051,7 @@ int alpm_db_update(int force, alpm_db_t *db);
>   * Example:
>   * @code
>   * alpm_list_t *dbs = alpm_get_syncdbs();
> - * ret = alpm_dbs_update(config->handle, dbs, force);
> + * ret = alpm_db_update(config->handle, dbs, force);
>   * if(ret < 0) {
>   *     pm_printf(ALPM_LOG_ERROR, _("failed to synchronize all databases (%s)\n"),
>   *         alpm_strerror(alpm_errno(config->handle)));
> @@ -1102,7 +1066,7 @@ int alpm_db_update(int force, alpm_db_t *db);
>   * the databases aren't up to date
>   * @return 0 on success, -1 on error (pm_errno is set accordingly)
>   */
> -int alpm_dbs_update(alpm_handle_t *handle, alpm_list_t *dbs, int force);
> +int alpm_db_update(alpm_handle_t *handle, alpm_list_t *dbs, int force);
>  
>  /** Get a package entry from a package database.
>   * @param db pointer to the package database to get the package from
> diff --git a/lib/libalpm/be_sync.c b/lib/libalpm/be_sync.c
> index add1a576..97808e21 100644
> --- a/lib/libalpm/be_sync.c
> +++ b/lib/libalpm/be_sync.c
> @@ -136,172 +136,7 @@ valid:
>  	return 0;
>  }
>  
> -int SYMEXPORT alpm_db_update(int force, alpm_db_t *db)
> -{
> -	char *syncpath;
> -	const char *dbext;
> -	alpm_list_t *i;
> -	int updated = 0;
> -	int ret = -1;
> -	mode_t oldmask;
> -	alpm_handle_t *handle;
> -	int siglevel;
> -
> -	/* Sanity checks */
> -	ASSERT(db != NULL, return -1);
> -	handle = db->handle;
> -	handle->pm_errno = ALPM_ERR_OK;
> -	ASSERT(db != handle->db_local, RET_ERR(handle, ALPM_ERR_WRONG_ARGS, -1));
> -	ASSERT(db->servers != NULL, RET_ERR(handle, ALPM_ERR_SERVER_NONE, -1));
> -
> -	if(!(db->usage & ALPM_DB_USAGE_SYNC)) {
> -		return 0;
> -	}
> -
> -	syncpath = get_sync_dir(handle);
> -	if(!syncpath) {
> -		return -1;
> -	}
> -
> -	/* force update of invalid databases to fix potential mismatched database/signature */
> -	if(db->status & DB_STATUS_INVALID) {
> -		force = 1;
> -	}
> -
> -	/* make sure we have a sane umask */
> -	oldmask = umask(0022);
> -
> -	siglevel = alpm_db_get_siglevel(db);
> -
> -	/* attempt to grab a lock */
> -	if(_alpm_handle_lock(handle)) {
> -		free(syncpath);
> -		umask(oldmask);
> -		RET_ERR(handle, ALPM_ERR_HANDLE_LOCK, -1);
> -	}
> -
> -	dbext = db->handle->dbext;
> -
> -	for(i = db->servers; i; i = i->next) {
> -		const char *server = i->data, *final_db_url = NULL;
> -		struct dload_payload payload = {0};
> -		size_t len;
> -		int sig_ret = 0;
> -
> -		/* set hard upper limit of 128MiB */
> -		payload.max_size = 128 * 1024 * 1024;
> -
> -		/* print server + filename into a buffer */
> -		len = strlen(server) + strlen(db->treename) + strlen(dbext) + 2;
> -		MALLOC(payload.fileurl, len,
> -			{
> -				free(syncpath);
> -				umask(oldmask);
> -				RET_ERR(handle, ALPM_ERR_MEMORY, -1);
> -			}
> -		);
> -		snprintf(payload.fileurl, len, "%s/%s%s", server, db->treename, dbext);
> -		payload.handle = handle;
> -		payload.force = force;
> -		payload.unlink_on_fail = 1;
> -
> -		ret = _alpm_download(&payload, syncpath, NULL, &final_db_url);
> -		_alpm_dload_payload_reset(&payload);
> -		updated = (updated || ret == 0);
> -
> -		if(ret != -1 && updated && (siglevel & ALPM_SIG_DATABASE)) {
> -			/* an existing sig file is no good at this point */
> -			char *sigpath = _alpm_sigpath(handle, _alpm_db_path(db));
> -			if(!sigpath) {
> -				ret = -1;
> -				break;
> -			}
> -			unlink(sigpath);
> -			free(sigpath);
> -
> -
> -			/* check if the final URL from internal downloader looks reasonable */
> -			if(final_db_url != NULL) {
> -				if(strlen(final_db_url) < 3
> -						|| strcmp(final_db_url + strlen(final_db_url) - strlen(dbext),
> -								dbext) != 0) {
> -					final_db_url = NULL;
> -				}
> -			}
> -
> -			/* if we downloaded a DB, we want the .sig from the same server */
> -			if(final_db_url != NULL) {
> -				/* print final_db_url into a buffer (leave space for .sig) */
> -				len = strlen(final_db_url) + 5;
> -			} else {
> -				/* print server + filename into a buffer (leave space for separator and .sig) */
> -				len = strlen(server) + strlen(db->treename) + strlen(dbext) + 6;
> -			}
> -
> -			MALLOC(payload.fileurl, len,
> -				{
> -					free(syncpath);
> -					umask(oldmask);
> -					RET_ERR(handle, ALPM_ERR_MEMORY, -1);
> -				}
> -			);
> -
> -			if(final_db_url != NULL) {
> -				snprintf(payload.fileurl, len, "%s.sig", final_db_url);
> -			} else {
> -				snprintf(payload.fileurl, len, "%s/%s%s.sig", server, db->treename, dbext);
> -			}
> -
> -			payload.handle = handle;
> -			payload.force = 1;
> -			payload.errors_ok = (siglevel & ALPM_SIG_DATABASE_OPTIONAL);
> -
> -			/* set hard upper limit of 16KiB */
> -			payload.max_size = 16 * 1024;
> -
> -			sig_ret = _alpm_download(&payload, syncpath, NULL, NULL);
> -			/* errors_ok suppresses error messages, but not the return code */
> -			sig_ret = payload.errors_ok ? 0 : sig_ret;
> -			_alpm_dload_payload_reset(&payload);
> -		}
> -
> -		if(ret != -1 && sig_ret != -1) {
> -			break;
> -		}
> -	}
> -
> -	if(updated) {
> -		/* Cache needs to be rebuilt */
> -		_alpm_db_free_pkgcache(db);
> -
> -		/* clear all status flags regarding validity/existence */
> -		db->status &= ~DB_STATUS_VALID;
> -		db->status &= ~DB_STATUS_INVALID;
> -		db->status &= ~DB_STATUS_EXISTS;
> -		db->status &= ~DB_STATUS_MISSING;
> -
> -		/* if the download failed skip validation to preserve the download error */
> -		if(ret != -1 && sync_db_validate(db) != 0) {
> -			/* pm_errno should be set */
> -			ret = -1;
> -		}
> -	}
> -
> -	if(ret == -1) {
> -		/* pm_errno was set by the download code */
> -		_alpm_log(handle, ALPM_LOG_DEBUG, "failed to sync db: %s\n",
> -				alpm_strerror(handle->pm_errno));
> -	} else {
> -		handle->pm_errno = ALPM_ERR_OK;
> -	}
> -
> -	_alpm_handle_unlock(handle);
> -	free(syncpath);
> -	umask(oldmask);
> -	return ret;
> -}
> -
> -int SYMEXPORT alpm_dbs_update(alpm_handle_t *handle, alpm_list_t *dbs, int force) {
> +int SYMEXPORT alpm_db_update(alpm_handle_t *handle, alpm_list_t *dbs, int force) {
>  	char *syncpath;
>  	const char *dbext = handle->dbext;
>  	alpm_list_t *i;
> diff --git a/src/pacman/util.c b/src/pacman/util.c
> index 2a021987..90cd46c9 100644
> --- a/src/pacman/util.c
> +++ b/src/pacman/util.c
> @@ -154,7 +154,7 @@ int sync_syncdbs(int level, alpm_list_t *syncs)
>  	int force = (level < 2 ? 0 : 1);
>  
>  	multibar_move_completed_up = 0;
> -	ret = alpm_dbs_update(config->handle, syncs, force);
> +	ret = alpm_db_update(config->handle, syncs, force);
>  	if(ret < 0) {
>  		pm_printf(ALPM_LOG_ERROR, _("failed to synchronize all databases (%s)\n"),
>  			alpm_strerror(alpm_errno(config->handle)));
> 


More information about the pacman-dev mailing list