Add progress reporting during the QSORT operation in multi-pack-index verification. This helps users track the progress of large sorting operations. In previous versions, the progress would jump directly from 0% to 100% without any intermediate updates. Signed-off-by: Ayush Chandekar <ayu.chandekar@xxxxxxxxx> --- midx.c | 43 +++++++++++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/midx.c b/midx.c index d91088efb8..69937f5ca8 100644 --- a/midx.c +++ b/midx.c @@ -14,6 +14,7 @@ #include "pack-bitmap.h" #include "pack-revindex.h" + int midx_checksum_valid(struct multi_pack_index *m); void clear_midx_files_ext(const char *object_dir, const char *ext, const char *keep_hash); @@ -853,32 +854,43 @@ static void midx_report(const char *fmt, ...) va_end(ap); } +/* + * Limit calls to display_progress() for performance reasons. + * The interval here was arbitrarily chosen. + */ +#define SPARSE_PROGRESS_INTERVAL (1 << 12) +#define midx_display_sparse_progress(progress, n) \ + do { \ + uint64_t _n = (n); \ + if ((_n & (SPARSE_PROGRESS_INTERVAL - 1)) == 0) \ + display_progress(progress, _n); \ + } while (0) + struct pair_pos_vs_id { uint32_t pos; uint32_t pack_int_id; }; +static struct progress *sort_progress; +static uint64_t last_max_pos; + static int compare_pair_pos_vs_id(const void *_a, const void *_b) { struct pair_pos_vs_id *a = (struct pair_pos_vs_id *)_a; struct pair_pos_vs_id *b = (struct pair_pos_vs_id *)_b; + + if (sort_progress) { + uint64_t max_pos = (a->pos > b->pos) ? a->pos : b->pos; + if (max_pos > last_max_pos) { + last_max_pos = max_pos; + midx_display_sparse_progress(sort_progress, last_max_pos); + } + } return b->pack_int_id - a->pack_int_id; } -/* - * Limit calls to display_progress() for performance reasons. - * The interval here was arbitrarily chosen. - */ -#define SPARSE_PROGRESS_INTERVAL (1 << 12) -#define midx_display_sparse_progress(progress, n) \ - do { \ - uint64_t _n = (n); \ - if ((_n & (SPARSE_PROGRESS_INTERVAL - 1)) == 0) \ - display_progress(progress, _n); \ - } while (0) - int verify_midx_file(struct repository *r, const char *object_dir, unsigned flags) { struct pair_pos_vs_id *pairs = NULL; @@ -960,12 +972,15 @@ int verify_midx_file(struct repository *r, const char *object_dir, unsigned flag pairs[i].pack_int_id = nth_midxed_pack_int_id(m, i); } - if (flags & MIDX_PROGRESS) + if (flags & MIDX_PROGRESS) { progress = start_sparse_progress(r, _("Sorting objects by packfile"), m->num_objects); - display_progress(progress, 0); /* TODO: Measure QSORT() progress */ + last_max_pos = 0; + sort_progress = progress; + } QSORT(pairs, m->num_objects, compare_pair_pos_vs_id); + sort_progress = NULL; stop_progress(&progress); if (flags & MIDX_PROGRESS) -- 2.48.GIT