mirror of
https://github.com/git/git.git
synced 2024-11-08 14:09:26 +01:00
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 <jonathantanmy@google.com> Signed-off-by: Taylor Blau <me@ttaylorr.com> Signed-off-by: Junio C Hamano <gitster@pobox.com> Signed-off-by: Taylor Blau <me@ttaylorr.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
5421e7c3a1
commit
9c8a9ec787
16
bloom.c
16
bloom.c
@ -92,6 +92,7 @@ int load_bloom_filter_from_graph(struct commit_graph *g,
|
|||||||
sizeof(unsigned char) * start_index +
|
sizeof(unsigned char) * start_index +
|
||||||
BLOOMDATA_CHUNK_HEADER_SIZE);
|
BLOOMDATA_CHUNK_HEADER_SIZE);
|
||||||
filter->version = g->bloom_filter_settings->hash_version;
|
filter->version = g->bloom_filter_settings->hash_version;
|
||||||
|
filter->to_free = NULL;
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -264,6 +265,18 @@ void init_bloom_filters(void)
|
|||||||
init_bloom_filter_slab(&bloom_filters);
|
init_bloom_filter_slab(&bloom_filters);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void free_one_bloom_filter(struct bloom_filter *filter)
|
||||||
|
{
|
||||||
|
if (!filter)
|
||||||
|
return;
|
||||||
|
free(filter->to_free);
|
||||||
|
}
|
||||||
|
|
||||||
|
void deinit_bloom_filters(void)
|
||||||
|
{
|
||||||
|
deep_clear_bloom_filter_slab(&bloom_filters, free_one_bloom_filter);
|
||||||
|
}
|
||||||
|
|
||||||
static int pathmap_cmp(const void *hashmap_cmp_fn_data UNUSED,
|
static int pathmap_cmp(const void *hashmap_cmp_fn_data UNUSED,
|
||||||
const struct hashmap_entry *eptr,
|
const struct hashmap_entry *eptr,
|
||||||
const struct hashmap_entry *entry_or_key,
|
const struct hashmap_entry *entry_or_key,
|
||||||
@ -280,7 +293,7 @@ static int pathmap_cmp(const void *hashmap_cmp_fn_data UNUSED,
|
|||||||
static void init_truncated_large_filter(struct bloom_filter *filter,
|
static void init_truncated_large_filter(struct bloom_filter *filter,
|
||||||
int version)
|
int version)
|
||||||
{
|
{
|
||||||
filter->data = xmalloc(1);
|
filter->data = filter->to_free = xmalloc(1);
|
||||||
filter->data[0] = 0xFF;
|
filter->data[0] = 0xFF;
|
||||||
filter->len = 1;
|
filter->len = 1;
|
||||||
filter->version = version;
|
filter->version = version;
|
||||||
@ -482,6 +495,7 @@ struct bloom_filter *get_or_compute_bloom_filter(struct repository *r,
|
|||||||
filter->len = 1;
|
filter->len = 1;
|
||||||
}
|
}
|
||||||
CALLOC_ARRAY(filter->data, filter->len);
|
CALLOC_ARRAY(filter->data, filter->len);
|
||||||
|
filter->to_free = filter->data;
|
||||||
|
|
||||||
hashmap_for_each_entry(&pathmap, &iter, e, entry) {
|
hashmap_for_each_entry(&pathmap, &iter, e, entry) {
|
||||||
struct bloom_key key;
|
struct bloom_key key;
|
||||||
|
3
bloom.h
3
bloom.h
@ -56,6 +56,8 @@ struct bloom_filter {
|
|||||||
unsigned char *data;
|
unsigned char *data;
|
||||||
size_t len;
|
size_t len;
|
||||||
int version;
|
int version;
|
||||||
|
|
||||||
|
void *to_free;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -96,6 +98,7 @@ void add_key_to_filter(const struct bloom_key *key,
|
|||||||
const struct bloom_filter_settings *settings);
|
const struct bloom_filter_settings *settings);
|
||||||
|
|
||||||
void init_bloom_filters(void);
|
void init_bloom_filters(void);
|
||||||
|
void deinit_bloom_filters(void);
|
||||||
|
|
||||||
enum bloom_filter_computed {
|
enum bloom_filter_computed {
|
||||||
BLOOM_NOT_COMPUTED = (1 << 0),
|
BLOOM_NOT_COMPUTED = (1 << 0),
|
||||||
|
@ -828,6 +828,7 @@ struct bloom_filter_settings *get_bloom_filter_settings(struct repository *r)
|
|||||||
void close_commit_graph(struct raw_object_store *o)
|
void close_commit_graph(struct raw_object_store *o)
|
||||||
{
|
{
|
||||||
clear_commit_graph_data_slab(&commit_graph_data_slab);
|
clear_commit_graph_data_slab(&commit_graph_data_slab);
|
||||||
|
deinit_bloom_filters();
|
||||||
free_commit_graph(o->commit_graph);
|
free_commit_graph(o->commit_graph);
|
||||||
o->commit_graph = NULL;
|
o->commit_graph = NULL;
|
||||||
}
|
}
|
||||||
@ -2646,6 +2647,9 @@ int write_commit_graph(struct object_directory *odb,
|
|||||||
|
|
||||||
res = write_commit_graph_file(ctx);
|
res = write_commit_graph_file(ctx);
|
||||||
|
|
||||||
|
if (ctx->changed_paths)
|
||||||
|
deinit_bloom_filters();
|
||||||
|
|
||||||
if (ctx->split)
|
if (ctx->split)
|
||||||
mark_commit_graphs(ctx);
|
mark_commit_graphs(ctx);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user