Skip to content

Commit bb4d60e

Browse files
szedergitster
authored andcommitted
commit-graph: simplify write_commit_graph_file() #1
In write_commit_graph_file() one block of code fills the array of chunk IDs, another block of code fills the array of chunk offsets, then the chunk IDs and offsets are written to the Chunk Lookup table, and finally a third block of code writes the actual chunks. In case of optional chunks like Extra Edge List and Base Graphs List there is also a condition checking whether that chunk is necessary/desired, and that same condition is repeated in all those three blocks of code. This patch series is about to add more optional chunks, so there would be even more repeated conditions. Those chunk offsets are relative to the beginning of the file, so they inherently depend on the size of the Chunk Lookup table, which in turn depends on the number of chunks that are to be written to the commit-graph file. IOW at the time we set the first chunk's ID we can't yet know its offset, because we don't yet know how many chunks there are. Simplify this by initially filling an array of chunk sizes, not offsets, and calculate the offsets based on the chunk sizes only later, while we are writing the Chunk Lookup table. This way we can fill the arrays of chunk IDs and sizes in one go, eliminating one set of repeated conditions. Signed-off-by: SZEDER Gábor <[email protected]> Signed-off-by: Derrick Stolee <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 5cfa438 commit bb4d60e

File tree

1 file changed

+17
-29
lines changed

1 file changed

+17
-29
lines changed

commit-graph.c

Lines changed: 17 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1529,10 +1529,11 @@ static int write_commit_graph_file(struct write_commit_graph_context *ctx)
15291529
struct hashfile *f;
15301530
struct lock_file lk = LOCK_INIT;
15311531
uint32_t chunk_ids[MAX_NUM_CHUNKS + 1];
1532-
uint64_t chunk_offsets[MAX_NUM_CHUNKS + 1];
1532+
uint64_t chunk_sizes[MAX_NUM_CHUNKS + 1];
15331533
const unsigned hashsz = the_hash_algo->rawsz;
15341534
struct strbuf progress_title = STRBUF_INIT;
15351535
int num_chunks = 3;
1536+
uint64_t chunk_offset;
15361537
struct object_id file_hash;
15371538
const struct bloom_filter_settings bloom_settings = DEFAULT_BLOOM_FILTER_SETTINGS;
15381539

@@ -1573,50 +1574,34 @@ static int write_commit_graph_file(struct write_commit_graph_context *ctx)
15731574
}
15741575

15751576
chunk_ids[0] = GRAPH_CHUNKID_OIDFANOUT;
1577+
chunk_sizes[0] = GRAPH_FANOUT_SIZE;
15761578
chunk_ids[1] = GRAPH_CHUNKID_OIDLOOKUP;
1579+
chunk_sizes[1] = hashsz * ctx->commits.nr;
15771580
chunk_ids[2] = GRAPH_CHUNKID_DATA;
1581+
chunk_sizes[2] = (hashsz + 16) * ctx->commits.nr;
1582+
15781583
if (ctx->num_extra_edges) {
15791584
chunk_ids[num_chunks] = GRAPH_CHUNKID_EXTRAEDGES;
1585+
chunk_sizes[num_chunks] = 4 * ctx->num_extra_edges;
15801586
num_chunks++;
15811587
}
15821588
if (ctx->changed_paths) {
15831589
chunk_ids[num_chunks] = GRAPH_CHUNKID_BLOOMINDEXES;
1590+
chunk_sizes[num_chunks] = sizeof(uint32_t) * ctx->commits.nr;
15841591
num_chunks++;
15851592
chunk_ids[num_chunks] = GRAPH_CHUNKID_BLOOMDATA;
1593+
chunk_sizes[num_chunks] = sizeof(uint32_t) * 3
1594+
+ ctx->total_bloom_filter_data_size;
15861595
num_chunks++;
15871596
}
15881597
if (ctx->num_commit_graphs_after > 1) {
15891598
chunk_ids[num_chunks] = GRAPH_CHUNKID_BASE;
1599+
chunk_sizes[num_chunks] = hashsz * (ctx->num_commit_graphs_after - 1);
15901600
num_chunks++;
15911601
}
15921602

15931603
chunk_ids[num_chunks] = 0;
1594-
1595-
chunk_offsets[0] = 8 + (num_chunks + 1) * GRAPH_CHUNKLOOKUP_WIDTH;
1596-
chunk_offsets[1] = chunk_offsets[0] + GRAPH_FANOUT_SIZE;
1597-
chunk_offsets[2] = chunk_offsets[1] + hashsz * ctx->commits.nr;
1598-
chunk_offsets[3] = chunk_offsets[2] + (hashsz + 16) * ctx->commits.nr;
1599-
1600-
num_chunks = 3;
1601-
if (ctx->num_extra_edges) {
1602-
chunk_offsets[num_chunks + 1] = chunk_offsets[num_chunks] +
1603-
4 * ctx->num_extra_edges;
1604-
num_chunks++;
1605-
}
1606-
if (ctx->changed_paths) {
1607-
chunk_offsets[num_chunks + 1] = chunk_offsets[num_chunks] +
1608-
sizeof(uint32_t) * ctx->commits.nr;
1609-
num_chunks++;
1610-
1611-
chunk_offsets[num_chunks + 1] = chunk_offsets[num_chunks] +
1612-
sizeof(uint32_t) * 3 + ctx->total_bloom_filter_data_size;
1613-
num_chunks++;
1614-
}
1615-
if (ctx->num_commit_graphs_after > 1) {
1616-
chunk_offsets[num_chunks + 1] = chunk_offsets[num_chunks] +
1617-
hashsz * (ctx->num_commit_graphs_after - 1);
1618-
num_chunks++;
1619-
}
1604+
chunk_sizes[num_chunks] = 0;
16201605

16211606
hashwrite_be32(f, GRAPH_SIGNATURE);
16221607

@@ -1625,13 +1610,16 @@ static int write_commit_graph_file(struct write_commit_graph_context *ctx)
16251610
hashwrite_u8(f, num_chunks);
16261611
hashwrite_u8(f, ctx->num_commit_graphs_after - 1);
16271612

1613+
chunk_offset = 8 + (num_chunks + 1) * GRAPH_CHUNKLOOKUP_WIDTH;
16281614
for (i = 0; i <= num_chunks; i++) {
16291615
uint32_t chunk_write[3];
16301616

16311617
chunk_write[0] = htonl(chunk_ids[i]);
1632-
chunk_write[1] = htonl(chunk_offsets[i] >> 32);
1633-
chunk_write[2] = htonl(chunk_offsets[i] & 0xffffffff);
1618+
chunk_write[1] = htonl(chunk_offset >> 32);
1619+
chunk_write[2] = htonl(chunk_offset & 0xffffffff);
16341620
hashwrite(f, chunk_write, 12);
1621+
1622+
chunk_offset += chunk_sizes[i];
16351623
}
16361624

16371625
if (ctx->report_progress) {

0 commit comments

Comments
 (0)