git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 2/3] http: avoid disconnecting on 404s for loose objects

From
EWEric Wong <e@80x24.org>
Date
Jul 11, 2016, 20:51 UTC
Message-ID
<20160711205131.1291-3-e@80x24.org>
In-Reply-To
<20160711205131.1291-1-e@80x24.org>

404s are common when fetching loose objects on static HTTP servers, and reestablishing a connection for every single 404 adds additional latency.

Signed-off-by: Eric Wong <e@80x24.org>
---
 http-walker.c |  9 +++++++++
 http.c        | 16 ++++++++++++++--
 2 files changed, 23 insertions(+), 2 deletions(-)
diff --git a/http-walker.c b/http-walker.c
index 9f28523..48f2df4 100644
--- a/http-walker.c
+++ b/http-walker.c
@@ -488,6 +488,15 @@ static int fetch_object(struct walker *walker, unsigned char *sha1)
 		req->localfile = -1;
 	}
 
+	/*
+	 * we turned off CURLOPT_FAILONERROR to avoid losing a
+	 * persistent connection and got CURLE_OK.
+	 */
+	if (req->http_code == 404 && req->curl_result == CURLE_OK &&
+			(starts_with(req->url, "http://") ||
+			 starts_with(req->url, "https://")))
+		req->curl_result = CURLE_HTTP_RETURNED_ERROR;
+
 	if (obj_req->state == ABORTED) {
 		ret = error("Request for %s aborted", hex);
 	} else if (req->curl_result != CURLE_OK &&
diff --git a/http.c b/http.c
index d8b2bec..e81dd13 100644
--- a/http.c
+++ b/http.c
@@ -1975,8 +1975,19 @@ static size_t fwrite_sha1_file(char *ptr, size_t eltsize, size_t nmemb,
 	unsigned char expn[4096];
 	size_t size = eltsize * nmemb;
 	int posn = 0;
-	struct http_object_request *freq =
-		(struct http_object_request *)data;
+	struct http_object_request *freq = data;
+	struct active_request_slot *slot = freq->slot;
+
+	if (slot) {
+		CURLcode c = curl_easy_getinfo(slot->curl, CURLINFO_HTTP_CODE,
+						&slot->http_code);
+		if (c != CURLE_OK)
+			die("BUG: curl_easy_getinfo for HTTP code failed: %s",
+				curl_easy_strerror(c));
+		if (slot->http_code >= 400)
+			return size;
+	}
+
 	do {
 		ssize_t retval = xwrite(freq->localfile,
 					(char *) ptr + posn, size - posn);
@@ -2097,6 +2108,7 @@ struct http_object_request *new_http_object_request(const char *base_url,
 	freq->slot = get_active_slot();
 
 	curl_easy_setopt(freq->slot->curl, CURLOPT_FILE, freq);
+	curl_easy_setopt(freq->slot->curl, CURLOPT_FAILONERROR, 0);
 	curl_easy_setopt(freq->slot->curl, CURLOPT_WRITEFUNCTION, fwrite_sha1_file);
 	curl_easy_setopt(freq->slot->curl, CURLOPT_ERRORBUFFER, freq->errorstr);
 	curl_easy_setopt(freq->slot->curl, CURLOPT_URL, freq->url);
-- 
EW
Previous: Eric WongNext: Eric Wong
Message 3 of 7 in “[RFC 0/3] dumb HTTP transport speedups”
  1. Eric WongJul 11, 2016
  2. 1/3 http-walker: remove unused parameter from fetch_objectEric Wong, Jul 11, 2016
  3. 2/3 http: avoid disconnecting on 404s for loose objectsEric Wong, Jul 11, 2016
  4. 3/3 http-walker: reduce O(n) ops with doubly-linked listEric Wong, Jul 11, 2016
  5. 4/3 http-walker: use hashmap to reduce list scanEric Wong, Jul 11, 2016
  6. Jakub NarębskiJul 24, 2016
  7. Eric WongJul 24, 2016

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.