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

[PATCH 2/2] fetch: forgo full connectivity check if --filter

From
JTJonathan Tan <jonathantanmy@google.com>
Date
Jan 12, 2020, 04:15 UTC
Message-ID
<be1d6aa4c4fd8868f3682b73c01a92d3830534ad.1578802317.git.jonathantanmy@google.com>
In-Reply-To
<cover.1578802317.git.jonathantanmy@google.com>

If a filter is specified, we do not need a full connectivity check on the contents of the packfile we just fetched; we only need to check that the objects referenced are promisor objects.

This significantly speeds up fetches into repositories that have many promisor objects, because during the connectivity check, all promisor objects are enumerated (to mark them UNINTERESTING), and that takes a significant amount of time.

Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
---
For example, a local fetch was sped up from 6.63s to 3.39s. The bulk of
the remaining time is spent in yet another connectivity check
(fetch_refs -> check_exist_and_connected) prior to the fetch - that will
hopefully be done in a subsequent patch.
---
 builtin/fetch.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/builtin/fetch.c b/builtin/fetch.c
index b4c6d921d0..6fb50320eb 100644
--- a/builtin/fetch.c
+++ b/builtin/fetch.c
@@ -906,8 +906,17 @@ static int store_updated_refs(const char *raw_url, const char *remote_name,
 		url = xstrdup("foreign");
 
 	if (!connectivity_checked) {
+		struct check_connected_options opt = CHECK_CONNECTED_INIT;
+
+		if (filter_options.choice)
+			/*
+			 * Since a filter is specified, objects indirectly
+			 * referenced by refs are allowed to be absent.
+			 */
+			opt.check_refs_are_promisor_objects_only = 1;
+
 		rm = ref_map;
-		if (check_connected(iterate_ref_map, &rm, NULL)) {
+		if (check_connected(iterate_ref_map, &rm, &opt)) {
 			rc = error(_("%s did not send all necessary objects\n"), url);
 			goto abort;
 		}
-- 
2.25.0.rc1.283.g88dfdc4193-goog
Previous: Jonathan NiederNext: Jonathan Nieder
Message 4 of 6 in “Skip a connectivity check during fetch --filter”
  1. 0/2 Skip a connectivity check during fetch --filterJonathan Tan, Jan 12, 2020
  2. 1/2 connected: verify promisor-ness of partial cloneJonathan Tan, Jan 12, 2020
  3. Jonathan NiederJan 29, 2020
  4. 2/2 fetch: forgo full connectivity check if --filterJonathan Tan, Jan 12, 2020
  5. Jonathan NiederJan 29, 2020
  6. Junio C HamanoJan 30, 2020

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.