[pacman-dev] [PATCH] Convert download packages logic to multiplexed API
Anatol Pomozov
anatol.pomozov at gmail.com
Thu May 7 01:11:03 UTC 2020
Hello
On Tue, Apr 28, 2020 at 9:36 PM Allan McRae <allan at archlinux.org> wrote:
>
> On 19/4/20 12:04 pm, Anatol Pomozov wrote:
> > Create a list of dload_payloads and pass it to the new _alpm_multi_*
> > interface.
> >
> > Signed-off-by: Anatol Pomozov <anatol.pomozov at gmail.com>
> > ---
> > lib/libalpm/sync.c | 74 ++++++++++++++++++----------------------------
> > 1 file changed, 28 insertions(+), 46 deletions(-)
>
> Deletions!
:D and more deletions are coming...
>
> > diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c
> > index 8a9dcae8..aa417bca 100644
> > --- a/lib/libalpm/sync.c
> > +++ b/lib/libalpm/sync.c
> > @@ -726,47 +726,13 @@ static int find_dl_candidates(alpm_handle_t *handle, alpm_list_t **files)
> > return 0;
> > }
> >
> > -static int download_single_file(alpm_handle_t *handle, struct dload_payload *payload,
> > - const char *cachedir)
> > -{
> > - alpm_event_pkgdownload_t event = {
> > - .type = ALPM_EVENT_PKGDOWNLOAD_START,
> > - .file = payload->remote_name
> > - };
> > - const alpm_list_t *server;
> > -
> > - payload->handle = handle;
> > - payload->allow_resume = 1;
> > -
> > - EVENT(handle, &event);
> > - for(server = payload->servers; server; server = server->next) {
> > - const char *server_url = server->data;
> > - size_t len;
> > -
> > - /* print server + filename into a buffer */
> > - len = strlen(server_url) + strlen(payload->remote_name) + 2;
> > - MALLOC(payload->fileurl, len, RET_ERR(handle, ALPM_ERR_MEMORY, -1));
> > - snprintf(payload->fileurl, len, "%s/%s", server_url, payload->remote_name);
> > -
> > - if(_alpm_download(payload, cachedir, NULL, NULL) != -1) {
> > - event.type = ALPM_EVENT_PKGDOWNLOAD_DONE;
> > - EVENT(handle, &event);
> > - return 0;
> > - }
> > - _alpm_dload_payload_reset_for_retry(payload);
> > - }
> > -
> > - event.type = ALPM_EVENT_PKGDOWNLOAD_FAILED;
> > - EVENT(handle, &event);
> > - return -1;
> > -}
> > -
> > static int download_files(alpm_handle_t *handle)
> > {
> > const char *cachedir;
> > alpm_list_t *i, *files = NULL;
> > int errors = 0;
> > alpm_event_t event;
> > + alpm_list_t *payloads = NULL;
> >
> > cachedir = _alpm_filecache_setup(handle);
> > handle->trans->state = STATE_DOWNLOADING;
> > @@ -814,26 +780,42 @@ static int download_files(alpm_handle_t *handle)
> >
> > event.type = ALPM_EVENT_RETRIEVE_START;
> > EVENT(handle, &event);
> > - event.type = ALPM_EVENT_RETRIEVE_DONE;
> > for(i = files; i; i = i->next) {
> > const alpm_pkg_t *pkg = i->data;
> > - struct dload_payload payload = {0};
> > + struct dload_payload *payload = NULL;
> >
> > - STRDUP(payload.remote_name, pkg->filename, GOTO_ERR(handle, ALPM_ERR_MEMORY, finish));
> > - payload.servers = pkg->origin_data.db->servers;
> > - payload.max_size = pkg->size;
> > + CALLOC(payload, 1, sizeof(*payload), GOTO_ERR(handle, ALPM_ERR_MEMORY, finish));
> > + STRDUP(payload->remote_name, pkg->filename, GOTO_ERR(handle, ALPM_ERR_MEMORY, finish));
> > + STRDUP(payload->filepath, pkg->filename, GOTO_ERR(handle, ALPM_ERR_MEMORY, finish));
>
> My suspicion that the payload struct now has redundant information
> increases... But as I said at the time, we need to set up a good
> download testsuite so we can detect any breakage of edge cases.
>
> > + payload->max_size = pkg->size;
> > + payload->servers = pkg->origin_data.db->servers;
> > + payload->handle = handle;
> > + payload->allow_resume = 1;
>
> OK.
>
> >
> > - if(download_single_file(handle, &payload, cachedir) == -1) {
> > - errors++;
> > - event.type = ALPM_EVENT_RETRIEVE_FAILED;
> > - _alpm_log(handle, ALPM_LOG_WARNING, _("failed to retrieve some files\n"));
> > - }
> > - _alpm_dload_payload_reset(&payload);
> > + payloads = alpm_list_add(payloads, payload);
> > +
> > + /* TOASK: do we need to initiate *.sig file download here? */
>
> As discussed on IRC - we should. That way we can stop distributing them
> in repo dbs.
Ack. This *.sig file download functionality is implemented in the
subsequent commit that currently stays in my WIP branch here
https://github.com/anatol/pacman/tree/parallel-download
>
> > + }
> > + /* TOASK: the sequential download logic reported ALPM_EVENT_PKGDOWNLOAD_START/DONE/FAILED event.
> > + * Do we want to report the event as well? If yes then it should be moved inside alpm_multi_*()
> > + * function but at that point ALPM operates with dload_payload() and does not care if it downloads
> > + * package or database file.
> > + */
>
> These events were not used by pacman. My recollection is that it was
> added to allow other frontends to monitor download progress.
>
> Following my comments on an earlier patch about adding
> ALPM_EVENT_DB_RETRIEVE_* and changing ALPM_EVENT_RETRIEVE_* to
> ALPM_EVENT_PKG_RETRIEVE_*, I think this is covered enough for other
> frontends if they need it.
>
> You can remove ALPM_EVENT_PKGDOWNLOAD_* from the codebase. Other
> frontends will need to overhaul for parallel download anyway.
SGTM. I am removing these unused events.
I also added information about the API change to README.
> > + event.type = ALPM_EVENT_RETRIEVE_DONE;
> > + if(_alpm_multi_download(handle, payloads, cachedir) == -1) {
> > + errors++;
>
> errors = 1;
> Just to avoid it looking like we are counting something.
Yeah, this kind of error handling looks weird. I am changing it to a
more typical "int ret = -1" style in one of the future patches where I
add downloading *.sig file functionality.
>
> > + event.type = ALPM_EVENT_RETRIEVE_FAILED;
> > + _alpm_log(handle, ALPM_LOG_WARNING, _("failed to retrieve some files\n"));
> > }
>
> OK.
> > EVENT(handle, &event);
> > }
> >
> > finish:
> > + if(payloads) {
> > + alpm_list_free_inner(payloads, (alpm_list_fn_free)_alpm_dload_payload_reset);
> > + FREELIST(payloads);
> > + }
> > +
> > if(files) {
> > alpm_list_free(files);
> > }
> >
More information about the pacman-dev
mailing list