On Thu, Mar 06, 2025 at 04:08:39PM +0100, Patrick Steinhardt wrote: > refs.c | 12 ++++++++++++ > 1 file changed, 12 insertions(+) > > diff --git a/refs.c b/refs.c > index 5a9b0f2fa1e..eaf41421f50 100644 > --- a/refs.c > +++ b/refs.c > @@ -2476,6 +2476,7 @@ int refs_verify_refnames_available(struct ref_store *refs, > { > struct strbuf dirname = STRBUF_INIT; > struct strbuf referent = STRBUF_INIT; > + struct strset dirnames; > int ret = -1; > > /* > @@ -2485,6 +2486,8 @@ int refs_verify_refnames_available(struct ref_store *refs, > > assert(err); > > + strset_init(&dirnames); > + > for (size_t i = 0; i < refnames->nr; i++) { > const char *refname = refnames->items[i].string; > const char *extra_refname; > @@ -2514,6 +2517,14 @@ int refs_verify_refnames_available(struct ref_store *refs, > if (skip && string_list_has_string(skip, dirname.buf)) > continue; > > + /* > + * If we've already seen the directory we don't need to > + * process it again. Skip it to avoid checking checking > + * common prefixes like "refs/heads/" repeatedly. > + */ > + if (!strset_add(&dirnames, dirname.buf)) > + continue; > + Reading here, I think we should not sort the refnames for "reftable" backend. Anyway, really a nice job for optimizing the speed. > if (!initial_transaction && > !refs_read_raw_ref(refs, dirname.buf, &oid, &referent, > &type, &ignore_errno)) { > @@ -2574,6 +2585,7 @@ int refs_verify_refnames_available(struct ref_store *refs, > cleanup: > strbuf_release(&referent); > strbuf_release(&dirname); > + strset_clear(&dirnames); > return ret; > } > > > -- > 2.49.0.rc0.416.g627208d89d.dirty >