git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v7 11/16] bloom: prepare to discard incompatible Bloom filters

From
Taylor Blau <me@ttaylorr.com>
Date
Jun 25, 2024, 17:39 UTC
Message-ID
<99ab9cf448eea65db1a561a79223fe70073d1be0.1719333276.git.me@ttaylorr.com>
In-Reply-To
<cover.1719333276.git.me@ttaylorr.com>

Callers use the inline `get_bloom_filter()` implementation as a thin wrapper around `get_or_compute_bloom_filter()`. The former calls the latter with a value of "0" for `compute_if_not_present`, making `get_bloom_filter()` the default read-only path for fetching an existing Bloom filter.

Callers expect the value returned from `get_bloom_filter()` is usable, that is that it's compatible with the configured value corresponding to `commitGraph.changedPathsVersion`.

This is OK, since the commit-graph machinery only initializes its BDAT chunk (thereby enabling it to service Bloom filter queries) when the Bloom filter hash_version is compatible with our settings. So any value returned by `get_bloom_filter()` is trivially useable.

However, subsequent commits will load the BDAT chunk even when the Bloom filters are built with incompatible hash versions. Prepare to handle this by teaching `get_bloom_filter()` to discard filters that are incompatible with the configured hash version.

Callers who wish to read incompatible filters (e.g., for upgrading filters from v1 to v2) may use the lower level routine, `get_or_compute_bloom_filter()`.

Signed-off-by: Taylor Blau <me@ttaylorr.com>
---
 bloom.c | 20 +++++++++++++++++++-
 bloom.h | 20 ++++++++++++++++++--
 2 files changed, 37 insertions(+), 3 deletions(-)
diff --git a/bloom.c b/bloom.c
index e64e53bc4c..c24489dbcf 100644
--- a/bloom.c
+++ b/bloom.c
@@ -220,6 +220,23 @@ static void init_truncated_large_filter(struct bloom_filter *filter,
 	filter->version = version;
 }
 
+struct bloom_filter *get_bloom_filter(struct repository *r, struct commit *c)
+{
+	struct bloom_filter *filter;
+	int hash_version;
+
+	filter = get_or_compute_bloom_filter(r, c, 0, NULL, NULL);
+	if (!filter)
+		return NULL;
+
+	prepare_repo_settings(r);
+	hash_version = r->settings.commit_graph_changed_paths_version;
+
+	if (!(hash_version == -1 || hash_version == filter->version))
+		return NULL; /* unusable filter */
+	return filter;
+}
+
 struct bloom_filter *get_or_compute_bloom_filter(struct repository *r,
 						 struct commit *c,
 						 int compute_if_not_present,
@@ -245,7 +262,8 @@ struct bloom_filter *get_or_compute_bloom_filter(struct repository *r,
 						     filter, graph_pos);
 	}
 
-	if (filter->data && filter->len)
+	if ((filter->data && filter->len) &&
+	    (!settings || settings->hash_version == filter->version))
 		return filter;
 	if (!compute_if_not_present)
 		return NULL;
diff --git a/bloom.h b/bloom.h
index c9dd7d4022..052a993aab 100644
--- a/bloom.h
+++ b/bloom.h
@@ -108,8 +108,24 @@ struct bloom_filter *get_or_compute_bloom_filter(struct repository *r,
 						 const struct bloom_filter_settings *settings,
 						 enum bloom_filter_computed *computed);
 
