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

Re: [PATCH 1/1] upload-pack.c: make output buffer size configurable

From
Jeff King <peff@peff.net>
Date
Dec 14, 2021, 15:08 UTC
Message-ID
<YbizfdGq+RSu9BGe@coredump.intra.peff.net>
In-Reply-To
<211214.86y24nbd46.gmgdl@evledraar.gmail.com>
On Tue, Dec 14, 2021 at 01:08:55PM +0100, Ævar Arnfjörð Bjarmason wrote:
Show 27 quoted lines
> > +#ifndef UPLOAD_PACK_BUFFER_SIZE
> > +#define UPLOAD_PACK_BUFFER_SIZE 8192
> > +#endif
> > +
> >  /* Enum for allowed unadvertised object request (UOR) */
> >  enum allow_uor {
> >  	/* Allow specifying sha1 if it is a ref tip. */
> > @@ -194,7 +198,7 @@ static int write_one_shallow(const struct commit_graft *graft, void *cb_data)
> >  }
> >  
> >  struct output_state {
> > -	char buffer[8193];
> > +	char buffer[UPLOAD_PACK_BUFFER_SIZE+1];
> >  	int used;
> >  	unsigned packfile_uris_started : 1;
> >  	unsigned packfile_started : 1;
> 
> Making this configurable obviousl has big impact in some cases, but I'm
> a bit iffy on the faciltity to do so + it not being documented.
> 
> I don't think that the "static buffer" part here is important to anyone,
> but the write() size is clearly important.
> 
> So doesn't it make more sense to have a uploadPack.bufferSize=8k
> variable we can tweak, just make this "buffer" a "struct strbuf" instead
> (i.e. it'll by dynamically grown), and then just flush it whenever we
> hit the configured buffer size?

I don't think we want to grow dynamically, because we don't want to hold arbitrary amounts of data in memory. We're just passing it through. But if there were a run-time config option, we could easily heap-allocate the buffer up front.

That may be overkill, though I do agree this is kind of weirdly undocumented. There are two other subtleties I notice:

  - This output_state struct does go on the stack, so something big like
    64k is questionable there (though on Linux, without recursion, it's
    usually OK).
  - we're relaying the data into pkt-lines. Do we run into problems when
    the buffer is larger than a packet? I think in send_sideband() we'll
    break it up as appropriate. But before we hit the PACK header, we
    send out packfile-uris directly with packet_write_fmt(). Those
    aren't likely to be long, but if they are, we'd die() in
    format_packet(). So something around LARGE_PACKET_DATA_MAX is
    probably the highest you'd want to set it anyway (and the most
    performant, since otherwise you have to write out extra partial
    packets).

So I kind of wonder if there is any real _harm_ in just always using bigger packets, even if it does not always help. Given the subtle rules about packet-max above, then we could just use that optimal value and not worry about configurability.

-Peff
Previous: Ævar Arnfjörð BjarmasonNext: Jacob Vosmaer
Message 4 of 17 in “Make upload-pack pack write size configurable”
  1. 0/1 Make upload-pack pack write size configurableJacob Vosmaer, Dec 13, 2021
  2. 1/1 upload-pack.c: make output buffer size configurableJacob Vosmaer, Dec 13, 2021
  3. Ævar Arnfjörð BjarmasonDec 14, 2021
  4. Jeff KingDec 14, 2021
  5. 0/1 upload-pack.c: increase output buffer sizeJacob Vosmaer, Dec 14, 2021
  6. 1/1 upload-pack.c: increase output buffer sizeJacob Vosmaer, Dec 14, 2021
  7. Ævar Arnfjörð BjarmasonDec 14, 2021
  8. Jeff KingDec 15, 2021
  9. Junio C HamanoDec 15, 2021
  10. rsbecker@nexbridge.comDec 15, 2021
  11. Jacob VosmaerDec 15, 2021
  12. rsbecker@nexbridge.comDec 15, 2021
  13. Jacob VosmaerDec 15, 2021
  14. rsbecker@nexbridge.comDec 15, 2021
  15. Jeff KingDec 14, 2021
  16. Jacob VosmaerDec 14, 2021
  17. Jeff KingDec 14, 2021

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.