From: Taylor Blau Date: Fri, 02 May 2025 23:21:22 GMT Subject: Re: [PATCH v2 02/13] pack-objects: add --path-walk option Message-ID: In-Reply-To: On Mon, Mar 24, 2025 at 03:22:38PM +0000, Derrick Stolee via GitGitGadget wrote: > From: Derrick Stolee > > In order to more easily compute delta bases among objects that appear at > the exact same path, add a --path-walk option to 'git pack-objects'. > > This option will use the path-walk API instead of the object walk given > by the revision machinery. Since objects will be provided in batches > representing a common path, those objects can be tested for delta bases > immediately instead of waiting for a sort of the full object list by > name-hash. This has multiple benefits, including avoiding collisions by > name-hash. > > The objects marked as UNINTERESTING are included in these batches, so we > are guaranteeing some locality to find good delta bases. > > After the individual passes are done on a per-path basis, the default > name-hash is used to find other opportunistic delta bases that did not > match exactly by the full path name. Thanks for the clear explanation here. > The current implementation performs delta calculations while walking > objects, which is not ideal for a few reasons. First, this will cause > the "Enumerating objects" phase to be much longer than usual. Second, it > does not take advantage of threading during the path-scoped delta > calculations. Even with this lack of threading, the path-walk option is > sometimes faster than the usual approach. Future changes will refactor > this code to allow for threading, but that complexity is deferred until > later to keep this patch as simple as possible. I can't remember if I called this out in my previous round of review, but I definitely appreciate you separating out the threading implementation. When I first started to read this paragraph, I thought "huh, I bet this is parallelizeable", and I was glad to see that you both (a) called out the same thing, and (b) deferred it to a later patch to reduce the complexity of this one. Thanks. > This new walk is incompatible with some features and is ignored by > others: > > * Object filters are not currently integrated with the path-walk API, > such as sparse-checkout or tree depth. A blobless packfile could be > integrated easily, but that is deferred for later. > > * Server-focused features such as delta islands, shallow packs, and > using a bitmap index are incompatible with the path-walk API. > > * The path walk API is only compatible with the --revs option, not > taking object lists or pack lists over stdin. These alternative ways > to specify the objects currently ignores the --path-walk option > without even a warning. Much appreciated to likewise call out the (current) limitations here as well. > Future changes will create performance tests that demonstrate the power > of this approach. > > Signed-off-by: Derrick Stolee > --- > Documentation/git-pack-objects.adoc | 14 +- > Documentation/technical/api-path-walk.adoc | 1 + > builtin/pack-objects.c | 147 +++++++++++++++++++-- > t/t5300-pack-object.sh | 15 +++ > 4 files changed, 167 insertions(+), 10 deletions(-) > > diff --git a/Documentation/git-pack-objects.adoc b/Documentation/git-pack-objects.adoc > index 7f69ae4855f..7065758eddf 100644 > --- a/Documentation/git-pack-objects.adoc > +++ b/Documentation/git-pack-objects.adoc > @@ -16,7 +16,7 @@ SYNOPSIS > [--cruft] [--cruft-expiration=