-#define get_bloom_filter(r, c) get_or_compute_bloom_filter( \
-	(r), (c), 0, NULL, NULL)
+/*
+ * Find the Bloom filter associated with the given commit "c".
+ *
+ * If any of the following are true
+ *
+ *   - the repository does not have a commit-graph, or
+ *   - the repository disables reading from the commit-graph, or
+ *   - the given commit does not have a Bloom filter computed, or
+ *   - there is a Bloom filter for commit "c", but it cannot be read
+ *     because the filter uses an incompatible version of murmur3
+ *
+ * , then `get_bloom_filter()` will return NULL. Otherwise, the corresponding
+ * Bloom filter will be returned.
+ *
+ * For callers who wish to inspect Bloom filters with incompatible hash
+ * versions, use get_or_compute_bloom_filter().
+ */
+struct bloom_filter *get_bloom_filter(struct repository *r, struct commit *c);
 
 int bloom_filter_contains(const struct bloom_filter *filter,
 			  const struct bloom_key *key,
-- 
2.45.2.664.g446e6a2b1f
Previous: Taylor BlauNext: Taylor Blau
Message 31 of 36 in “bloom: changed-path Bloom filters v2 (& sundries)”
  1. 00/16 bloom: changed-path Bloom filters v2 (& sundries)Taylor Blau, Jan 31, 2024
  2. 01/16 t/t4216-log-bloom.sh: harden `test_bloom_filters_not_used()`Taylor Blau, Jan 31, 2024
  3. 02/16 revision.c: consult Bloom filters for root commitsTaylor Blau, Jan 31, 2024
  4. 03/16 commit-graph: ensure Bloom filters are read with consistent settingsTaylor Blau, Jan 31, 2024
  5. 04/16 gitformat-commit-graph: describe version 2 of BDATTaylor Blau, Jan 31, 2024
  6. 05/16 t/helper/test-read-graph.c: extract `dump_graph_info()`Taylor Blau, Jan 31, 2024
  7. 06/16 bloom.h: make `load_bloom_filter_from_graph()` publicTaylor Blau, Jan 31, 2024
  8. 07/16 t/helper/test-read-graph: implement `bloom-filters` modeTaylor Blau, Jan 31, 2024
  9. 08/16 t4216: test changed path filters with high bit pathsTaylor Blau, Jan 31, 2024
  10. 09/16 repo-settings: introduce commitgraph.changedPathsVersionTaylor Blau, Jan 31, 2024
  11. 10/16 bloom: annotate filters with hash versionTaylor Blau, Jan 31, 2024
  12. 11/16 bloom: prepare to discard incompatible Bloom filtersTaylor Blau, Jan 31, 2024
  13. 12/16 commit-graph: unconditionally load Bloom filtersTaylor Blau, Jan 31, 2024
  14. 13/16 commit-graph: new Bloom filter version that fixes murmur3Taylor Blau, Jan 31, 2024
  15. SZEDER GáborFeb 25, 2024
  16. Jiang XinFeb 28, 2024
  17. 14/16 object.h: fix mis-aligned flag bits tableTaylor Blau, Jan 31, 2024
  18. 15/16 commit-graph: reuse existing Bloom filters where possibleTaylor Blau, Jan 31, 2024
  19. 16/16 bloom: introduce `deinit_bloom_filters()`Taylor Blau, Jan 31, 2024
  20. 00/16 bloom: changed-path Bloom filters v2 (& sundries)Taylor Blau, Jun 25, 2024
  21. 01/16 t/t4216-log-bloom.sh: harden `test_bloom_filters_not_used()`Taylor Blau, Jun 25, 2024
  22. 02/16 revision.c: consult Bloom filters for root commitsTaylor Blau, Jun 25, 2024
  23. 03/16 commit-graph: ensure Bloom filters are read with consistent settingsTaylor Blau, Jun 25, 2024
  24. 04/16 gitformat-commit-graph: describe version 2 of BDATTaylor Blau, Jun 25, 2024
  25. 05/16 t/helper/test-read-graph.c: extract `dump_graph_info()`Taylor Blau, Jun 25, 2024
  26. 06/16 bloom.h: make `load_bloom_filter_from_graph()` publicTaylor Blau, Jun 25, 2024
  27. 07/16 t/helper/test-read-graph: implement `bloom-filters` modeTaylor Blau, Jun 25, 2024
  28. 08/16 t4216: test changed path filters with high bit pathsTaylor Blau, Jun 25, 2024
  29. 09/16 repo-settings: introduce commitgraph.changedPathsVersionTaylor Blau, Jun 25, 2024
  30. 10/16 bloom: annotate filters with hash versionTaylor Blau, Jun 25, 2024
  31. 11/16 bloom: prepare to discard incompatible Bloom filtersTaylor Blau, Jun 25, 2024
  32. 12/16 commit-graph: unconditionally load Bloom filtersTaylor Blau, Jun 25, 2024
  33. 13/16 commit-graph: new Bloom filter version that fixes murmur3Taylor Blau, Jun 25, 2024
  34. 14/16 object.h: fix mis-aligned flag bits tableTaylor Blau, Jun 25, 2024
  35. 15/16 commit-graph: reuse existing Bloom filters where possibleTaylor Blau, Jun 25, 2024
  36. 16/16 bloom: introduce `deinit_bloom_filters()`Taylor Blau, Jun 25, 2024

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.