"GOT", but the "O" is a cute, smiling pufferfish. Index | Thread | Search

From:
Stefan Sperling <stsp@stsp.name>
Subject:
Re: optimize got-fetch-http a bit
To:
op@omarpolo.com
Cc:
gameoftrees@openbsd.org
Date:
Thu, 17 Apr 2025 11:49:53 +0200

Download raw body.

Thread
On Tue, Apr 15, 2025 at 08:11:42AM +0200, op@omarpolo.com wrote:
> Hello,
> 
> Colin reported on the IRC channel an absurd CPU consumption from
> got-fetch-http while cloning the freebsd src.git repository.  This boils
> down to some exaggerate memmove() in the http Transfer-Encoding: chunked
> parsing bits.
> 
> Diff below fixes it by avoiding these altogether during the http
> response handling, and instead using a cursor inside the read buffer.
> To be fair, I'm not entirely liking the diff, it feels more complicate
> than it really should be, but for now that's what i got.
> 
> While here I've thrown in it a small extra optimization: http_read() now
> knows how to directly write the data to a FILE in addition to a memory
> buffer.  This avoids an extra copy during the body handling since except
> for some stuff at the start, we just copy the body as-is to standard
> output.
> 
> With this, the majority of the time spent during the cloning of the
> freebsd src.git repository over http moves back to the delta resolving :)
> 
> Thoughts, comments or even oks?

> +
> +		if (out != NULL) {
> +			fwrite(rbuf->buf + rbuf->cur, 1, avail, out);

Please check for errors from fwrite() instead of ignoring them.
I realize this is always going to stdout, but I would prefer to keep
error checking idioms in place everywhere.