]> git.ipfire.org Git - thirdparty/git.git/commitdiff
Merge branch 'ps/reftable-iteration-perf-part2'
authorJunio C Hamano <gitster@pobox.com>
Thu, 14 Mar 2024 21:05:23 +0000 (14:05 -0700)
committerJunio C Hamano <gitster@pobox.com>
Thu, 14 Mar 2024 21:05:23 +0000 (14:05 -0700)
The code to iterate over refs with the reftable backend has seen
some optimization.

* ps/reftable-iteration-perf-part2:
  refs/reftable: precompute prefix length
  reftable: allow inlining of a few functions
  reftable/record: decode keys in place
  reftable/record: reuse refname when copying
  reftable/record: reuse refname when decoding
  reftable/merged: avoid duplicate pqueue emptiness check
  reftable/merged: circumvent pqueue with single subiter
  reftable/merged: handle subiter cleanup on close only
  reftable/merged: remove unnecessary null check for subiters
  reftable/merged: make subiters own their records
  reftable/merged: advance subiter on subsequent iteration
  reftable/merged: make `merged_iter` structure private
  reftable/pq: use `size_t` to track iterator index

1  2 
refs/reftable-backend.c

index 2c88bbd448b18785200a83b7a9e4e794cc364d60,4d27fdde541f1ee5ab8f555e20b5de28b1c11144..74dab18eda50f8158f3e8c133a8dde70299ce3cb
@@@ -364,18 -365,15 +365,18 @@@ static int reftable_ref_iterator_advanc
                        break;
  
                /*
 -               * The files backend only lists references contained in
 -               * "refs/". We emulate the same behaviour here and thus skip
 -               * all references that don't start with this prefix.
 +               * The files backend only lists references contained in "refs/" unless
 +               * the root refs are to be included. We emulate the same behaviour here.
                 */
 -              if (!starts_with(iter->ref.refname, "refs/"))
 +              if (!starts_with(iter->ref.refname, "refs/") &&
 +                  !(iter->flags & DO_FOR_EACH_INCLUDE_ROOT_REFS &&
 +                   (is_pseudoref(&iter->refs->base, iter->ref.refname) ||
 +                    is_headref(&iter->refs->base, iter->ref.refname)))) {
                        continue;
 +              }
  
-               if (iter->prefix &&
-                   strncmp(iter->prefix, iter->ref.refname, strlen(iter->prefix))) {
+               if (iter->prefix_len &&
+                   strncmp(iter->prefix, iter->ref.refname, iter->prefix_len)) {
                        iter->err = 1;
                        break;
                }
@@@ -482,8 -480,9 +483,9 @@@ static struct reftable_ref_iterator *re
        int ret;
  
        iter = xcalloc(1, sizeof(*iter));
 -      base_ref_iterator_init(&iter->base, &reftable_ref_iterator_vtable, 1);
 +      base_ref_iterator_init(&iter->base, &reftable_ref_iterator_vtable);
        iter->prefix = prefix;
+       iter->prefix_len = prefix ? strlen(prefix) : 0;
        iter->base.oid = &iter->oid;
        iter->flags = flags;
        iter->refs = refs;