git/list[1] front-page[2] threads[3] people[4] search[5] about
 

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
Previous: René ScharfeNext: René Scharfe
Message 2 of 9 in “upload-pack: use buffered I/O to talk to rev-list”
  1. upload-pack: use buffered I/O to talk to rev-listRené Scharfe, Aug 2, 2020
  2. Chris TorekAug 2, 2020
  3. René ScharfeAug 3, 2020
  4. Chris TorekAug 3, 2020
  5. Johannes SixtAug 3, 2020
  6. upload-pack: use buffered I/O to talk to rev-listRené Scharfe, Aug 12, 2020
  7. Christian CouderAug 13, 2020
  8. René ScharfeAug 13, 2020
  9. Jeff KingAug 13, 2020

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.