Re: [PATCH v5 08/16] refs: stop re-verifying common prefixes for availability
- From
shejialuo <shejialuo@gmail.com>
- Date
- Mar 12, 2025, 13:22 UTC
- Message-ID
- <Z9GKs9z4n4qgOP7n@ArchLinux>
- In-Reply-To
- <20250306-pks-update-ref-optimization-v5-8-dcb2ee037e97@pks.im>
On Thu, Mar 06, 2025 at 04:08:39PM +0100, Patrick Steinhardt wrote:
Show 36 quoted lines
> 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.
Show 15 quoted lines
> 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
>