[PATCH 1/4] Verify remote packs, speed up pending request queue
From: Nick Hengeveld <hidden>
Date: 2016-06-15 22:42:10
Subsystem:
the rest · Maintainer:
Linus Torvalds
Verify that remote packs exist before using the pack index, add requests to the beginning of the queue to locate pending requests faster. Signed-off-by: Nick Hengeveld <redacted> --- http-push.c | 37 +++++++++++++++++++++---------------- 1 files changed, 21 insertions(+), 16 deletions(-) applies-to: aaaf3e5d771c5de11e2c4da6677f51c7e07f7a50 216264d37339c149efa8c2eb03dbf03f2812d5d1
diff --git a/http-push.c b/http-push.c
index e85f1c1..134d405 100644
--- a/http-push.c
+++ b/http-push.c@@ -727,7 +727,6 @@ void process_waiting_requests(void) void add_request(unsigned char *sha1, char *lock_token) { struct transfer_request *request = request_queue_head; - struct transfer_request *tail; struct packed_git *target; while (request != NULL && memcmp(request->sha1, sha1, 20))
@@ -745,17 +744,8 @@ void add_request(unsigned char *sha1, ch request->lock_token = lock_token; request->headers = NULL; request->state = NEED_CHECK; - request->next = NULL; - - if (request_queue_head == NULL) { - request_queue_head = request; - } else { - tail = request_queue_head; - while (tail->next != NULL) { - tail = tail->next; - } - tail->next = request; - } + request->next = request_queue_head; + request_queue_head = request; #ifdef USE_CURL_MULTI process_request_queue(); process_curl_messages();
@@ -775,13 +765,29 @@ static int fetch_index(unsigned char *sh FILE *indexfile; struct active_request_slot *slot; + /* Don't use the index if the pack isn't there */ + url = xmalloc(strlen(remote->url) + 65); + sprintf(url, "%s/objects/pack/pack-%s.pack", remote->url, hex); + slot = get_active_slot(); + curl_easy_setopt(slot->curl, CURLOPT_URL, url); + curl_easy_setopt(slot->curl, CURLOPT_NOBODY, 1); + if (start_active_slot(slot)) { + run_active_slot(slot); + if (slot->curl_result != CURLE_OK) { + free(url); + return error("Unable to verify pack %s is available", + hex); + } + } else { + return error("Unable to start request"); + } + if (has_pack_index(sha1)) return 0; if (push_verbosely) fprintf(stderr, "Getting index for pack %s\n", hex); - url = xmalloc(strlen(remote->url) + 64); sprintf(url, "%s/objects/pack/pack-%s.idx", remote->url, hex); filename = sha1_pack_index_name(sha1);
@@ -792,6 +798,8 @@ static int fetch_index(unsigned char *sh filename); slot = get_active_slot(); + curl_easy_setopt(slot->curl, CURLOPT_NOBODY, 0); + curl_easy_setopt(slot->curl, CURLOPT_HTTPGET, 1); curl_easy_setopt(slot->curl, CURLOPT_FILE, indexfile); curl_easy_setopt(slot->curl, CURLOPT_WRITEFUNCTION, fwrite); curl_easy_setopt(slot->curl, CURLOPT_URL, url);
@@ -833,8 +841,6 @@ static int fetch_index(unsigned char *sh static int setup_index(unsigned char *sha1) { struct packed_git *new_pack; - if (has_pack_file(sha1)) - return 0; // don't list this as something we can get if (fetch_index(sha1)) return -1;
@@ -1610,7 +1616,6 @@ int main(int argc, char **argv) while (request != NULL) { next_request = request->next; release_request(request); - free(request); request = next_request; }
--- 0.99.9.GIT