@matheusbsbs / matheus-bagliano / commits / bb4d60e5d5
Fork 0

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 <szeder.dev@gmail.com> Signed-off-by: Derrick Stolee <dstolee@microsoft.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

SZEDER Gábor committed Jun 5, 2020 at 13:00 UTC bb4d60e5d536009e0c97bfa7f464416c29c04c81
1 file changed +17 -29
commit-graph.c
+17 -29
@@ -1529,10 +1529,11 @@ static int write_commit_graph_file(struct write_commit_graph_context *ctx)
1529 struct hashfile *f;
1530 struct lock_file lk = LOCK_INIT;
1531 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];
1533 const unsigned hashsz = the_hash_algo->rawsz;
1534 struct strbuf progress_title = STRBUF_INIT;
1535 int num_chunks = 3;
1536 + uint64_t chunk_offset;
1537 struct object_id file_hash;
1538 const struct bloom_filter_settings bloom_settings = DEFAULT_BLOOM_FILTER_SETTINGS;
1539
@@ -1573,50 +1574,34 @@ static int write_commit_graph_file(struct write_commit_graph_context *ctx)
1574 }
1575
1576 chunk_ids[0] = GRAPH_CHUNKID_OIDFANOUT;
1577 + chunk_sizes[0] = GRAPH_FANOUT_SIZE;
1578 chunk_ids[1] = GRAPH_CHUNKID_OIDLOOKUP;
1579 + chunk_sizes[1] = hashsz * ctx->commits.nr;
1580 chunk_ids[2] = GRAPH_CHUNKID_DATA;
1581 + chunk_sizes[2] = (hashsz + 16) * ctx->commits.nr;
1582 +
1583 if (ctx->num_extra_edges) {
1584 chunk_ids[num_chunks] = GRAPH_CHUNKID_EXTRAEDGES;
1585 + chunk_sizes[num_chunks] = 4 * ctx->num_extra_edges;
1586 num_chunks++;
1587 }
1588 if (ctx->changed_paths) {
1589 chunk_ids[num_chunks] = GRAPH_CHUNKID_BLOOMINDEXES;
1590 + chunk_sizes[num_chunks] = sizeof(uint32_t) * ctx->commits.nr;
1591 num_chunks++;
1592 chunk_ids[num_chunks] = GRAPH_CHUNKID_BLOOMDATA;
1593 + chunk_sizes[num_chunks] = sizeof(uint32_t) * 3
1594 + + ctx->total_bloom_filter_data_size;
1595 num_chunks++;
1596 }
1597 if (ctx->num_commit_graphs_after > 1) {
1598 chunk_ids[num_chunks] = GRAPH_CHUNKID_BASE;
1599 + chunk_sizes[num_chunks] = hashsz * (ctx->num_commit_graphs_after - 1);
1600 num_chunks++;
1601 }
1602
1603 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;
1605
1606 hashwrite_be32(f, GRAPH_SIGNATURE);
1607
@@ -1625,13 +1610,16 @@ static int write_commit_graph_file(struct write_commit_graph_context *ctx)
1610 hashwrite_u8(f, num_chunks);
1611 hashwrite_u8(f, ctx->num_commit_graphs_after - 1);
1612
1613 + chunk_offset = 8 + (num_chunks + 1) * GRAPH_CHUNKLOOKUP_WIDTH;
1614 for (i = 0; i <= num_chunks; i++) {
1615 uint32_t chunk_write[3];
1616
1617 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);
1620 hashwrite(f, chunk_write, 12);
1621 +
1622 + chunk_offset += chunk_sizes[i];
1623 }
1624
1625 if (ctx->report_progress) {