Skip to content

Commit 9a7a9ed

Browse files
ttaylorrgitster
authored andcommitted
bloom: use provided 'struct bloom_filter_settings'
When 'get_or_compute_bloom_filter()' needs to compute a Bloom filter from scratch, it looks to the default 'struct bloom_filter_settings' in order to determine the maximum number of changed paths, number of bits per entry, and so on. All of these values have so far been constant, and so there was no need to pass in a pointer from the caller (eg., the one that is stored in the 'struct write_commit_graph_context'). Start passing in a 'struct bloom_filter_settings *' instead of using the default values to respect graph-specific settings (eg., in the case of setting 'GIT_TEST_BLOOM_SETTINGS_MAX_CHANGED_PATHS'). In order to have an initialized value for these settings, move its initialization to earlier in the commit-graph write. Signed-off-by: Taylor Blau <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 312cff5 commit 9a7a9ed

File tree

4 files changed

+19
-19
lines changed

4 files changed

+19
-19
lines changed

bloom.c

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -180,13 +180,12 @@ static int pathmap_cmp(const void *hashmap_cmp_fn_data,
180180
struct bloom_filter *get_or_compute_bloom_filter(struct repository *r,
181181
struct commit *c,
182182
int compute_if_not_present,
183+
const struct bloom_filter_settings *settings,
183184
enum bloom_filter_computed *computed)
184185
{
185186
struct bloom_filter *filter;
186-
struct bloom_filter_settings settings = DEFAULT_BLOOM_FILTER_SETTINGS;
187187
int i;
188188
struct diff_options diffopt;
189-
int max_changes = 512;
190189

191190
if (computed)
192191
*computed = BLOOM_NOT_COMPUTED;
@@ -211,7 +210,7 @@ struct bloom_filter *get_or_compute_bloom_filter(struct repository *r,
211210
repo_diff_setup(r, &diffopt);
212211
diffopt.flags.recursive = 1;
213212
diffopt.detect_rename = 0;
214-
diffopt.max_changes = max_changes;
213+
diffopt.max_changes = settings->max_changed_paths;
215214
diff_setup_done(&diffopt);
216215

217216
/* ensure commit is parsed so we have parent information */
@@ -223,7 +222,7 @@ struct bloom_filter *get_or_compute_bloom_filter(struct repository *r,
223222
diff_tree_oid(NULL, &c->object.oid, "", &diffopt);
224223
diffcore_std(&diffopt);
225224

226-
if (diffopt.num_changes <= max_changes) {
225+
if (diffopt.num_changes <= settings->max_changed_paths) {
227226
struct hashmap pathmap;
228227
struct pathmap_hash_entry *e;
229228
struct hashmap_iter iter;
@@ -260,13 +259,13 @@ struct bloom_filter *get_or_compute_bloom_filter(struct repository *r,
260259
diff_free_filepair(diff_queued_diff.queue[i]);
261260
}
262261

263-
filter->len = (hashmap_get_size(&pathmap) * settings.bits_per_entry + BITS_PER_WORD - 1) / BITS_PER_WORD;
262+
filter->len = (hashmap_get_size(&pathmap) * settings->bits_per_entry + BITS_PER_WORD - 1) / BITS_PER_WORD;
264263
filter->data = xcalloc(filter->len, sizeof(unsigned char));
265264

266265
hashmap_for_each_entry(&pathmap, &iter, e, entry) {
267266
struct bloom_key key;
268-
fill_bloom_key(e->path, strlen(e->path), &key, &settings);
269-
add_key_to_filter(&key, filter, &settings);
267+
fill_bloom_key(e->path, strlen(e->path), &key, settings);
268+
add_key_to_filter(&key, filter, settings);
270269
}
271270

272271
hashmap_free_entries(&pathmap, struct pathmap_hash_entry, entry);

bloom.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,10 +98,11 @@ enum bloom_filter_computed {
9898
struct bloom_filter *get_or_compute_bloom_filter(struct repository *r,
9999
struct commit *c,
100100
int compute_if_not_present,
101+
const struct bloom_filter_settings *settings,
101102
enum bloom_filter_computed *computed);
102103

103104
#define get_bloom_filter(r, c) get_or_compute_bloom_filter( \
104-
(r), (c), 0, NULL)
105+
(r), (c), 0, NULL, NULL)
105106

106107
int bloom_filter_contains(const struct bloom_filter *filter,
107108
const struct bloom_key *key,

commit-graph.c

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1428,6 +1428,7 @@ static void compute_bloom_filters(struct write_commit_graph_context *ctx)
14281428
ctx->r,
14291429
c,
14301430
1,
1431+
ctx->bloom_settings,
14311432
&computed);
14321433
if (computed & BLOOM_COMPUTED) {
14331434
ctx->count_bloom_filter_computed++;
@@ -1685,17 +1686,6 @@ static int write_commit_graph_file(struct write_commit_graph_context *ctx)
16851686
int num_chunks = 3;
16861687
uint64_t chunk_offset;
16871688
struct object_id file_hash;
1688-
struct bloom_filter_settings bloom_settings = DEFAULT_BLOOM_FILTER_SETTINGS;
1689-
1690-
if (!ctx->bloom_settings) {
1691-
bloom_settings.bits_per_entry = git_env_ulong("GIT_TEST_BLOOM_SETTINGS_BITS_PER_ENTRY",
1692-
bloom_settings.bits_per_entry);
1693-
bloom_settings.num_hashes = git_env_ulong("GIT_TEST_BLOOM_SETTINGS_NUM_HASHES",
1694-
bloom_settings.num_hashes);
1695-
bloom_settings.max_changed_paths = git_env_ulong("GIT_TEST_BLOOM_SETTINGS_MAX_CHANGED_PATHS",
1696-
bloom_settings.max_changed_paths);
1697-
ctx->bloom_settings = &bloom_settings;
1698-
}
16991689

17001690
if (ctx->split) {
17011691
struct strbuf tmp_file = STRBUF_INIT;
@@ -2141,6 +2131,7 @@ int write_commit_graph(struct object_directory *odb,
21412131
uint32_t i, count_distinct = 0;
21422132
int res = 0;
21432133
int replace = 0;
2134+
struct bloom_filter_settings bloom_settings = DEFAULT_BLOOM_FILTER_SETTINGS;
21442135

21452136
if (!commit_graph_compatible(the_repository))
21462137
return 0;
@@ -2154,6 +2145,14 @@ int write_commit_graph(struct object_directory *odb,
21542145
ctx->split_opts = split_opts;
21552146
ctx->total_bloom_filter_data_size = 0;
21562147

2148+
bloom_settings.bits_per_entry = git_env_ulong("GIT_TEST_BLOOM_SETTINGS_BITS_PER_ENTRY",
2149+
bloom_settings.bits_per_entry);
2150+
bloom_settings.num_hashes = git_env_ulong("GIT_TEST_BLOOM_SETTINGS_NUM_HASHES",
2151+
bloom_settings.num_hashes);
2152+
bloom_settings.max_changed_paths = git_env_ulong("GIT_TEST_BLOOM_SETTINGS_MAX_CHANGED_PATHS",
2153+
bloom_settings.max_changed_paths);
2154+
ctx->bloom_settings = &bloom_settings;
2155+
21572156
if (flags & COMMIT_GRAPH_WRITE_BLOOM_FILTERS)
21582157
ctx->changed_paths = 1;
21592158
if (!(flags & COMMIT_GRAPH_NO_WRITE_BLOOM_FILTERS)) {

t/helper/test-bloom.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ static void get_bloom_filter_for_commit(const struct object_id *commit_oid)
4040
setup_git_directory();
4141
c = lookup_commit(the_repository, commit_oid);
4242
filter = get_or_compute_bloom_filter(the_repository, c, 1,
43+
&settings,
4344
NULL);
4445
print_bloom_filter(filter);
4546
}

0 commit comments

Comments
 (0)