Re: [PATCH] upload-pack: use buffered I/O to talk to rev-list
- From
Chris Torek <chris.torek@gmail.com>
- Date
- Aug 2, 2020, 16:03 UTC
- Message-ID
- <CAPx1GvdJ-4Yyf7Vm1OdhaW2TZp77HOfGxoGw0R2fKfEuHQkqOg@mail.gmail.com>
- In-Reply-To
- <6722ade6-971e-7ecc-e8f0-7f595ca0b0ff@web.de>
One suggestion here:
On Sun, Aug 2, 2020 at 7:41 AM René Scharfe <l.s.r@web.de> wrote:
Show 14 quoted lines
> Like f0bca72dc77 (send-pack: use buffered I/O to talk to pack-objects, > 2016-06-08), significantly reduce the number of system calls and > simplify the code for sending object IDs to rev-list by using stdio's > buffering and handling errors after the loops. > > Signed-off-by: René Scharfe <l.s.r@web.de> > --- > upload-pack.c | 21 +++++++-------------- > 1 file changed, 7 insertions(+), 14 deletions(-) > > diff --git a/upload-pack.c b/upload-pack.c > index 86737410709..9f616c2c6a6 100644 > --- a/upload-pack.c > +++ b/upload-pack.c
[snip]
Show 8 quoted lines
> @@ -640,12 +636,11 @@ static int do_reachable_revlist(struct child_process *cmd, > } > if (reachable && o->type == OBJ_COMMIT) > o->flags |= TMP_MARK; > - memcpy(namebuf, oid_to_hex(&o->oid), hexsz); > - if (write_in_full(cmd->in, namebuf, hexsz + 1) < 0) > - goto error; > + fprintf(cmd_in, "%s\n", oid_to_hex(&o->oid));
The fprintf() call here *can* return an error, e.g., if the connection has died. If it does, it should set things up so that a later ferror(cmd_in) returns true.
Show 5 quoted lines
> } > - close(cmd->in); > cmd->in = -1; > + if (fclose(cmd_in)) > + goto error;
The fclose() call doesn't necessarily check ferror(). (The FreeBSD stdio in particular definitely does not.) It might be better to use:
failure = ferror(cmd_in);
failure |= fclose(cmd_in);
if (failure) ...here, or similar. (The temporary variable is not needed, but someone might assume `if (ferror(fp) | fclose(fp))` is a typo for `if (ferror(fp) || fclose(fp))`.)
(Note: my sample isn't properly indented as gmail does not let me insert tabs easily)
Chris