Subject: Re: [PATCH v2 08/19] reftable: reading/writing blocks

From: Ævar Arnfjörð Bjarmason <[email-masked]>
Date: Fri, 24 Sep 2021 13:52:28 +0200

On Thu, Sep 09 2021, Han-Wen Nienhuys via GitGitGadget wrote:

> From: Han-Wen Nienhuys <[email-masked]>
>
> The reftable format is structured as a sequence of block. Within a block,
> records are prefix compressed, with an index of offsets for fully expand keys to
> enable binary search within blocks.
> [...]
> +	if (typ == BLOCK_TYPE_LOG) {
> +		int block_header_skip = 4 + header_off;
> +		uLongf dst_len = sz - block_header_skip; /* total size of dest
> +							    buffer. */
> +		uLongf src_len = block->len - block_header_skip;
> +		/* Log blocks specify the *uncompressed* size in their header.
> +		 */
> +		uint8_t *uncompressed = reftable_malloc(sz);
> +
> +		/* Copy over the block header verbatim. It's not compressed. */
> +		memcpy(uncompressed, block->data, block_header_skip);
> +
> +		/* Uncompress */
> +		if (Z_OK !=
> +		    uncompress2(uncompressed + block_header_skip, &dst_len,
> +				block->data + block_header_skip, &src_len)) {
> +			reftable_free(uncompressed);
> +			return REFTABLE_ZLIB_ERROR;
> +		}
> +
> +		if (dst_len + block_header_skip != sz)
> +			return REFTABLE_FORMAT_ERROR;
> +
> +		/* We're done with the input data. */
> +		reftable_block_done(block);
> +		block->data = uncompressed;
> +		block->len = sz;
> +		block->source = malloc_block_source();
> +		full_block_size = src_len + block_header_skip;

I haven't tried to re-implement this, but in 07/19 we're adding an
uncompress2() fallaback function, and here's the only place where it'll
get used.

Looking at the uncompress2() implementation isn't this a rather trivial
wrapper for something we'd get from git.git's zlib.c, i.e. you seem to
just need the "avail_in" here, which we're checking in various other
parts of the codebase.

I suspect that the reason for this is that this code is trying to keep
at arms length from the rest of git.git, but if so some ifdef here if
it's compiling in git.git seems better than having a compat interface in
git.git just for doing something its zlib.c API provides.

Anyway, re Junio's ask if this is ready for "next" in the latest What's
Cooking I don't think this should be a blocker, just wondering if
anyone's interested in some post-cleanup at some point, and whether I'm
missing something about uncompress2() v.s. zlib.c.