From: Justin Tobler <jltobler@gmail.com>
To: Patrick Steinhardt <ps@pks.im>
Cc: git@vger.kernel.org, Matt Smiley <msmiley@gitlab.com>
Subject: Re: [PATCH 3/3] commit: use commit graph in `lookup_commit_reference_gently()`
Date: Wed, 18 Feb 2026 13:34:01 -0600 [thread overview]
Message-ID: <aZYS73lGbt7Gt8uS@denethor> (raw)
In-Reply-To: <20260216-b4-pks-receive-pack-optimize-shallow-v1-3-e98886daff2b@pks.im>
On 26/02/16 04:38PM, Patrick Steinhardt wrote:
> In the preceding commit we refactored `lookup_commit_reference_gently()`
> so that it doesn't parse non-commit objects anymore. This has led to a
> speedup when git-receive-pack(1) accepts a shallow push into a repo
> with lots of refs that point to blobs or trees.
>
> But while this case is now faster, we still have the issue that
> accepting pushes with lots of "normal" refs that point to commits are
> still slow. This is mostly because we look up the commits via the object
> database, and that is rather costly.
>
> Adapt the code to use `repo_parse_commit_gently()` instead of
> `parse_object()` to parse the resulting commit object. This function
> knows to use the commit-graph to fill in the object, which is way more
> cost efficient.
Makes sense.
> This leads to another significant speedup when accepting shallow pushes.
> The following benchmark pushes a single objects from a shallow clone
> into a repository with 600,000 references that all point to commits:
>
> Benchmark 1: git-receive-pack (rev = HEAD~)
> Time (mean ± σ): 9.179 s ± 0.031 s [User: 8.858 s, System: 0.528 s]
> Range (min … max): 9.154 s … 9.213 s 3 runs
>
> Benchmark 2: git-receive-pack (rev = HEAD)
> Time (mean ± σ): 2.337 s ± 0.032 s [User: 2.331 s, System: 0.234 s]
> Range (min … max): 2.308 s … 2.371 s 3 runs
>
> Summary
> git-receive-pack . </tmp/input (rev = HEAD) ran
> 3.93 ± 0.05 times faster than git-receive-pack (rev = HEAD~)
>
> Also, this again leads to a significant reduction in memory allocations.
> Before this change:
>
> HEAP SUMMARY:
> in use at exit: 17,524,978 bytes in 22,393 blocks
> total heap usage: 33,313 allocs, 10,920 frees, 407,774,251 bytes allocated
>
> And after this change:
>
> HEAP SUMMARY:
> in use at exit: 11,534,036 bytes in 12,406 blocks
> total heap usage: 13,284 allocs, 878 frees, 15,521,451 bytes allocated
Very nice :)
> Signed-off-by: Patrick Steinhardt <ps@pks.im>
> ---
> commit.c | 8 ++++----
> 1 file changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/commit.c b/commit.c
> index b7c4ec2eb5..014f74822c 100644
> --- a/commit.c
> +++ b/commit.c
> @@ -45,7 +45,7 @@ struct commit *lookup_commit_reference_gently(struct repository *r,
> {
> const struct object_id *maybe_peeled;
> struct object_id peeled_oid;
> - struct object *object;
> + struct commit *commit;
> enum object_type type;
>
> switch (peel_object_ext(r, oid, &peeled_oid, 0, &type)) {
> @@ -67,11 +67,11 @@ struct commit *lookup_commit_reference_gently(struct repository *r,
> return NULL;
> }
>
> - object = parse_object(r, maybe_peeled);
> - if (!object)
> + commit = lookup_commit(r, maybe_peeled);
> + if (!commit || repo_parse_commit_gently(r, commit, quiet) < 0)
> return NULL;
Now it is possible to use the commit-graph to parse the commit.
>
> - return object_as_type(object, OBJ_COMMIT, quiet);
> + return commit;
> }
>
> struct commit *lookup_commit_reference(struct repository *r, const struct object_id *oid)
Thanks Patrick. This looks good to me.
-Justin
prev parent reply other threads:[~2026-02-18 19:34 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-02-16 15:38 [PATCH 0/3] git-receive-pack(1): optimize `assign_shallow_commits_to_refs()` Patrick Steinhardt
2026-02-16 15:38 ` [PATCH 1/3] commit: avoid parsing non-commits in `lookup_commit_reference_gently()` Patrick Steinhardt
2026-02-18 18:26 ` Justin Tobler
2026-02-19 17:35 ` Junio C Hamano
2026-02-16 15:38 ` [PATCH 2/3] commit: make `repo_parse_commit_no_graph()` more robust Patrick Steinhardt
2026-02-18 19:23 ` Justin Tobler
2026-02-19 7:18 ` Patrick Steinhardt
2026-02-16 15:38 ` [PATCH 3/3] commit: use commit graph in `lookup_commit_reference_gently()` Patrick Steinhardt
2026-02-18 19:34 ` Justin Tobler [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=aZYS73lGbt7Gt8uS@denethor \
--to=jltobler@gmail.com \
--cc=git@vger.kernel.org \
--cc=msmiley@gitlab.com \
--cc=ps@pks.im \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.