All of lore.kernel.org
 help / color / mirror / Atom feed
From: Nick Hengeveld <nickh@reactrix.com>
To: git@vger.kernel.org
Subject: [PATCH 2/3] Switched back to loading alternates as needed
Date: Fri, 21 Oct 2005 12:06:20 -0700	[thread overview]
Message-ID: <20051021190620.GF6160@reactrix.com> (raw)

Switched back to loading alternates as needed

Signed-off-by: Nick Hengeveld <nickh@reactrix.com>


---

Always loading alternates causes unnecessary requests, especially
when a repository is being cloned and git-http-fetch is run repeatedly
with different commit IDs.  On a related note, in such a case could we
pass multiple IDs to the commit walkers (perhaps via stdin?)

 http-fetch.c |   45 +++++++++++++++++++++++++++++----------------
 1 files changed, 29 insertions(+), 16 deletions(-)

applies-to: 6a0c92c60e0b46581276e7592e4f7a1b12f3dc7e
274889e0d7a97eaf060851653166b7cbc72dd3f6
diff --git a/http-fetch.c b/http-fetch.c
index d26fae8..ed1053a 100644
--- a/http-fetch.c
+++ b/http-fetch.c
@@ -25,6 +25,7 @@
 #define PREV_BUF_SIZE 4096
 #define RANGE_HEADER_SIZE 30
 
+static int got_alternates = 0;
 static int active_requests = 0;
 static int data_received;
 
@@ -85,6 +86,7 @@ struct active_request_slot
 	int in_use;
 	int done;
 	CURLcode curl_result;
+	long http_code;
 	struct active_request_slot *next;
 };
 
@@ -235,6 +237,7 @@ static size_t fwrite_sha1_file(void *ptr
 static void process_curl_messages(void);
 static void process_request_queue(void);
 #endif
+static int fetch_alternates(char *base);
 
 static CURL* get_curl_handle(void)
 {
@@ -580,6 +583,9 @@ void process_curl_messages(void)
 				slot->done = 1;
 				slot->in_use = 0;
 				slot->curl_result = curl_message->data.result;
+				curl_easy_getinfo(slot->curl,
+						  CURLINFO_HTTP_CODE,
+						  &slot->http_code);
 				request = request_queue_head;
 				while (request != NULL &&
 				       request->slot != slot)
@@ -590,19 +596,20 @@ void process_curl_messages(void)
 			if (request != NULL) {
 				request->curl_result =
 					curl_message->data.result;
-				curl_easy_getinfo(slot->curl,
-						  CURLINFO_HTTP_CODE,
-						  &request->http_code);
+				request->http_code = slot->http_code;
 				request->slot = NULL;
+				request->state = COMPLETE;
 
 				/* Use alternates if necessary */
-				if (request->http_code == 404 &&
-				    request->repo->next != NULL) {
-					request->repo = request->repo->next;
-					start_request(request);
+				if (request->http_code == 404) {
+					fetch_alternates(alt->base);
+					if (request->repo->next != NULL) {
+						request->repo =
+							request->repo->next;
+						start_request(request);
+					}
 				} else {
 					finish_request(request);
-					request->state = COMPLETE;
 				}
 			}
 		} else {
@@ -765,6 +772,9 @@ static int fetch_alternates(char *base)
 
 	struct active_request_slot *slot;
 
+	if (got_alternates)
+		return 0;
+
 	data = xmalloc(4096);
 	buffer.size = 4096;
 	buffer.posn = 0;
@@ -797,6 +807,8 @@ static int fetch_alternates(char *base)
 				run_active_slot(slot);
 				if (slot->curl_result != CURLE_OK) {
 					free(buffer.buffer);
+					if (slot->http_code == 404)
+						got_alternates = 1;
 					return 0;
 				}
 			}
@@ -868,6 +880,7 @@ static int fetch_alternates(char *base)
 		i = posn + 1;
 	}
 
+	got_alternates = 1;
 	free(buffer.buffer);
 	return ret;
 }
@@ -1059,16 +1072,16 @@ static int fetch_object(struct alt_base 
 		run_active_slot(request->slot);
 #ifndef USE_CURL_MULTI
 		request->curl_result = request->slot->curl_result;
-		curl_easy_getinfo(request->slot->curl,
-				  CURLINFO_HTTP_CODE,
-				  &request->http_code);
+		request->http_code = request->slot->http_code;
 		request->slot = NULL;
 
 		/* Use alternates if necessary */
-		if (request->http_code == 404 &&
-		    request->repo->next != NULL) {
-			request->repo = request->repo->next;
-			start_request(request);
+		if (request->http_code == 404) {
+			fetch_alternates(alt->base);
+			if (request->repo->next != NULL) {
+				request->repo = request->repo->next;
+				start_request(request);
+			}
 		} else {
 			finish_request(request);
 			request->state = COMPLETE;
@@ -1121,6 +1134,7 @@ int fetch(unsigned char *sha1)
 	while (altbase) {
 		if (!fetch_pack(altbase, sha1))
 			return 0;
+		fetch_alternates(alt->base);
 		altbase = altbase->next;
 	}
 	return error("Unable to find %s under %s\n", sha1_to_hex(sha1), 
@@ -1297,7 +1311,6 @@ int main(int argc, char **argv)
 	alt->got_indices = 0;
 	alt->packs = NULL;
 	alt->next = NULL;
-	fetch_alternates(alt->base);
 
 	if (pull(commit_id))
 		return 1;
---
0.99.8.GIT

                 reply	other threads:[~2005-10-21 19:06 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20051021190620.GF6160@reactrix.com \
    --to=nickh@reactrix.com \
    --cc=git@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.