aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2022-01-05 14:01:29 -0800
committerJunio C Hamano <gitster@pobox.com>2022-01-05 14:01:29 -0800
commitd9fc3a987b9611fa6b71e38768657b10f84fef7f (patch)
treec6a67f61be36bbb05d145a059caf363c770e8454
parent76987b86283579bf144d1d325401fb8e06cddcdf (diff)
parent55a9651d26a6b88c68445e7d6c9f511d1207cbd8 (diff)
downloadgit-d9fc3a987b9611fa6b71e38768657b10f84fef7f.tar.gz
Merge branch 'jv/use-larger-buffer-in-upload-pack'
"git upload-pack" (the other side of "git fetch") used a 8kB buffer but most of its payload came on 64kB "packets". The buffer size has been enlarged so that such a packet fits. * jv/use-larger-buffer-in-upload-pack: upload-pack.c: increase output buffer size
-rw-r--r--upload-pack.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/upload-pack.c b/upload-pack.c
index 9b5db32623..8acc98741b 100644
--- a/upload-pack.c
+++ b/upload-pack.c
@@ -194,7 +194,13 @@ static int write_one_shallow(const struct commit_graft *graft, void *cb_data)
}
struct output_state {
- char buffer[8193];
+ /*
+ * We do writes no bigger than LARGE_PACKET_DATA_MAX - 1, because with
+ * sideband-64k the band designator takes up 1 byte of space. Because
+ * relay_pack_data keeps the last byte to itself, we make the buffer 1
+ * byte bigger than the intended maximum write size.
+ */
+ char buffer[(LARGE_PACKET_DATA_MAX - 1) + 1];
int used;
unsigned packfile_uris_started : 1;
unsigned packfile_started : 1;
@@ -269,7 +275,7 @@ static void create_pack_file(struct upload_pack_data *pack_data,
const struct string_list *uri_protocols)
{
struct child_process pack_objects = CHILD_PROCESS_INIT;
- struct output_state output_state = { { 0 } };
+ struct output_state *output_state = xcalloc(1, sizeof(struct output_state));
char progress[128];
char abort_msg[] = "aborting due to possible repository "
"corruption on the remote side.";
@@ -404,7 +410,7 @@ static void create_pack_file(struct upload_pack_data *pack_data,
}
if (0 <= pu && (pfd[pu].revents & (POLLIN|POLLHUP))) {
int result = relay_pack_data(pack_objects.out,
- &output_state,
+ output_state,
pack_data->use_sideband,
!!uri_protocols);
@@ -438,11 +444,12 @@ static void create_pack_file(struct upload_pack_data *pack_data,
}
/* flush the data */
- if (output_state.used > 0) {
- send_client_data(1, output_state.buffer, output_state.used,
+ if (output_state->used > 0) {
+ send_client_data(1, output_state->buffer, output_state->used,
pack_data->use_sideband);
fprintf(stderr, "flushed.\n");
}
+ free(output_state);
if (pack_data->use_sideband)
packet_flush(1);
return;