From: Junio C Hamano <gitster@pobox.com>
To: Patrick Steinhardt <ps@pks.im>
Cc: git@vger.kernel.org, Matt Smiley <msmiley@gitlab.com>,
"brian m. carlson" <sandals@crustytoothpaste.net>,
Jeff King <peff@peff.net>, Johannes Sixt <j6t@kdbg.org>
Subject: Re: [PATCH v3 03/10] upload-pack: prefer flushing data over sending keepalive
Date: Tue, 10 Mar 2026 10:09:51 -0700 [thread overview]
Message-ID: <xmqq5x73wqzk.fsf@gitster.g> (raw)
In-Reply-To: <20260310-pks-upload-pack-write-contention-v3-3-8bc97aa3e267@pks.im> (Patrick Steinhardt's message of "Tue, 10 Mar 2026 14:24:59 +0100")
Patrick Steinhardt <ps@pks.im> writes:
> When using the sideband in git-upload-pack(1) we know to send out
> keepalive packets in case generating the pack takes too long. These
> keepalives take the form of a simple empty pktline.
>
> In the preceding commit we have adapted git-upload-pack(1) to buffer
> data more aggressively before sending it to the client. This creates an
> obvious optimization opportunity: when we hit the keepalive timeout
> while we still hold on to some buffered data, then it makes more sense
> to flush out the data instead of sending the empty keepalive packet.
>
> This is overall not going to be a significant win. Most keepalives will
> come before the pack data starts, and once pack-objects starts producing
> data, it tends to do so pretty consistently. And of course we can't send
> data before we see the PACK header, because the whole point is to buffer
> the early bit waiting for packfile URIs. But the optimization is easy
> enough to realize.
>
> Do so and flush out data instead of sending an empty pktline. While at
> it, drop the useless
Useless what?
> Suggested-by: Jeff King <peff@peff.net>
> Signed-off-by: Patrick Steinhardt <ps@pks.im>
> ---
> upload-pack.c | 21 +++++++++++++++------
> 1 file changed, 15 insertions(+), 6 deletions(-)
>
> diff --git a/upload-pack.c b/upload-pack.c
> index f6f380a601..7a165d226d 100644
> --- a/upload-pack.c
> +++ b/upload-pack.c
> @@ -466,18 +466,27 @@ static void create_pack_file(struct upload_pack_data *pack_data,
> }
>
> /*
> - * We hit the keepalive timeout without saying anything; send
> - * an empty message on the data sideband just to let the other
> - * side know we're still working on it, but don't have any data
> - * yet.
> + * We hit the keepalive timeout without saying anything. If we
> + * have pending data we flush it out to the caller now.
> + * Otherwise, we send an empty message on the data sideband
> + * just to let the other side know we're still working on it,
> + * but don't have any data yet.
> *
> * If we don't have a sideband channel, there's no room in the
> * protocol to say anything, so those clients are just out of
> * luck.
> */
> if (!ret && pack_data->use_sideband) {
> - static const char buf[] = "0005\1";
> - write_or_die(1, buf, 5);
> + if (output_state->packfile_started && output_state->used > 1) {
> + send_client_data(1, output_state->buffer, output_state->used - 1,
> + pack_data->use_sideband);
> + output_state->buffer[0] = output_state->buffer[output_state->used - 1];
> + output_state->used = 1;
> + } else {
> + static const char buf[] = "0005\1";
> + write_or_die(1, buf, 5);
> + }
> +
OK. The new part of the comment, "If we have pending data, flush
it", is what the new code is doing (i.e., flush all the bytes before
the final byte, and make the buffer hold only that final byte we
kept for ourselves). Otherwise we give a keepalive packet (i.e., 0
byte thrown at the sideband #1) as before.
OK.
> last_sent_ms = now_ms;
> }
> }
next prev parent reply other threads:[~2026-03-10 17:09 UTC|newest]
Thread overview: 64+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-02-27 11:22 [PATCH 0/2] upload-pack: reduce lock contention when writing packfile data Patrick Steinhardt
2026-02-27 11:23 ` [PATCH 1/2] upload-pack: fix debug statement when flushing " Patrick Steinhardt
2026-02-27 11:23 ` [PATCH 2/2] upload-pack: reduce lock contention when writing " Patrick Steinhardt
2026-02-27 13:04 ` brian m. carlson
2026-02-27 18:14 ` Patrick Steinhardt
2026-02-27 17:29 ` Junio C Hamano
2026-02-27 19:37 ` Jeff King
2026-03-02 12:12 ` Patrick Steinhardt
2026-03-02 18:20 ` Jeff King
2026-03-03 9:31 ` Patrick Steinhardt
2026-03-03 13:35 ` Jeff King
2026-03-03 13:47 ` Patrick Steinhardt
2026-03-03 15:00 ` [PATCH v2 00/10] " Patrick Steinhardt
2026-03-03 15:00 ` [PATCH v2 01/10] upload-pack: fix debug statement when flushing " Patrick Steinhardt
2026-03-03 15:00 ` [PATCH v2 02/10] upload-pack: adapt keepalives based on buffering Patrick Steinhardt
2026-03-05 0:56 ` Jeff King
2026-03-10 12:08 ` Patrick Steinhardt
2026-03-03 15:00 ` [PATCH v2 03/10] upload-pack: reduce lock contention when writing packfile data Patrick Steinhardt
2026-03-05 1:16 ` Jeff King
2026-03-10 12:14 ` Patrick Steinhardt
2026-03-03 15:00 ` [PATCH v2 04/10] git-compat-util: introduce `cast_size_t_to_ssize_t()` Patrick Steinhardt
2026-03-03 15:00 ` [PATCH v2 05/10] compat/posix: introduce writev(3p) wrapper Patrick Steinhardt
2026-03-04 22:01 ` Junio C Hamano
2026-03-05 0:37 ` Jeff King
2026-03-05 2:16 ` brian m. carlson
2026-03-05 6:39 ` Johannes Sixt
2026-03-05 22:22 ` brian m. carlson
2026-03-10 12:09 ` Patrick Steinhardt
2026-03-03 15:00 ` [PATCH v2 06/10] wrapper: introduce writev(3p) wrappers Patrick Steinhardt
2026-03-03 15:00 ` [PATCH v2 07/10] sideband: use writev(3p) to send pktlines Patrick Steinhardt
2026-03-04 22:05 ` Junio C Hamano
2026-03-03 15:00 ` [PATCH v2 08/10] csum-file: introduce `hashfd_ext()` Patrick Steinhardt
2026-03-04 22:11 ` Junio C Hamano
2026-03-10 12:09 ` Patrick Steinhardt
2026-03-03 15:00 ` [PATCH v2 09/10] csum-file: drop `hashfd_throughput()` Patrick Steinhardt
2026-03-03 15:00 ` [PATCH v2 10/10] builtin/pack-objects: reduce lock contention when writing packfile data Patrick Steinhardt
2026-03-10 13:24 ` [PATCH v3 00/10] upload-pack: " Patrick Steinhardt
2026-03-10 13:24 ` [PATCH v3 01/10] upload-pack: fix debug statement when flushing " Patrick Steinhardt
2026-03-10 13:24 ` [PATCH v3 02/10] upload-pack: adapt keepalives based on buffering Patrick Steinhardt
2026-03-10 13:24 ` [PATCH v3 03/10] upload-pack: prefer flushing data over sending keepalive Patrick Steinhardt
2026-03-10 17:09 ` Junio C Hamano [this message]
2026-03-10 17:43 ` Patrick Steinhardt
2026-03-10 13:25 ` [PATCH v3 04/10] upload-pack: reduce lock contention when writing packfile data Patrick Steinhardt
2026-03-10 13:25 ` [PATCH v3 05/10] compat/posix: introduce writev(3p) wrapper Patrick Steinhardt
2026-03-10 16:59 ` Junio C Hamano
2026-03-10 13:25 ` [PATCH v3 06/10] wrapper: introduce writev(3p) wrappers Patrick Steinhardt
2026-03-10 13:25 ` [PATCH v3 07/10] sideband: use writev(3p) to send pktlines Patrick Steinhardt
2026-03-10 13:25 ` [PATCH v3 08/10] csum-file: introduce `hashfd_ext()` Patrick Steinhardt
2026-03-10 13:25 ` [PATCH v3 09/10] csum-file: drop `hashfd_throughput()` Patrick Steinhardt
2026-03-10 13:25 ` [PATCH v3 10/10] builtin/pack-objects: reduce lock contention when writing packfile data Patrick Steinhardt
2026-03-10 17:11 ` [PATCH v3 00/10] upload-pack: " Junio C Hamano
2026-03-10 20:56 ` Johannes Sixt
2026-03-11 6:27 ` Patrick Steinhardt
2026-03-13 6:45 ` [PATCH v4 " Patrick Steinhardt
2026-03-13 6:45 ` [PATCH v4 01/10] upload-pack: fix debug statement when flushing " Patrick Steinhardt
2026-03-13 6:45 ` [PATCH v4 02/10] upload-pack: adapt keepalives based on buffering Patrick Steinhardt
2026-03-13 6:45 ` [PATCH v4 03/10] upload-pack: prefer flushing data over sending keepalive Patrick Steinhardt
2026-03-13 6:45 ` [PATCH v4 04/10] upload-pack: reduce lock contention when writing packfile data Patrick Steinhardt
2026-03-13 6:45 ` [PATCH v4 05/10] compat/posix: introduce writev(3p) wrapper Patrick Steinhardt
2026-03-13 6:45 ` [PATCH v4 06/10] wrapper: introduce writev(3p) wrappers Patrick Steinhardt
2026-03-13 6:45 ` [PATCH v4 07/10] sideband: use writev(3p) to send pktlines Patrick Steinhardt
2026-03-13 6:45 ` [PATCH v4 08/10] csum-file: introduce `hashfd_ext()` Patrick Steinhardt
2026-03-13 6:45 ` [PATCH v4 09/10] csum-file: drop `hashfd_throughput()` Patrick Steinhardt
2026-03-13 6:45 ` [PATCH v4 10/10] builtin/pack-objects: reduce lock contention when writing packfile data Patrick Steinhardt
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=xmqq5x73wqzk.fsf@gitster.g \
--to=gitster@pobox.com \
--cc=git@vger.kernel.org \
--cc=j6t@kdbg.org \
--cc=msmiley@gitlab.com \
--cc=peff@peff.net \
--cc=ps@pks.im \
--cc=sandals@crustytoothpaste.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox