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

Derrick Stolee committed Feb 18, 2021 at 14:07 UTC 47410aa8370fdfc67d379fc808ac2316aef1d2c5
1 file changed +37 -82
commit-graph.c
+37 -82
@@ -19,6 +19,7 @@
19 #include "shallow.h"
20 #include "json-writer.h"
21 #include "trace2.h"
22 +#include "chunk-format.h"
23
24 void git_test_write_commit_graph_or_die(void)
25 {
@@ -44,7 +45,6 @@ void git_test_write_commit_graph_or_die(void)
45 #define GRAPH_CHUNKID_BLOOMINDEXES 0x42494458 /* "BIDX" */
46 #define GRAPH_CHUNKID_BLOOMDATA 0x42444154 /* "BDAT" */
47 #define GRAPH_CHUNKID_BASE 0x42415345 /* "BASE" */
47 -#define MAX_NUM_CHUNKS 9
48
49 #define GRAPH_DATA_WIDTH (the_hash_algo->rawsz + 16)
50
@@ -1758,27 +1758,17 @@ static int write_graph_chunk_base(struct hashfile *f,
1758 return 0;
1759 }
1760
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 -
1761 static int write_commit_graph_file(struct write_commit_graph_context *ctx)
1762 {
1763 uint32_t i;
1764 int fd;
1765 struct hashfile *f;
1766 struct lock_file lk = LOCK_INIT;
1776 - struct chunk_info chunks[MAX_NUM_CHUNKS + 1];
1767 const unsigned hashsz = the_hash_algo->rawsz;
1768 struct strbuf progress_title = STRBUF_INIT;
1769 int num_chunks = 3;
1780 - uint64_t chunk_offset;
1770 struct object_id file_hash;
1771 + struct chunkfile *cf;
1772
1773 if (ctx->split) {
1774 struct strbuf tmp_file = STRBUF_INIT;
@@ -1824,76 +1814,50 @@ static int write_commit_graph_file(struct write_commit_graph_context *ctx)
1814 f = hashfd(lk.tempfile->fd, lk.tempfile->filename.buf);
1815 }
1816
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);
1825
1826 if (git_env_bool(GIT_TEST_COMMIT_GRAPH_NO_GDAT, 0))
1827 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);
1840 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);
1853
1854 hashwrite_be32(f, GRAPH_SIGNATURE);
1855
1856 hashwrite_u8(f, GRAPH_VERSION);
1857 hashwrite_u8(f, oid_version());
1882 - hashwrite_u8(f, num_chunks);
1858 + hashwrite_u8(f, get_num_chunks(cf));
1859 hashwrite_u8(f, ctx->num_commit_graphs_after - 1);
1860
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 -
1861 if (ctx->report_progress) {
1862 strbuf_addf(&progress_title,
1863 Q_("Writing out commit graph in %d pass",
@@ -1905,17 +1869,7 @@ static int write_commit_graph_file(struct write_commit_graph_context *ctx)
1869 num_chunks * ctx->commits.nr);
1870 }
1871
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);
1873
1874 stop_progress(&ctx->progress);
1875 strbuf_release(&progress_title);
@@ -1932,6 +1886,7 @@ static int write_commit_graph_file(struct write_commit_graph_context *ctx)
1886
1887 close_commit_graph(ctx->r->objects);
1888 finalize_hashfile(f, file_hash.hash, CSUM_HASH_IN_STREAM | CSUM_FSYNC);
1889 + free_chunkfile(cf);
1890
1891 if (ctx->split) {
1892 FILE *chainf = fdopen_lock_file(&lk, "w");