From: Tamir Duberstein Date: Mon, 15 Jun 2026 20:47:14 GMT Subject: Re: [PATCH v4] ref-filter: restore prefix-scoped iteration Message-ID: In-Reply-To: <20260612-fix-git-branch-regression-v4-1-f150038c02f4@gmail.com> On Fri, Jun 12, 2026 at 5:27 PM Tamir Duberstein wrote: > > dabecb9db2 (for-each-ref: introduce a '--start-after' option, > 2025-07-15) changed branch, remote-tracking branch, and tag enumeration > from constructing an iterator with the namespace prefix to constructing > an unscoped iterator and seeking to the prefix. > > Review of --start-after noted that the construction prefix and seek > position represent different state and are easy to conflate [1]. It also > noted that future branch or tag support would need to retain the > namespace prefix while moving the cursor [2]. > > The files backend constructs its loose-ref iterator with cache priming > enabled. cache_ref_iterator_begin() immediately applies the construction > prefix through cache_ref_iterator_set_prefix(), reading loose refs > beneath it before packed refs are opened. An empty prefix therefore > reads every loose ref, and a later seek cannot undo that I/O. > > For the current single-kind filters, construct the iterator with the > namespace prefix when start_after is not set. Leave the existing > start_after path unchanged; no current command combines it with these > filters, and future support must carry the prefix separately from the > cursor. > > With 10,000 unrelated loose refs in the files backend, the p6300 tests > improve as follows: > > before after > branch 2.74 s 0.11 s > branch --remotes 2.81 s 0.12 s > tag 3.01 s 0.11 s > > [1] https://lore.kernel.org/r/aGZidwwlToWThkn8@pks.im/ > [2] https://lore.kernel.org/r/xmqqikjq7s16.fsf@gitster.g/ > > Fixes: dabecb9db2b2 ("for-each-ref: introduce a '--start-after' option") > Suggested-by: Karthik Nayak > Signed-off-by: Tamir Duberstein > --- > The series is based on a89346e34a (maint) because the regression has > been present in released versions since Git 2.51.0. > --- > Changes in v4: > - Explain the historical references in the commit message. > - Run the new performance cases with both ref backends. > - Drop the Assisted-by trailer. > - Link to v3: https://patch.msgid.link/20260610-fix-git-branch-regression-v3-1-6fd48fad7a53@gmail.com > > Changes in v3: > - Construct the iterator directly with the namespace prefix. > - Explain when the files backend primes its loose-ref cache. > - Condense the commit message and performance results. > - Link to v2: https://patch.msgid.link/20260608-fix-git-branch-regression-v2-1-fd82075a8520@gmail.com > > Changes in v2: > - Extract local variable `store`. > - Link to v1: https://patch.msgid.link/20260605-fix-git-branch-regression-v1-1-02f40ad40929@gmail.com > --- Hi folks, does this look reasonable?