Skip to content

Commit 9c8a9ec

Browse files
ttaylorrgitster
authored andcommitted
bloom: introduce deinit_bloom_filters()
After we are done using Bloom filters, we do not currently clean up any memory allocated by the commit slab used to store those filters in the first place. Besides the bloom_filter structures themselves, there is mostly nothing to free() in the first place, since in the read-only path all Bloom filter's `data` members point to a memory mapped region in the commit-graph file itself. But when generating Bloom filters from scratch (or initializing truncated filters) we allocate additional memory to store the filter's data. Keep track of when we need to free() this additional chunk of memory by using an extra pointer `to_free`. Most of the time this will be NULL (indicating that we are representing an existing Bloom filter stored in a memory mapped region). When it is non-NULL, free it before discarding the Bloom filters slab. Suggested-by: Jonathan Tan <[email protected]> Signed-off-by: Taylor Blau <[email protected]> Signed-off-by: Junio C Hamano <[email protected]> Signed-off-by: Taylor Blau <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 5421e7c commit 9c8a9ec

File tree

3 files changed

+22
-1
lines changed

3 files changed

+22
-1
lines changed

bloom.c

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ int load_bloom_filter_from_graph(struct commit_graph *g,
9292
sizeof(unsigned char) * start_index +
9393
BLOOMDATA_CHUNK_HEADER_SIZE);
9494
filter->version = g->bloom_filter_settings->hash_version;
95+
filter->to_free = NULL;
9596

9697
return 1;
9798
}
@@ -264,6 +265,18 @@ void init_bloom_filters(void)
264265
init_bloom_filter_slab(&bloom_filters);
265266
}
266267

268+
static void free_one_bloom_filter(struct bloom_filter *filter)
269+
{
270+
if (!filter)
271+
return;
272+
free(filter->to_free);
273+
}
274+
275+
void deinit_bloom_filters(void)
276+
{
277+
deep_clear_bloom_filter_slab(&bloom_filters, free_one_bloom_filter);
278+
}
279+
267280
static int pathmap_cmp(const void *hashmap_cmp_fn_data UNUSED,
268281
const struct hashmap_entry *eptr,
269282
const struct hashmap_entry *entry_or_key,
@@ -280,7 +293,7 @@ static int pathmap_cmp(const void *hashmap_cmp_fn_data UNUSED,
280293
static void init_truncated_large_filter(struct bloom_filter *filter,
281294
int version)
282295
{
283-
filter->data = xmalloc(1);
296+
filter->data = filter->to_free = xmalloc(1);
284297
filter->data[0] = 0xFF;
285298
filter->len = 1;
286299
filter->version = version;
@@ -482,6 +495,7 @@ struct bloom_filter *get_or_compute_bloom_filter(struct repository *r,
482495
filter->len = 1;
483496
}
484497
CALLOC_ARRAY(filter->data, filter->len);
498+
filter->to_free = filter->data;
485499

486500
hashmap_for_each_entry(&pathmap, &iter, e, entry) {
487501
struct bloom_key key;

bloom.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ struct bloom_filter {
5656
unsigned char *data;
5757
size_t len;
5858
int version;
59+
60+
void *to_free;
5961
};
6062

6163
/*
@@ -96,6 +98,7 @@ void add_key_to_filter(const struct bloom_key *key,
9698
const struct bloom_filter_settings *settings);
9799

98100
void init_bloom_filters(void);
101+
void deinit_bloom_filters(void);
99102

100103
enum bloom_filter_computed {
101104
BLOOM_NOT_COMPUTED = (1 << 0),

commit-graph.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -828,6 +828,7 @@ struct bloom_filter_settings *get_bloom_filter_settings(struct repository *r)
828828
void close_commit_graph(struct raw_object_store *o)
829829
{
830830
clear_commit_graph_data_slab(&commit_graph_data_slab);
831+
deinit_bloom_filters();
831832
free_commit_graph(o->commit_graph);
832833
o->commit_graph = NULL;
833834
}
@@ -2646,6 +2647,9 @@ int write_commit_graph(struct object_directory *odb,
26462647

26472648
res = write_commit_graph_file(ctx);
26482649

2650+
if (ctx->changed_paths)
2651+
deinit_bloom_filters();
2652+
26492653
if (ctx->split)
26502654
mark_commit_graphs(ctx);
26512655

0 commit comments

Comments
 (0)