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

A couple issues with check-connectivity on fetch

From
Mike Hommey <mh@glandium.org>
Date
May 2, 2021, 21:53 UTC
Message-ID
<20210502215316.2y4vaedxn2j5gouc@glandium.org>
Hi,

In the context of a remote helper using the `import` capability, or one using the `fetch` capability but the without `check-connectivity` capability, a large amount of time may be spent in check_connected() on fetch, on large repos with a large number of fetched refs that also happen not to actually add commits.

[A little bit of background: in git-cinnabar, which allows to talk to Mercurial repositories, tags are fetched from a different remote, so when one wants to fetch tags, the transport system never calls `import` because the `list` ended up giving a large list of refs with resolved sha1s, all of which are already locally available]

The first thing I noticed is that check_connected() is called twice during the fetch: once from check_exist_and_connected(), and once from store_updated_refs(). When each call is slow, it makes things doubly so. I'm not sure why check_connected() is called twice like this. It seems it could be an oversight, but I could be missing something.

The second thing is that git-cinnabar uses the `import` capability, and in that case, the transport layer never tried to use the `check-connectivity` capability. I'm not sure whether the capability should be exposed there, or if the checks should be skipped altogether assuming `import` helpers use `fast-import` (although, technically, git-cinnabar doesn't use the one provided by git).

But in any case, the `check-connectivity` capability doesn't actually matter because no `fetch` or `import` even happens: fetch only does a `list` and uses that result. In this case, it would seem `check_connected` should be skipped entirely.

Here is a testcase that takes >20s to fetch on my machine (see instructions at the beginning of the file) http://glandium.org/files/git-check-connectivity-testcase (the equivalent takes > 1 minute with git-cinnabar because of the extra refs for git-cinnabar's metadata ; note the testcase is using the `fetch` capability)

A workaround is to create temporary refs for those tags. That makes check_connected()'s git-rev-list work quickly, and the fetch takes < 1s.

I'm ready to send patches to improve the situation, but I wanted some feedback first about the right things that would need to change.

Thoughts?
Mike
Message 1 of 1 in “A couple issues with check-connectivity on fetch”
  1. Mike HommeyMay 2, 2021

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.