From: Toon Claes <toon@iotcl.com>
To: Patrick Steinhardt <ps@pks.im>, git@vger.kernel.org
Cc: Justin Tobler <jltobler@gmail.com>,
Eric Sunshine <sunshine@sunshineco.com>
Subject: Re: [PATCH v2 1/2] builtin/gc: fix condition for whether to write commit graphs
Date: Thu, 11 Dec 2025 15:16:36 +0100 [thread overview]
Message-ID: <87ecp1gl2z.fsf@iotcl.com> (raw)
In-Reply-To: <20251211-odb-related-fixes-v2-1-bdf875ce51fc@pks.im>
Patrick Steinhardt <ps@pks.im> writes:
> The root cause of this memory leak is our use of `commit_list_append()`.
> This function expects as parameters the item to append and the _tail_ of
> the list to append. This tail will then be overwritten with the new tail
> of the list so that it can be used in subsequent calls. But we call it
> with `commit_list_append(parent->item, &stack)`, so we end up losing
> everything but the new item.
>
> This issue only surfaces when counting merge commits. Next to being a
> memory leak, it also shows that we're in fact miscounting as we only
> respect children of the last parent. All previous parents are discarded,
> so their children will be disregarded unless they are hit via another
> reference.
>
> While crafting a test case for the issue I was puzzled that I couldn't
> establish the proper border at which the auto-condition would be
> fulfilled. As it turns out, there's another bug: if an object is at the
> tip of any reference we don't mark it as seen. Consequently, if it is
> reachable via any other reference, we'd count that object twice.
>
> Fix both of these bugs so that we properly count objects without leaking
> any memory.
>
> Signed-off-by: Patrick Steinhardt <ps@pks.im>
> ---
> builtin/gc.c | 8 +++++---
> t/t7900-maintenance.sh | 25 +++++++++++++++++++++++++
> 2 files changed, 30 insertions(+), 3 deletions(-)
>
> diff --git a/builtin/gc.c b/builtin/gc.c
> index 92c6e7b954..17ff68cbd9 100644
> --- a/builtin/gc.c
> +++ b/builtin/gc.c
> @@ -1130,8 +1130,10 @@ static int dfs_on_ref(const struct reference *ref, void *cb_data)
> return 0;
>
> commit = lookup_commit(the_repository, maybe_peeled);
> - if (!commit)
> + if (!commit || commit->object.flags & SEEN)
> return 0;
> + commit->object.flags |= SEEN;
> +
> if (repo_parse_commit(the_repository, commit) ||
> commit_graph_position(commit) != COMMIT_NOT_FROM_GRAPH)
> return 0;
> @@ -1141,7 +1143,7 @@ static int dfs_on_ref(const struct reference *ref, void *cb_data)
> if (data->num_not_in_graph >= data->limit)
> return 1;
>
> - commit_list_append(commit, &stack);
> + commit_list_insert(commit, &stack);
commit_list_insert() prepends the commit to the beginning of the list,
while commit_list_append() appends it at the end. Because the list is
only used for counting, we don't care about the order. So this fix looks
good to me.
I also approve the other changes in this series.
--
Cheers,
Toon
next prev parent reply other threads:[~2025-12-11 14:16 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-12-05 8:19 [PATCH 0/3] Some random object database related fixes Patrick Steinhardt
2025-12-05 8:19 ` [PATCH 1/3] builtin/repack: fix geometric repacks with promisor remotes Patrick Steinhardt
2025-12-10 19:31 ` Justin Tobler
2025-12-11 5:46 ` Patrick Steinhardt
2025-12-05 8:19 ` [PATCH 2/3] builtin/gc: fix condition for whether to write commit graphs Patrick Steinhardt
2025-12-10 19:49 ` Justin Tobler
2025-12-11 5:48 ` Patrick Steinhardt
2025-12-05 8:20 ` [PATCH 3/3] odb: properly close sources before freeing them Patrick Steinhardt
2025-12-05 23:14 ` Eric Sunshine
2025-12-06 11:38 ` Patrick Steinhardt
2025-12-06 11:43 ` Eric Sunshine
2025-12-06 12:04 ` Patrick Steinhardt
2025-12-11 7:19 ` [PATCH v2 0/2] Some random object database related fixes Patrick Steinhardt
2025-12-11 7:19 ` [PATCH v2 1/2] builtin/gc: fix condition for whether to write commit graphs Patrick Steinhardt
2025-12-11 14:16 ` Toon Claes [this message]
2026-01-06 11:27 ` Karthik Nayak
2026-01-06 11:55 ` Patrick Steinhardt
2026-01-06 16:33 ` Karthik Nayak
2025-12-11 7:19 ` [PATCH v2 2/2] odb: properly close sources before freeing them Patrick Steinhardt
2025-12-12 15:01 ` [PATCH v2 0/2] Some random object database related fixes Justin Tobler
2026-01-06 11:29 ` Karthik Nayak
2026-01-06 12:58 ` [PATCH v3 " Patrick Steinhardt
2026-01-06 12:58 ` [PATCH v3 1/2] builtin/gc: fix condition for whether to write commit graphs Patrick Steinhardt
2026-01-06 12:58 ` [PATCH v3 2/2] odb: properly close sources before freeing them Patrick Steinhardt
2026-01-06 16:30 ` [PATCH v3 0/2] Some random object database related fixes Karthik Nayak
2026-01-07 3:51 ` Junio C Hamano
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=87ecp1gl2z.fsf@iotcl.com \
--to=toon@iotcl.com \
--cc=git@vger.kernel.org \
--cc=jltobler@gmail.com \
--cc=ps@pks.im \
--cc=sunshine@sunshineco.com \
/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.