Skip to content

Commit 47410aa

Browse files
derrickstoleegitster
authored andcommitted
commit-graph: use chunk-format write API
The commit-graph write logic is ready to make use of the chunk-format write API. Each chunk write method is already in the correct prototype. We only need to use the 'struct chunkfile' pointer and the correct API calls. Signed-off-by: Derrick Stolee <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 570df42 commit 47410aa

File tree

1 file changed

+37
-82
lines changed

1 file changed

+37
-82
lines changed

commit-graph.c

Lines changed: 37 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "shallow.h"
2020
#include "json-writer.h"
2121
#include "trace2.h"
22+
#include "chunk-format.h"
2223

2324
void git_test_write_commit_graph_or_die(void)
2425
{
@@ -44,7 +45,6 @@ void git_test_write_commit_graph_or_die(void)
4445
#define GRAPH_CHUNKID_BLOOMINDEXES 0x42494458 /* "BIDX" */
4546
#define GRAPH_CHUNKID_BLOOMDATA 0x42444154 /* "BDAT" */
4647
#define GRAPH_CHUNKID_BASE 0x42415345 /* "BASE" */
47-
#define MAX_NUM_CHUNKS 9
4848

4949
#define GRAPH_DATA_WIDTH (the_hash_algo->rawsz + 16)
5050

@@ -1758,27 +1758,17 @@ static int write_graph_chunk_base(struct hashfile *f,
17581758
return 0;
17591759
}
17601760

1761-
typedef int (*chunk_write_fn)(struct hashfile *f,
1762-
void *data);
1763-
1764-
struct chunk_info {
1765-
uint32_t id;
1766-
uint64_t size;
1767-
chunk_write_fn write_fn;
1768-
};
1769-
17701761
static int write_commit_graph_file(struct write_commit_graph_context *ctx)
17711762
{
17721763
uint32_t i;
17731764
int fd;
17741765
struct hashfile *f;
17751766
struct lock_file lk = LOCK_INIT;
1776-
struct chunk_info chunks[MAX_NUM_CHUNKS + 1];
17771767
const unsigned hashsz = the_hash_algo->rawsz;
17781768
struct strbuf progress_title = STRBUF_INIT;
17791769
int num_chunks = 3;
1780-
uint64_t chunk_offset;
17811770
struct object_id file_hash;
1771+
struct chunkfile *cf;
17821772

17831773
if (ctx->split) {
17841774
struct strbuf tmp_file = STRBUF_INIT;
@@ -1824,76 +1814,50 @@ static int write_commit_graph_file(struct write_commit_graph_context *ctx)
18241814
f = hashfd(lk.tempfile->fd, lk.tempfile->filename.buf);
18251815
}
18261816

1827-
chunks[0].id = GRAPH_CHUNKID_OIDFANOUT;
1828-
chunks[0].size = GRAPH_FANOUT_SIZE;
1829-
chunks[0].write_fn = write_graph_chunk_fanout;
1830-
chunks[1].id = GRAPH_CHUNKID_OIDLOOKUP;
1831-
chunks[1].size = hashsz * ctx->commits.nr;
1832-
chunks[1].write_fn = write_graph_chunk_oids;
1833-
chunks[2].id = GRAPH_CHUNKID_DATA;
1834-
chunks[2].size = (hashsz + 16) * ctx->commits.nr;
1835-
chunks[2].write_fn = write_graph_chunk_data;
1817+
cf = init_chunkfile(f);
1818+
1819+
add_chunk(cf, GRAPH_CHUNKID_OIDFANOUT, GRAPH_FANOUT_SIZE,
1820+
write_graph_chunk_fanout);
1821+
add_chunk(cf, GRAPH_CHUNKID_OIDLOOKUP, hashsz * ctx->commits.nr,
1822+
write_graph_chunk_oids);
1823+
add_chunk(cf, GRAPH_CHUNKID_DATA, (hashsz + 16) * ctx->commits.nr,
1824+
write_graph_chunk_data);
18361825

18371826
if (git_env_bool(GIT_TEST_COMMIT_GRAPH_NO_GDAT, 0))
18381827
ctx->write_generation_data = 0;
1839-
if (ctx->write_generation_data) {
1840-
chunks[num_chunks].id = GRAPH_CHUNKID_GENERATION_DATA;
1841-
chunks[num_chunks].size = sizeof(uint32_t) * ctx->commits.nr;
1842-
chunks[num_chunks].write_fn = write_graph_chunk_generation_data;
1843-
num_chunks++;
1844-
}
1845-
if (ctx->num_generation_data_overflows) {
1846-
chunks[num_chunks].id = GRAPH_CHUNKID_GENERATION_DATA_OVERFLOW;
1847-
chunks[num_chunks].size = sizeof(timestamp_t) * ctx->num_generation_data_overflows;
1848-
chunks[num_chunks].write_fn = write_graph_chunk_generation_data_overflow;
1849-
num_chunks++;
1850-
}
1851-
if (ctx->num_extra_edges) {
1852-
chunks[num_chunks].id = GRAPH_CHUNKID_EXTRAEDGES;
1853-
chunks[num_chunks].size = 4 * ctx->num_extra_edges;
1854-
chunks[num_chunks].write_fn = write_graph_chunk_extra_edges;
1855-
num_chunks++;
1856-
}
1828+
if (ctx->write_generation_data)
1829+
add_chunk(cf, GRAPH_CHUNKID_GENERATION_DATA,
1830+
sizeof(uint32_t) * ctx->commits.nr,
1831+
write_graph_chunk_generation_data);
1832+
if (ctx->num_generation_data_overflows)
1833+
add_chunk(cf, GRAPH_CHUNKID_GENERATION_DATA_OVERFLOW,
1834+
sizeof(timestamp_t) * ctx->num_generation_data_overflows,
1835+
write_graph_chunk_generation_data_overflow);
1836+
if (ctx->num_extra_edges)
1837+
add_chunk(cf, GRAPH_CHUNKID_EXTRAEDGES,
1838+
4 * ctx->num_extra_edges,
1839+
write_graph_chunk_extra_edges);
18571840
if (ctx->changed_paths) {
1858-
chunks[num_chunks].id = GRAPH_CHUNKID_BLOOMINDEXES;
1859-
chunks[num_chunks].size = sizeof(uint32_t) * ctx->commits.nr;
1860-
chunks[num_chunks].write_fn = write_graph_chunk_bloom_indexes;
1861-
num_chunks++;
1862-
chunks[num_chunks].id = GRAPH_CHUNKID_BLOOMDATA;
1863-
chunks[num_chunks].size = sizeof(uint32_t) * 3
1864-
+ ctx->total_bloom_filter_data_size;
1865-
chunks[num_chunks].write_fn = write_graph_chunk_bloom_data;
1866-
num_chunks++;
1867-
}
1868-
if (ctx->num_commit_graphs_after > 1) {
1869-
chunks[num_chunks].id = GRAPH_CHUNKID_BASE;
1870-
chunks[num_chunks].size = hashsz * (ctx->num_commit_graphs_after - 1);
1871-
chunks[num_chunks].write_fn = write_graph_chunk_base;
1872-
num_chunks++;
1873-
}
1874-
1875-
chunks[num_chunks].id = 0;
1876-
chunks[num_chunks].size = 0;
1841+
add_chunk(cf, GRAPH_CHUNKID_BLOOMINDEXES,
1842+
sizeof(uint32_t) * ctx->commits.nr,
1843+
write_graph_chunk_bloom_indexes);
1844+
add_chunk(cf, GRAPH_CHUNKID_BLOOMDATA,
1845+
sizeof(uint32_t) * 3
1846+
+ ctx->total_bloom_filter_data_size,
1847+
write_graph_chunk_bloom_data);
1848+
}
1849+
if (ctx->num_commit_graphs_after > 1)
1850+
add_chunk(cf, GRAPH_CHUNKID_BASE,
1851+
hashsz * (ctx->num_commit_graphs_after - 1),
1852+
write_graph_chunk_base);
18771853

18781854
hashwrite_be32(f, GRAPH_SIGNATURE);
18791855

18801856
hashwrite_u8(f, GRAPH_VERSION);
18811857
hashwrite_u8(f, oid_version());
1882-
hashwrite_u8(f, num_chunks);
1858+
hashwrite_u8(f, get_num_chunks(cf));
18831859
hashwrite_u8(f, ctx->num_commit_graphs_after - 1);
18841860

1885-
chunk_offset = 8 + (num_chunks + 1) * GRAPH_CHUNKLOOKUP_WIDTH;
1886-
for (i = 0; i <= num_chunks; i++) {
1887-
uint32_t chunk_write[3];
1888-
1889-
chunk_write[0] = htonl(chunks[i].id);
1890-
chunk_write[1] = htonl(chunk_offset >> 32);
1891-
chunk_write[2] = htonl(chunk_offset & 0xffffffff);
1892-
hashwrite(f, chunk_write, 12);
1893-
1894-
chunk_offset += chunks[i].size;
1895-
}
1896-
18971861
if (ctx->report_progress) {
18981862
strbuf_addf(&progress_title,
18991863
Q_("Writing out commit graph in %d pass",
@@ -1905,17 +1869,7 @@ static int write_commit_graph_file(struct write_commit_graph_context *ctx)
19051869
num_chunks * ctx->commits.nr);
19061870
}
19071871

1908-
for (i = 0; i < num_chunks; i++) {
1909-
uint64_t start_offset = f->total + f->offset;
1910-
1911-
if (chunks[i].write_fn(f, ctx))
1912-
return -1;
1913-
1914-
if (f->total + f->offset != start_offset + chunks[i].size)
1915-
BUG("expected to write %"PRId64" bytes to chunk %"PRIx32", but wrote %"PRId64" instead",
1916-
chunks[i].size, chunks[i].id,
1917-
f->total + f->offset - start_offset);
1918-
}
1872+
write_chunkfile(cf, ctx);
19191873

19201874
stop_progress(&ctx->progress);
19211875
strbuf_release(&progress_title);
@@ -1932,6 +1886,7 @@ static int write_commit_graph_file(struct write_commit_graph_context *ctx)
19321886

19331887
close_commit_graph(ctx->r->objects);
19341888
finalize_hashfile(f, file_hash.hash, CSUM_HASH_IN_STREAM | CSUM_FSYNC);
1889+
free_chunkfile(cf);
19351890

19361891
if (ctx->split) {
19371892
FILE *chainf = fdopen_lock_file(&lk, "w");

0 commit comments

Comments
 (0)