Re: [PATCH v4 06/14] commit-graph: rearrange chunk count logic

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



"Derrick Stolee via GitGitGadget" <gitgitgadget@xxxxxxxxx> writes:

> From: Derrick Stolee <dstolee@xxxxxxxxxxxxx>
>
> The number of chunks in a commit-graph file can change depending on
> whether we need the Extra Edges Chunk. We are going to add more optional
> chunks, and it will be helpful to rearrange this logic around the chunk
> count before doing so.
>
> Specifically, we need to finalize the number of chunks before writing
> the commit-graph header. Further, we also need to fill out the chunk
> lookup table dynamically and using "num_chunks" as we add optional
> chunks is useful for adding optional chunks in the future.

Yup.  The resulting code may be slightly longer at this step than
before, but it certainly is easier to follow the logic.  Good.


>
> Signed-off-by: Derrick Stolee <dstolee@xxxxxxxxxxxxx>
> ---
>  commit-graph.c | 35 +++++++++++++++++++++--------------
>  1 file changed, 21 insertions(+), 14 deletions(-)
>
> diff --git a/commit-graph.c b/commit-graph.c
> index 909c841db5..80df6d6d9d 100644
> --- a/commit-graph.c
> +++ b/commit-graph.c
> @@ -1206,7 +1206,7 @@ static int write_commit_graph_file(struct write_commit_graph_context *ctx)
>  	uint64_t chunk_offsets[5];
>  	const unsigned hashsz = the_hash_algo->rawsz;
>  	struct strbuf progress_title = STRBUF_INIT;
> -	int num_chunks = ctx->num_extra_edges ? 4 : 3;
> +	int num_chunks = 3;
>  
>  	ctx->graph_name = get_commit_graph_filename(ctx->obj_dir);
>  	if (safe_create_leading_directories(ctx->graph_name)) {
> @@ -1219,27 +1219,34 @@ static int write_commit_graph_file(struct write_commit_graph_context *ctx)
>  	hold_lock_file_for_update(&lk, ctx->graph_name, LOCK_DIE_ON_ERROR);
>  	f = hashfd(lk.tempfile->fd, lk.tempfile->filename.buf);
>  
> -	hashwrite_be32(f, GRAPH_SIGNATURE);
> -
> -	hashwrite_u8(f, GRAPH_VERSION);
> -	hashwrite_u8(f, oid_version());
> -	hashwrite_u8(f, num_chunks);
> -	hashwrite_u8(f, 0); /* unused padding byte */
> -
>  	chunk_ids[0] = GRAPH_CHUNKID_OIDFANOUT;
>  	chunk_ids[1] = GRAPH_CHUNKID_OIDLOOKUP;
>  	chunk_ids[2] = GRAPH_CHUNKID_DATA;
> -	if (ctx->num_extra_edges)
> -		chunk_ids[3] = GRAPH_CHUNKID_EXTRAEDGES;
> -	else
> -		chunk_ids[3] = 0;
> -	chunk_ids[4] = 0;
> +	if (ctx->num_extra_edges) {
> +		chunk_ids[num_chunks] = GRAPH_CHUNKID_EXTRAEDGES;
> +		num_chunks++;
> +	}
> +
> +	chunk_ids[num_chunks] = 0;
>  
>  	chunk_offsets[0] = 8 + (num_chunks + 1) * GRAPH_CHUNKLOOKUP_WIDTH;
>  	chunk_offsets[1] = chunk_offsets[0] + GRAPH_FANOUT_SIZE;
>  	chunk_offsets[2] = chunk_offsets[1] + hashsz * ctx->commits.nr;
>  	chunk_offsets[3] = chunk_offsets[2] + (hashsz + 16) * ctx->commits.nr;
> -	chunk_offsets[4] = chunk_offsets[3] + 4 * ctx->num_extra_edges;
> +
> +	num_chunks = 3;
> +	if (ctx->num_extra_edges) {
> +		chunk_offsets[num_chunks + 1] = chunk_offsets[num_chunks] +
> +						4 * ctx->num_extra_edges;
> +		num_chunks++;
> +	}
> +
> +	hashwrite_be32(f, GRAPH_SIGNATURE);
> +
> +	hashwrite_u8(f, GRAPH_VERSION);
> +	hashwrite_u8(f, oid_version());
> +	hashwrite_u8(f, num_chunks);
> +	hashwrite_u8(f, 0);
>  
>  	for (i = 0; i <= num_chunks; i++) {
>  		uint32_t chunk_write[3];



[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux