Send patches - preferably formatted by git format-patch - to patches at archlinux32 dot org.
summaryrefslogtreecommitdiff
path: root/lib/libalpm/be_sync.c
diff options
context:
space:
mode:
authorAnatol Pomozov <anatol.pomozov@gmail.com>2020-05-12 15:26:38 -0700
committerAllan McRae <allan@archlinux.org>2020-07-07 21:35:35 +1000
commitf078c2d3bcb72bafda0dce5fe2c9418ca462bb1a (patch)
tree4442ea1911716f399f514f1b7d404f0ce62f788f /lib/libalpm/be_sync.c
parent6b9c1b4d54225b4c2808b5fadc2b6e779ae1916a (diff)
Move signature payload creation to download engine
Until now callee of ALPM download functionality has been in charge of payload creation both for the main file (e.g. *.pkg) and for the accompanied *.sig file. One advantage of such solution is that all payloads are independent and can be fetched in parallel thus exploiting the maximum level of download parallelism. To build *.sig file url we've been using a simple string concatenation: $requested_url + ".sig". Unfortunately there are cases when it does not work. For example an archlinux.org "Download From Mirror" link looks like this https://www.archlinux.org/packages/core/x86_64/bash/download/ and it gets redirected to some mirror. But if we append ".sig" to the end of the link url and try to download it then archlinux.org returns 404 error. To overcome this issue we need to follow redirects for the main payload first, find the final url and only then append '.sig' suffix. This implies 2 things: - the signature payload initialization need to be moved to dload.c as it is the place where we have access to the resolved url - *.sig is downloaded serially with the main payload and this reduces level of parallelism Move *.sig payload creation to dload.c. Once the main payload is fetched successfully we check if the callee asked to download the accompanied signature. If yes - create a new payload and add it to mcurl. *.sig payload does not use server list of the main payload and thus does not support mirror failover. *.sig file comes from the same server as the main payload. Refactor event loop in curl_multi_download_internal() a bit. Instead of relying on curl_multi_check_finished_download() to return number of new payloads we simply rerun the loop iteration one more time to check if there are any active downloads left. Signed-off-by: Anatol Pomozov <anatol.pomozov@gmail.com> Signed-off-by: Allan McRae <allan@archlinux.org>
Diffstat (limited to 'lib/libalpm/be_sync.c')
-rw-r--r--lib/libalpm/be_sync.c34
1 files changed, 6 insertions, 28 deletions
diff --git a/lib/libalpm/be_sync.c b/lib/libalpm/be_sync.c
index a0736320..225df76d 100644
--- a/lib/libalpm/be_sync.c
+++ b/lib/libalpm/be_sync.c
@@ -180,12 +180,10 @@ int SYMEXPORT alpm_db_update(alpm_handle_t *handle, alpm_list_t *dbs, int force)
dbforce = 1;
}
- CALLOC(payload, 1, sizeof(*payload), GOTO_ERR(handle, ALPM_ERR_MEMORY, cleanup));
+ siglevel = alpm_db_get_siglevel(db);
- /* set hard upper limit of 128 MiB */
- payload->max_size = 128 * 1024 * 1024;
+ CALLOC(payload, 1, sizeof(*payload), GOTO_ERR(handle, ALPM_ERR_MEMORY, cleanup));
payload->servers = db->servers;
-
/* print server + filename into a buffer */
len = strlen(db->treename) + strlen(dbext) + 1;
MALLOC(payload->filepath, len,
@@ -194,31 +192,11 @@ int SYMEXPORT alpm_db_update(alpm_handle_t *handle, alpm_list_t *dbs, int force)
payload->handle = handle;
payload->force = dbforce;
payload->unlink_on_fail = 1;
-
+ payload->download_signature = (siglevel & ALPM_SIG_DATABASE);
+ payload->signature_optional = (siglevel & ALPM_SIG_DATABASE_OPTIONAL);
+ /* set hard upper limit of 128 MiB */
+ payload->max_size = 128 * 1024 * 1024;
payloads = alpm_list_add(payloads, payload);
-
- siglevel = alpm_db_get_siglevel(db);
- if(siglevel & ALPM_SIG_DATABASE) {
- struct dload_payload *sig_payload;
- CALLOC(sig_payload, 1, sizeof(*sig_payload), GOTO_ERR(handle, ALPM_ERR_MEMORY, cleanup));
- sig_payload->signature = 1;
-
- /* print filename into a buffer (leave space for separator and .sig) */
- len = strlen(db->treename) + strlen(dbext) + 5;
- MALLOC(sig_payload->filepath, len,
- FREE(sig_payload); GOTO_ERR(handle, ALPM_ERR_MEMORY, cleanup));
- snprintf(sig_payload->filepath, len, "%s%s.sig", db->treename, dbext);
-
- sig_payload->handle = handle;
- sig_payload->force = dbforce;
- sig_payload->errors_ok = (siglevel & ALPM_SIG_DATABASE_OPTIONAL);
-
- /* set hard upper limit of 16 KiB */
- sig_payload->max_size = 16 * 1024;
- sig_payload->servers = db->servers;
-
- payloads = alpm_list_add(payloads, sig_payload);
- }
}
event.type = ALPM_EVENT_DB_RETRIEVE_START;