]> git.ipfire.org Git - thirdparty/git.git/commitdiff
commit-graph.c: store maximum changed paths
authorTaylor Blau <me@ttaylorr.com>
Thu, 17 Sep 2020 13:34:42 +0000 (09:34 -0400)
committerJunio C Hamano <gitster@pobox.com>
Thu, 17 Sep 2020 16:29:22 +0000 (09:29 -0700)
For now, we assume that there is a fixed constant describing the
maximum number of changed paths we are willing to store in a Bloom
filter.

Prepare for that to (at least partially) not be the case by making it a
member of the 'struct bloom_filter_settings'. This will be helpful in
the subsequent patches by reducing the size of test cases that exercise
storing too many changed paths, as well as preparing for an eventual
future in which this value might change.

This patch alone does not cause newly generated Bloom filters to use
a custom upper-bound on the maximum number of changed paths a single
Bloom filter can hold, that will occur in a later patch.

Signed-off-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
bloom.h
commit-graph.c
t/t4216-log-bloom.sh

diff --git a/bloom.h b/bloom.h
index d8fbb0fbf19631ccb33d2e57590f977467579102..0b9b59a6fea667fcc510dddb7d237e2383111c36 100644 (file)
--- a/bloom.h
+++ b/bloom.h
@@ -28,9 +28,18 @@ struct bloom_filter_settings {
         * that contain n*b bits.
         */
        uint32_t bits_per_entry;
+
+       /*
+        * The maximum number of changed paths per commit
+        * before declaring a Bloom filter to be too-large.
+        *
+        * Not written to the commit-graph file.
+        */
+       uint32_t max_changed_paths;
 };
 
-#define DEFAULT_BLOOM_FILTER_SETTINGS { 1, 7, 10 }
+#define DEFAULT_BLOOM_MAX_CHANGES 512
+#define DEFAULT_BLOOM_FILTER_SETTINGS { 1, 7, 10, DEFAULT_BLOOM_MAX_CHANGES }
 #define BITS_PER_WORD 8
 #define BLOOMDATA_CHUNK_HEADER_SIZE 3 * sizeof(uint32_t)
 
index a516e93d718d2e5a7e13bba460938f4a65de3510..44dceb80459994b19d9d882d912a3364e1a91781 100644 (file)
@@ -417,6 +417,7 @@ struct commit_graph *parse_commit_graph(struct repository *r,
                                graph->bloom_filter_settings->hash_version = hash_version;
                                graph->bloom_filter_settings->num_hashes = get_be32(data + chunk_offset + 4);
                                graph->bloom_filter_settings->bits_per_entry = get_be32(data + chunk_offset + 8);
+                               graph->bloom_filter_settings->max_changed_paths = DEFAULT_BLOOM_MAX_CHANGES;
                        }
                        break;
                }
@@ -1194,6 +1195,7 @@ static void trace2_bloom_filter_settings(struct write_commit_graph_context *ctx)
        jw_object_intmax(&jw, "hash_version", ctx->bloom_settings->hash_version);
        jw_object_intmax(&jw, "num_hashes", ctx->bloom_settings->num_hashes);
        jw_object_intmax(&jw, "bits_per_entry", ctx->bloom_settings->bits_per_entry);
+       jw_object_intmax(&jw, "max_changed_paths", ctx->bloom_settings->max_changed_paths);
        jw_end(&jw);
 
        trace2_data_json("bloom", ctx->r, "settings", &jw);
@@ -1662,6 +1664,8 @@ static int write_commit_graph_file(struct write_commit_graph_context *ctx)
                                                              bloom_settings.bits_per_entry);
                bloom_settings.num_hashes = git_env_ulong("GIT_TEST_BLOOM_SETTINGS_NUM_HASHES",
                                                          bloom_settings.num_hashes);
+               bloom_settings.max_changed_paths = git_env_ulong("GIT_TEST_BLOOM_SETTINGS_MAX_CHANGED_PATHS",
+                                                         bloom_settings.max_changed_paths);
                ctx->bloom_settings = &bloom_settings;
        }
 
index b3d1f596f8dc612bd1d3738c4fb6cc0d73a0aba5..ca7cc7afb71cb9bc0e8e9d0a8414d1d1d9a47872 100755 (executable)
@@ -169,11 +169,11 @@ test_expect_success 'persist filter settings' '
                GIT_TEST_BLOOM_SETTINGS_NUM_HASHES=9 \
                GIT_TEST_BLOOM_SETTINGS_BITS_PER_ENTRY=15 \
                git commit-graph write --reachable --changed-paths &&
-       grep "{\"hash_version\":1,\"num_hashes\":9,\"bits_per_entry\":15}" trace2.txt &&
+       grep "{\"hash_version\":1,\"num_hashes\":9,\"bits_per_entry\":15,\"max_changed_paths\":512" trace2.txt &&
        GIT_TRACE2_EVENT="$(pwd)/trace2-auto.txt" \
                GIT_TRACE2_EVENT_NESTING=5 \
                git commit-graph write --reachable --changed-paths &&
-       grep "{\"hash_version\":1,\"num_hashes\":9,\"bits_per_entry\":15}" trace2-auto.txt
+       grep "{\"hash_version\":1,\"num_hashes\":9,\"bits_per_entry\":15,\"max_changed_paths\":512" trace2-auto.txt
 '
 
 test_expect_success 'correctly report changes over limit' '