A couple issues with check-connectivity on fetch

From: Mike Hommey <hidden>
Date: 2021-05-02 22:21:11

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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help