Re: [PATCH v2 4/7] reftable: avoid writing empty keys at the block layer
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Feb 17, 2022, 23:55 UTC
- Message-ID
- <xmqqee4159r6.fsf@gitster.g>
- In-Reply-To
- <ba036ee8543b2dc28ac046eb0c8c0aef9e751c80.1645106124.git.gitgitgadget@gmail.com>
"Han-Wen Nienhuys via GitGitGadget" <gitgitgadget@gmail.com> writes:
Show 11 quoted lines
> @@ -105,8 +106,14 @@ int block_writer_add(struct block_writer *w, struct reftable_record *rec)
> int is_restart = 0;
> struct strbuf key = STRBUF_INIT;
> int n = 0;
> + int err = -1;
>
> reftable_record_key(rec, &key);
> + if (!key.len) {
> + err = REFTABLE_API_ERROR;
> + goto done;
> + }OK; we get an API_ERROR when trying to write a bad one. And ...
Show 6 quoted lines
> @@ -332,6 +334,9 @@ int block_iter_next(struct block_iter *it, struct reftable_record *rec) > if (n < 0) > return -1; > > + if (!key.len) > + return REFTABLE_FORMAT_ERROR;
... we get a FORMAT_ERROR when the data we try to read is bad (i.e. not our fault). OK.
Show 6 quoted lines
> @@ -358,6 +363,8 @@ int block_reader_first_key(struct block_reader *br, struct strbuf *key) > int n = reftable_decode_key(key, &extra, empty, in); > if (n < 0) > return n; > + if (!key->len) > + return -1;
It is curious that this gets a different error out of the same sequence, i.e. decode-key did not return an error but the length of the key happens to be 0, not FORMAT_ERROR.
Show 17 quoted lines
> diff --git a/reftable/writer.c b/reftable/writer.c
> index 944c2329ab5..d54215a50dc 100644
> --- a/reftable/writer.c
> +++ b/reftable/writer.c
> @@ -240,14 +240,13 @@ static int writer_add_record(struct reftable_writer *w,
>
> writer_reinit_block_writer(w, reftable_record_type(rec));
> err = block_writer_add(w->block_writer, rec);
> - if (err < 0) {
> + if (err == -1) {
> /* we are writing into memory, so an error can only mean it
> * doesn't fit. */
> err = REFTABLE_ENTRY_TOO_BIG_ERROR;
> goto done;
> }
>
> - err = 0;Is this "doesn't fit" related to "we catch 0-length keys", or an unrelated fix was included in this step by "rebase -i" mistake?