]> git.ipfire.org Git - thirdparty/git.git/commitdiff
Merge branch 'ps/reftable-iteration-perf'
authorJunio C Hamano <gitster@pobox.com>
Tue, 27 Feb 2024 02:10:24 +0000 (18:10 -0800)
committerJunio C Hamano <gitster@pobox.com>
Tue, 27 Feb 2024 02:10:24 +0000 (18:10 -0800)
The code to iterate over refs with the reftable backend has seen
some optimization.

* ps/reftable-iteration-perf:
  reftable/reader: add comments to `table_iter_next()`
  reftable/record: don't try to reallocate ref record name
  reftable/block: swap buffers instead of copying
  reftable/pq: allocation-less comparison of entry keys
  reftable/merged: skip comparison for records of the same subiter
  reftable/merged: allocation-less dropping of shadowed records
  reftable/record: introduce function to compare records by key

1  2 
reftable/block.c
reftable/merged.c
reftable/pq.c
reftable/reader.c
reftable/record.c
reftable/record.h

Simple merge
index a0f222e07bdf7519ed1c0d8d43ccbb6151663c3a,0f74a14a77a9906d73a25ab49d65624e0d5b4791..1aa6cd31b74954da9b1b5140cd350459c37c1378
@@@ -44,13 -45,12 +44,11 @@@ static int merged_iter_init(struct merg
  static void merged_iter_close(void *p)
  {
        struct merged_iter *mi = p;
 -      int i = 0;
 +
        merged_iter_pqueue_release(&mi->pq);
 -      for (i = 0; i < mi->stack_len; i++) {
 +      for (size_t i = 0; i < mi->stack_len; i++)
                reftable_iterator_destroy(&mi->stack[i]);
 -      }
        reftable_free(mi->stack);
-       strbuf_release(&mi->key);
-       strbuf_release(&mi->entry_key);
  }
  
  static int merged_iter_advance_nonnull_subiter(struct merged_iter *mi,
@@@ -243,34 -248,42 +246,32 @@@ static int merged_table_seek_record(str
                .typ = reftable_record_type(rec),
                .hash_id = mt->hash_id,
                .suppress_deletions = mt->suppress_deletions,
-               .key = STRBUF_INIT,
-               .entry_key = STRBUF_INIT,
        };
 -      int n = 0;
 -      int err = 0;
 -      int i = 0;
 -      for (i = 0; i < mt->stack_len && err == 0; i++) {
 -              int e = reftable_table_seek_record(&mt->stack[i], &iters[n],
 -                                                 rec);
 -              if (e < 0) {
 -                      err = e;
 -              }
 -              if (e == 0) {
 -                      n++;
 -              }
 -      }
 -      if (err < 0) {
 -              int i = 0;
 -              for (i = 0; i < n; i++) {
 -                      reftable_iterator_destroy(&iters[i]);
 -              }
 -              reftable_free(iters);
 -              return err;
 +      struct merged_iter *p;
 +      int err;
 +
 +      REFTABLE_CALLOC_ARRAY(merged.stack, mt->stack_len);
 +      for (size_t i = 0; i < mt->stack_len; i++) {
 +              err = reftable_table_seek_record(&mt->stack[i],
 +                                               &merged.stack[merged.stack_len], rec);
 +              if (err < 0)
 +                      goto out;
 +              if (!err)
 +                      merged.stack_len++;
        }
  
 -      merged.stack_len = n;
        err = merged_iter_init(&merged);
 -      if (err < 0) {
 +      if (err < 0)
 +              goto out;
 +
 +      p = reftable_malloc(sizeof(struct merged_iter));
 +      *p = merged;
 +      iterator_from_merged_iter(it, p);
 +
 +out:
 +      if (err < 0)
                merged_iter_close(&merged);
 -              return err;
 -      } else {
 -              struct merged_iter *p =
 -                      reftable_malloc(sizeof(struct merged_iter));
 -              *p = merged;
 -              iterator_from_merged_iter(it, p);
 -      }
 -      return 0;
 +      return err;
  }
  
  int reftable_merged_table_seek_ref(struct reftable_merged_table *mt,
diff --cc reftable/pq.c
Simple merge
Simple merge
Simple merge
index e64ed30c8058cab0ffed789181a3e1909dc5b684,0d96fbfd1bf130b288c0fdac8470cf8432b850af..a05e2be17971d5e26f27871159cda293aa2640ad
@@@ -110,10 -119,8 +116,11 @@@ struct reftable_record 
        } u;
  };
  
 +/* Initialize the reftable record for the given type */
 +void reftable_record_init(struct reftable_record *rec, uint8_t typ);
 +
  /* see struct record_vtable */
+ int reftable_record_cmp(struct reftable_record *a, struct reftable_record *b);
  int reftable_record_equal(struct reftable_record *a, struct reftable_record *b, int hash_size);
  void reftable_record_print(struct reftable_record *rec, int hash_size);
  void reftable_record_key(struct reftable_record *rec, struct strbuf *dest);