Re: [PATCH] packfile: fix perf regression with many packs
Johannes Schindelin <[email protected]>
| Newsgroups | org.kernel.vger.git |
|---|---|
| Message-ID | <[email protected]> |
Hi Junio, On Wed, 12 Aug 2026, Junio C Hamano wrote: > "Johannes Schindelin via GitGitGadget" <[email protected]> > writes: > > > In one reported use case (https://github.com/microsoft/git/issues/970), > > N equals 37,815 and caused a slow-down of a simple `git rev-parse > > --short HEAD` (which is regularly executed as part of `GIT_PS1`) from > > 0.4s to 4.5s. In another, heavily exercised CI scenario, clone times > > increased from under 2 minutes to over half an hour. > > Face with Rolling Eyes (1f644) 🙄 > > As we grow older, more and more extreme use cases that we initially > thought were simply crazy become reality. I have to take back the claim about the clone time, the hunt for that CI regression is still ongoing, and this patch does _not_ fix it. Ciao, Johannes > > > Let's fix this by establishing a fast path for known-new packfiles. > > As long as the caller reliably knows that the pack it has is new and > cannot be on the list, there is no reason to cycle through all the > packs in the ring to attempt removing it in vain. > > Clever and clean. > > > diff --git a/packfile.c b/packfile.c > > index 0eee45055f..f80f05a1fe 100644 > > --- a/packfile.c > > +++ b/packfile.c > > @@ -781,7 +781,7 @@ void packfile_store_add_pack(struct odb_source_packed *store, > > if (pack->pack_fd != -1) > > pack_open_fds++; > > > > - packfile_list_append(&store->packs, pack); > > + packfile_list_append(&store->packs, pack, 1); > > strmap_put(&store->packs_by_path, pack->pack_name, pack); > > } > > > > diff --git a/t/perf/p5303-many-packs.sh b/t/perf/p5303-many-packs.sh > > index af173a7b73..4221f9dd70 100755 > > --- a/t/perf/p5303-many-packs.sh > > +++ b/t/perf/p5303-many-packs.sh > > @@ -141,4 +141,8 @@ test_perf "load 10,000 packs" ' > > git rev-parse --verify "HEAD^{commit}" > > ' > > > > +test_perf "abbreviate with 10,000 packs" ' > > + git rev-parse --short HEAD > > +' > > + > > test_done > > > > base-commit: 11c6700f10234578d10523faf35656ca491425c9 >