]> git.ipfire.org Git - thirdparty/git.git/commitdiff
fetch-pack: optimize loading of refs via commit graph
authorPatrick Steinhardt <ps@pks.im>
Wed, 1 Sep 2021 13:09:54 +0000 (15:09 +0200)
committerJunio C Hamano <gitster@pobox.com>
Wed, 1 Sep 2021 19:43:56 +0000 (12:43 -0700)
In order to negotiate a packfile, we need to dereference refs to see
which commits we have in common with the remote. To do so, we first look
up the object's type -- if it's a tag, we peel until we hit a non-tag
object. If we hit a commit eventually, then we return that commit.

In case the object ID points to a commit directly, we can avoid the
initial lookup of the object type by opportunistically looking up the
commit via the commit-graph, if available, which gives us a slight speed
bump of about 2% in a huge repository with about 2.3M refs:

    Benchmark #1: HEAD~: git-fetch
      Time (mean ± σ):     31.634 s ±  0.258 s    [User: 28.400 s, System: 5.090 s]
      Range (min … max):   31.280 s … 31.896 s    5 runs

    Benchmark #2: HEAD: git-fetch
      Time (mean ± σ):     31.129 s ±  0.543 s    [User: 27.976 s, System: 5.056 s]
      Range (min … max):   30.172 s … 31.479 s    5 runs

    Summary
      'HEAD: git-fetch' ran
        1.02 ± 0.02 times faster than 'HEAD~: git-fetch'

In case this fails, we fall back to the old code which peels the
objects to a commit.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
fetch-pack.c

index e6ec79f81a32bd98497aa38b9dcc4b44b64bd15f..a9604f35a3ea9055732d48e39b63a39f041f18f3 100644 (file)
@@ -119,6 +119,11 @@ static struct commit *deref_without_lazy_fetch(const struct object_id *oid,
 {
        enum object_type type;
        struct object_info info = { .typep = &type };
+       struct commit *commit;
+
+       commit = lookup_commit_in_graph(the_repository, oid);
+       if (commit)
+               return commit;
 
        while (1) {
                if (oid_object_info_extended(the_repository, oid, &info,