Skip to content

Commit 638e170

Browse files
ttaylorrgitster
authored andcommitted
commit-graph: unconditionally load Bloom filters
In an earlier commit, we began ignoring the Bloom data ("BDAT") chunk for commit-graphs whose Bloom filters were computed using a hash version incompatible with the value of `commitGraph.changedPathVersion`. Now that the Bloom API has been hardened to discard these incompatible filters (with the exception of low-level APIs), we can safely load these Bloom filters unconditionally. We no longer want to return early from `graph_read_bloom_data()`, and similarly do not want to set the bloom_settings' `hash_version` field as a side-effect. The latter is because we want to wait until we know which Bloom settings we're using (either the defaults, from the GIT_TEST variables, or from the previous commit-graph layer) before deciding what hash_version to use. If we detect an existing BDAT chunk, we'll infer the rest of the settings (e.g., number of hashes, bits per entry, and maximum number of changed paths) from the earlier graph layer. The hash_version will be inferred from the previous layer as well, unless one has already been specified via configuration. Once all of that is done, we normalize the value of the hash_version to either "1" or "2". Signed-off-by: Taylor Blau <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent b2cf331 commit 638e170

File tree

1 file changed

+10
-4
lines changed

1 file changed

+10
-4
lines changed

commit-graph.c

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -358,9 +358,6 @@ static int graph_read_bloom_data(const unsigned char *chunk_start,
358358
g->chunk_bloom_data_size = chunk_size;
359359
hash_version = get_be32(chunk_start);
360360

361-
if (hash_version != 1)
362-
return 0;
363-
364361
g->bloom_filter_settings = xmalloc(sizeof(struct bloom_filter_settings));
365362
g->bloom_filter_settings->hash_version = hash_version;
366363
g->bloom_filter_settings->num_hashes = get_be32(chunk_start + 4);
@@ -2513,6 +2510,7 @@ int write_commit_graph(struct object_directory *odb,
25132510
ctx->write_generation_data = (get_configured_generation_version(r) == 2);
25142511
ctx->num_generation_data_overflows = 0;
25152512

2513+
bloom_settings.hash_version = r->settings.commit_graph_changed_paths_version;
25162514
bloom_settings.bits_per_entry = git_env_ulong("GIT_TEST_BLOOM_SETTINGS_BITS_PER_ENTRY",
25172515
bloom_settings.bits_per_entry);
25182516
bloom_settings.num_hashes = git_env_ulong("GIT_TEST_BLOOM_SETTINGS_NUM_HASHES",
@@ -2544,10 +2542,18 @@ int write_commit_graph(struct object_directory *odb,
25442542
/* We have changed-paths already. Keep them in the next graph */
25452543
if (g && g->chunk_bloom_data) {
25462544
ctx->changed_paths = 1;
2547-
ctx->bloom_settings = g->bloom_filter_settings;
2545+
2546+
/* don't propagate the hash_version unless unspecified */
2547+
if (bloom_settings.hash_version == -1)
2548+
bloom_settings.hash_version = g->bloom_filter_settings->hash_version;
2549+
bloom_settings.bits_per_entry = g->bloom_filter_settings->bits_per_entry;
2550+
bloom_settings.num_hashes = g->bloom_filter_settings->num_hashes;
2551+
bloom_settings.max_changed_paths = g->bloom_filter_settings->max_changed_paths;
25482552
}
25492553
}
25502554

2555+
bloom_settings.hash_version = bloom_settings.hash_version == 2 ? 2 : 1;
2556+
25512557
if (ctx->split) {
25522558
struct commit_graph *g = ctx->r->objects->commit_graph;
25532559

0 commit comments

Comments
 (0)