Skip to content

Commit-Graph: Verify bloom filter #687

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 9 additions & 3 deletions builtin/commit-graph.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@ static char const * const builtin_commit_graph_usage[] = {
};

static const char * const builtin_commit_graph_verify_usage[] = {
N_("git commit-graph verify [--object-dir <objdir>] [--shallow] [--[no-]progress]"),
N_("git commit-graph verify [--object-dir <objdir>] [--shallow] "
"[--has-changed-paths] [--[no-]progress]"),
NULL
};

Expand All @@ -37,6 +38,7 @@ static struct opts_commit_graph {
int append;
int split;
int shallow;
int has_changed_paths;
int progress;
int enable_changed_paths;
} opts;
Expand Down Expand Up @@ -71,12 +73,14 @@ static int graph_verify(int argc, const char **argv)
int open_ok;
int fd;
struct stat st;
int flags = 0;
enum commit_graph_verify_flags flags = 0;

static struct option builtin_commit_graph_verify_options[] = {
OPT_STRING(0, "object-dir", &opts.obj_dir,
N_("dir"),
N_("The object directory to store the graph")),
OPT_BOOL(0, "has-changed-paths", &opts.has_changed_paths,
N_("verify that the commit-graph includes changed paths")),
OPT_BOOL(0, "shallow", &opts.shallow,
N_("if the commit-graph is split, only verify the tip file")),
OPT_BOOL(0, "progress", &opts.progress, N_("force progress reporting")),
Expand All @@ -94,8 +98,10 @@ static int graph_verify(int argc, const char **argv)
opts.obj_dir = get_object_directory();
if (opts.shallow)
flags |= COMMIT_GRAPH_VERIFY_SHALLOW;
if (opts.has_changed_paths)
flags |= COMMIT_GRAPH_VERIFY_CHANGED_PATHS;
if (opts.progress)
flags |= COMMIT_GRAPH_WRITE_PROGRESS;
flags |= COMMIT_GRAPH_VERIFY_PROGRESS;

odb = find_odb(the_repository, opts.obj_dir);
graph_name = get_commit_graph_filename(odb);
Expand Down
22 changes: 17 additions & 5 deletions commit-graph.c
Original file line number Diff line number Diff line change
Expand Up @@ -250,7 +250,7 @@ struct commit_graph *load_commit_graph_one_fd_st(int fd, struct stat *st,
return ret;
}

static int verify_commit_graph_lite(struct commit_graph *g)
static int verify_commit_graph_lite(struct commit_graph *g, int verify_changed_path)
{
/*
* Basic validation shared between parse_commit_graph()
Expand All @@ -276,6 +276,16 @@ static int verify_commit_graph_lite(struct commit_graph *g)
error("commit-graph is missing the Commit Data chunk");
return 1;
}
if (verify_changed_path) {
if (!g->chunk_bloom_indexes) {
error("commit-graph is missing Bloom Index chunk");
return 1;
}
if (!g->chunk_bloom_data) {
error("commit-graph is missing Bloom Data chunk");
return 1;
}
}

return 0;
}
Expand Down Expand Up @@ -439,7 +449,7 @@ struct commit_graph *parse_commit_graph(void *graph_map, size_t graph_size)

hashcpy(graph->oid.hash, graph->data + graph->data_len - graph->hash_len);

if (verify_commit_graph_lite(graph))
if (verify_commit_graph_lite(graph, 0))
goto free_and_return;

return graph;
Expand Down Expand Up @@ -2216,7 +2226,9 @@ static void graph_report(const char *fmt, ...)
#define GENERATION_ZERO_EXISTS 1
#define GENERATION_NUMBER_EXISTS 2

int verify_commit_graph(struct repository *r, struct commit_graph *g, int flags)
int verify_commit_graph(struct repository *r,
struct commit_graph *g,
enum commit_graph_verify_flags flags)
{
uint32_t i, cur_fanout_pos = 0;
struct object_id prev_oid, cur_oid, checksum;
Expand All @@ -2231,7 +2243,7 @@ int verify_commit_graph(struct repository *r, struct commit_graph *g, int flags)
return 1;
}

verify_commit_graph_error = verify_commit_graph_lite(g);
verify_commit_graph_error = verify_commit_graph_lite(g, flags & COMMIT_GRAPH_VERIFY_CHANGED_PATHS);
if (verify_commit_graph_error)
return verify_commit_graph_error;

Expand Down Expand Up @@ -2284,7 +2296,7 @@ int verify_commit_graph(struct repository *r, struct commit_graph *g, int flags)
if (verify_commit_graph_error & ~VERIFY_COMMIT_GRAPH_ERROR_HASH)
return verify_commit_graph_error;

if (flags & COMMIT_GRAPH_WRITE_PROGRESS)
if (flags & COMMIT_GRAPH_VERIFY_PROGRESS)
progress = start_progress(_("Verifying commits in commit graph"),
g->num_commits);

Expand Down
12 changes: 9 additions & 3 deletions commit-graph.h
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,12 @@ enum commit_graph_write_flags {
COMMIT_GRAPH_WRITE_BLOOM_FILTERS = (1 << 3),
};

enum commit_graph_verify_flags {
COMMIT_GRAPH_VERIFY_SHALLOW = (1 << 0),
COMMIT_GRAPH_VERIFY_CHANGED_PATHS = (1 << 1),
COMMIT_GRAPH_VERIFY_PROGRESS = (1 << 2),
};

enum commit_graph_split_flags {
COMMIT_GRAPH_SPLIT_UNSPECIFIED = 0,
COMMIT_GRAPH_SPLIT_MERGE_PROHIBITED = 1,
Expand Down Expand Up @@ -122,9 +128,9 @@ int write_commit_graph(struct object_directory *odb,
enum commit_graph_write_flags flags,
const struct split_commit_graph_opts *split_opts);

#define COMMIT_GRAPH_VERIFY_SHALLOW (1 << 0)

int verify_commit_graph(struct repository *r, struct commit_graph *g, int flags);
int verify_commit_graph(struct repository *r,
struct commit_graph *g,
enum commit_graph_verify_flags flags);

void close_commit_graph(struct raw_object_store *);
void free_commit_graph(struct commit_graph *);
Expand Down