git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Taylor Blau <me@ttaylorr.com>
To: Patrick Steinhardt <ps@pks.im>
Cc: git@vger.kernel.org
Subject: Re: [PATCH 1/6] object-name: convert to use `packfile_store_get_all_packs()`
Date: Wed, 8 Oct 2025 16:21:23 -0400	[thread overview]
Message-ID: <aObHw6rxrQG22b5B@nand.local> (raw)
In-Reply-To: <20251007-pks-packfiles-convert-get-all-v1-1-428227657a89@pks.im>

On Tue, Oct 07, 2025 at 02:41:07PM +0200, Patrick Steinhardt wrote:
> When searching for abbreviated or when trying to disambiguate object IDs
> we do this in two steps:
>
>   1. We search through the multi-pack index.
>
>   2. We search through all packfiles not part of any multi-pack index.
>
> The second step uses `packfile_store_get_packs()`, which knows to skip
> loading any packfiles that are indexed by an MIDX; this is exactly what
> we want.
>
> But that function is somewhat problematic, as its behaviour is stateful
> and is influenced by `packfile_store_get_all_packs()`. This function
> basically does the same as `packfile_store_get_packs()`, but in addition
> it also loads all packfiles indexed by an MIDX. The problem here is that
> both of these functions act on the same linked list of packfiles, and
> thus depending on whether or not `get_all_packs()` was called the result
> returned by `get_packs()` will be different. Consequently, all callers
> of `get_packs()` need to be prepared to see MIDX'd packs even though
> these should in theory be excluded.
>
> This interface is confusing and thus potentially dangerous, which is why
> we're converting all callers of `get_packs()` to use `get_all_packs()`
> instead.

Well explained.

> diff --git a/object-name.c b/object-name.c
> index f6902e140d..4e62bfa330 100644
> --- a/object-name.c
> +++ b/object-name.c
> @@ -213,7 +213,7 @@ static void find_short_packed_object(struct disambiguate_state *ds)
>  			unique_in_midx(m, ds);
>  	}
>
> -	for (p = packfile_store_get_packs(ds->repo->objects->packfiles); p && !ds->ambiguous;
> +	for (p = packfile_store_get_all_packs(ds->repo->objects->packfiles); p && !ds->ambiguous;
>  	     p = p->next)
>  		unique_in_pack(p, ds);
>  }

Good. As you noted, this function already handles MIDX'd packs as a
separate case, and `unique_in_pack()` discards any packs that have
their `multi_pack_index` bit set. So this caller can be converted
without issue.

> @@ -805,7 +805,7 @@ static void find_abbrev_len_packed(struct min_abbrev_data *mad)
>  			find_abbrev_len_for_midx(m, mad);
>  	}
>
> -	for (p = packfile_store_get_packs(mad->repo->objects->packfiles); p; p = p->next)
> +	for (p = packfile_store_get_all_packs(mad->repo->objects->packfiles); p; p = p->next)
>  		find_abbrev_len_for_pack(p, mad);
>  }

And the exact same is true for this case as well. Looking good.

Thanks,
Taylor

  reply	other threads:[~2025-10-08 20:21 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-10-07 12:41 [PATCH 0/6] packfile: remove `packfile_store_get_packs()` Patrick Steinhardt
2025-10-07 12:41 ` [PATCH 1/6] object-name: convert to use `packfile_store_get_all_packs()` Patrick Steinhardt
2025-10-08 20:21   ` Taylor Blau [this message]
2025-10-07 12:41 ` [PATCH 2/6] builtin/gc: " Patrick Steinhardt
2025-10-08 20:25   ` Taylor Blau
2025-10-09  6:36     ` Patrick Steinhardt
2025-10-07 12:41 ` [PATCH 3/6] builtin/grep: simplify how we preload packs Patrick Steinhardt
2025-10-08 20:43   ` Taylor Blau
2025-10-07 12:41 ` [PATCH 4/6] packfile: drop `packfile_store_get_packs()` Patrick Steinhardt
2025-10-08 20:44   ` Taylor Blau
2025-10-07 12:41 ` [PATCH 5/6] packfile: introduce macro to iterate through packs Patrick Steinhardt
2025-10-08 21:15   ` Taylor Blau
2025-10-09  6:36     ` Patrick Steinhardt
2025-10-07 12:41 ` [PATCH 6/6] packfile: rename `packfile_store_get_all_packs()` Patrick Steinhardt
2025-10-08 20:48   ` Taylor Blau
2025-10-09  6:36     ` Patrick Steinhardt
2025-10-09  8:01 ` [PATCH v2 0/6] packfile: remove `packfile_store_get_packs()` Patrick Steinhardt
2025-10-09  8:01   ` [PATCH v2 1/6] object-name: convert to use `packfile_store_get_all_packs()` Patrick Steinhardt
2025-10-14 19:07     ` Justin Tobler
2025-10-09  8:01   ` [PATCH v2 2/6] builtin/gc: " Patrick Steinhardt
2025-10-09  8:01   ` [PATCH v2 3/6] builtin/grep: simplify how we preload packs Patrick Steinhardt
2025-10-09  8:01   ` [PATCH v2 4/6] packfile: drop `packfile_store_get_packs()` Patrick Steinhardt
2025-10-14 19:11     ` Justin Tobler
2025-10-09  8:01   ` [PATCH v2 5/6] packfile: introduce macro to iterate through packs Patrick Steinhardt
2025-10-14 19:17     ` Justin Tobler
2025-10-09  8:01   ` [PATCH v2 6/6] packfile: rename `packfile_store_get_all_packs()` Patrick Steinhardt
2025-10-14 19:19   ` [PATCH v2 0/6] packfile: remove `packfile_store_get_packs()` Justin Tobler

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=aObHw6rxrQG22b5B@nand.local \
    --to=me@ttaylorr.com \
    --cc=git@vger.kernel.org \
    --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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).