[pacman-dev] [PATCH v3] Parametrise the different ways in which the payload is reset

Martin Kühne mysatyre at gmail.com
Mon Oct 17 14:40:37 UTC 2016


In FS#43434, Downloads which fail and are restarted on a different server
will resume and may display a negative download speed. The payload's progress
in libalpm was not properly reset which ultimately caused terminal noise
because the line width calculation assumes positive download speeds.

This patch fixes the incomplete reset of the payload by mimicing what
be_sync.c:alpm_db_update() does over in sync.c:download_single_file().
The new dload.c:_alpm_dload_payload_reset_for_retry() extends beyond the
current behavior by updating initial_size and prevprogress for this case.
This makes pacman reset the progress properly in the next invocation of the
callback and display positive download speeds.

Fixes FS#43434.

Signed-off-by: Martin Kühne <mysatyre at gmail.com>
---
 lib/libalpm/dload.c | 10 ++++++++++
 lib/libalpm/dload.h |  1 +
 lib/libalpm/sync.c  |  4 +---
 3 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/lib/libalpm/dload.c b/lib/libalpm/dload.c
index dc57c92..855099b 100644
--- a/lib/libalpm/dload.c
+++ b/lib/libalpm/dload.c
@@ -762,4 +762,14 @@ void _alpm_dload_payload_reset(struct dload_payload *payload)
 	memset(payload, '\0', sizeof(*payload));
 }
 
+void _alpm_dload_payload_reset_for_retry(struct dload_payload *payload)
+{
+	ASSERT(payload, return);
+
+	FREE(payload->fileurl);
+	payload->initial_size += payload->prevprogress;
+	payload->prevprogress = 0;
+	payload->unlink_on_fail = 0;
+}
+
 /* vim: set noet: */
diff --git a/lib/libalpm/dload.h b/lib/libalpm/dload.h
index 427c486..3459665 100644
--- a/lib/libalpm/dload.h
+++ b/lib/libalpm/dload.h
@@ -47,6 +47,7 @@ struct dload_payload {
 };
 
 void _alpm_dload_payload_reset(struct dload_payload *payload);
+void _alpm_dload_payload_reset_for_retry(struct dload_payload *payload);
 
 int _alpm_download(struct dload_payload *payload, const char *localpath,
 		char **final_file, const char **final_url);
diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c
index 00b68d0..a1f673f 100644
--- a/lib/libalpm/sync.c
+++ b/lib/libalpm/sync.c
@@ -946,9 +946,7 @@ static int download_single_file(alpm_handle_t *handle, struct dload_payload *pay
 			EVENT(handle, &event);
 			return 0;
 		}
-
-		FREE(payload->fileurl);
-		payload->unlink_on_fail = 0;
+		_alpm_dload_payload_reset_for_retry(payload);
 	}
 
 	event.type = ALPM_EVENT_PKGDOWNLOAD_FAILED;
-- 
2.10.0


More information about the pacman-dev mailing list