Verify remote packs, speed up pending request queue
authorNick Hengeveld <nickh@reactrix.com>
Fri, 4 Nov 2005 22:22:18 +0000 (14:22 -0800)
committerJunio C Hamano <junkio@cox.net>
Sun, 6 Nov 2005 09:14:44 +0000 (01:14 -0800)
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 <nickh@reactrix.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
http-push.c

index e85f1c1..134d405 100644 (file)
@@ -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, char *lock_token)
        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 *sha1)
        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 *sha1)
                             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 *sha1)
 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;
        }