Merge branch 'jk/bloom-leak-fixes'

Various memory leaks in the Bloom-filter code paths that are exposed
when running tests with the 'GIT_TEST_COMMIT_GRAPH_CHANGED_PATHS=1'
environment variable have been plugged.

* jk/bloom-leak-fixes:
  line-log: drop extra copy of range with bloom filters
  revision: avoid leaking bloom keyvecs with multiple traversals
  bloom: make bloom-filter slab initialization idempotent
main
Junio C Hamano 2026-07-15 13:24:19 -07:00
commit 0a4fb3105e
3 changed files with 8 additions and 2 deletions

View File

@ -16,6 +16,7 @@
define_commit_slab(bloom_filter_slab, struct bloom_filter);

static struct bloom_filter_slab bloom_filters;
static int bloom_filter_slab_initialized;

struct pathmap_hash_entry {
struct hashmap_entry entry;
@ -263,7 +264,10 @@ void add_key_to_filter(const struct bloom_key *key,

void init_bloom_filters(void)
{
if (bloom_filter_slab_initialized)
return;
init_bloom_filter_slab(&bloom_filters);
bloom_filter_slab_initialized = 1;
}

static void free_one_bloom_filter(struct bloom_filter *filter)
@ -276,6 +280,7 @@ static void free_one_bloom_filter(struct bloom_filter *filter)
void deinit_bloom_filters(void)
{
deep_clear_bloom_filter_slab(&bloom_filters, free_one_bloom_filter);
bloom_filter_slab_initialized = 0;
}

struct bloom_keyvec *bloom_keyvec_new(const char *path, size_t len,

View File

@ -1141,8 +1141,7 @@ int line_log_process_ranges_arbitrary_commit(struct rev_info *rev, struct commit

if (range) {
if (commit->parents && !bloom_filter_check(rev, commit, range)) {
struct line_log_data *prange = line_log_data_copy(range);
add_line_range(rev, commit->parents->item, prange);
add_line_range(rev, commit->parents->item, range);
clear_commit_line_range(rev, commit);
} else if (commit->parents && commit->parents->next)
changed = process_ranges_merge_commit(rev, commit, range);

View File

@ -707,6 +707,8 @@ cleanup:

static void prepare_to_use_bloom_filter(struct rev_info *revs)
{
release_revisions_bloom_keyvecs(revs);

if (!revs->commits)
return;