Re: [PATCH v3 2/2] builtin/pack-objects.c: introduce `pack.recentObjectsHook`
- From
Taylor Blau <me@ttaylorr.com>
- Date
- May 12, 2023, 21:36 UTC
- Message-ID
- <ZF6xT34/Zq5pT9fG@nand.local>
- In-Reply-To
- <20230512212456.GA2495860@coredump.intra.peff.net>
On Fri, May 12, 2023 at 05:24:56PM -0400, Jeff King wrote:
Show 28 quoted lines
> > This patch introduces a new configuration, `pack.recentObjectsHook` > > which allows the caller to specify a program (or set of programs) whose > > output is treated as a set of objects to treat as recent, regardless of > > their true age. > > I was going to complain about putting this in the "pack" section, > because I thought by touching reachable.c, we'd also affect git-prune. > But I don't think we do, because it does its own direct mtime check on > the loose objects. > > But I'm not sure that's the right behavior. > > It feels like even before your patch, this is a huge gap in our > object-retention strategy. During repacking, we try to avoid dropping > objects which are reachable from recent-but-unreachable things we're > keeping (since otherwise it effectively corrupts those recent objects, > making them less valuable to keep). But git-prune will happily drop them > anyway! > > And I think the same thing would apply to your hook. If the hook says > "object XYZ is precious even if unreachable, keep it", then git-prune > ignoring that seems like it would be a source of errors. > > I suspect both could be fixed by having git-prune trigger the same > add_unseen_recent_objects_to_traversal() call either as part of > the perform_reachability_traversal() walk, or maybe in its own walk (I > think maybe it has to be its own because the second walk should avoid > complaining about missing objects).
I might be missing something, but I think we already (kind of) do the right thing here.
AFAICT, the path is:
- cmd_prune() - for_each_loose_file_in_objdir() - prune_object() (as a callback to the above) - is_object_reachable() - perform_reachability_traversal() - mark_reachable_objects() - add_unseen_recent_objects_to_traversal()
That only happens when `mark_recent != 0`, though.
Thanks, Taylor