midx: use buffered I/O to talk to pack-objects

Like f0bca72dc7 (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 pack-objects by using
stdio's buffering.

Helped-by: Chris Torek <chris.torek@gmail.com>
Helped-by: Johannes Sixt <j6t@kdbg.org>
Encouraged-by: Derrick Stolee <stolee@gmail.com>
Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
René Scharfe
2020-08-12 18:52:54 +02:00
committed by Junio C Hamano
parent 24b75faf0d
commit 6af3b00abc

8
midx.c
View File

@ -1383,6 +1383,7 @@ int midx_repack(struct repository *r, const char *object_dir, size_t batch_size,
uint32_t i; uint32_t i;
unsigned char *include_pack; unsigned char *include_pack;
struct child_process cmd = CHILD_PROCESS_INIT; struct child_process cmd = CHILD_PROCESS_INIT;
FILE *cmd_in;
struct strbuf base_name = STRBUF_INIT; struct strbuf base_name = STRBUF_INIT;
struct multi_pack_index *m = load_multi_pack_index(object_dir, 1); struct multi_pack_index *m = load_multi_pack_index(object_dir, 1);
@ -1435,6 +1436,8 @@ int midx_repack(struct repository *r, const char *object_dir, size_t batch_size,
goto cleanup; goto cleanup;
} }
cmd_in = xfdopen(cmd.in, "w");
for (i = 0; i < m->num_objects; i++) { for (i = 0; i < m->num_objects; i++) {
struct object_id oid; struct object_id oid;
uint32_t pack_int_id = nth_midxed_pack_int_id(m, i); uint32_t pack_int_id = nth_midxed_pack_int_id(m, i);
@ -1443,10 +1446,9 @@ int midx_repack(struct repository *r, const char *object_dir, size_t batch_size,
continue; continue;
nth_midxed_object_oid(&oid, m, i); nth_midxed_object_oid(&oid, m, i);
xwrite(cmd.in, oid_to_hex(&oid), the_hash_algo->hexsz); fprintf(cmd_in, "%s\n", oid_to_hex(&oid));
xwrite(cmd.in, "\n", 1);
} }
close(cmd.in); fclose(cmd_in);
if (finish_command(&cmd)) { if (finish_command(&cmd)) {
error(_("could not finish pack-objects")); error(_("could not finish pack-objects"));