pack-objects: trace pack bytes written

We want to measure how compression settings affect push performance on
the client. Different settings can produce different-sized packs from
the same objects. Trace2 records the object count, but we also need the
pack size to compare those settings.

Add a write_pack_file/wrote_bytes Trace2 datum alongside
write_pack_file/wrote. Count packs written to stdout or disk, including
each pack's header and trailing checksum. When pack.packSizeLimit splits
the output, report the sum of the pack sizes.

Signed-off-by: Friel <friel@openai.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
main
Friel 2026-08-19 16:28:10 -07:00 committed by Junio C Hamano
parent 1a3e64c6c4
commit a6c983765f
2 changed files with 29 additions and 0 deletions

View File

@ -1337,6 +1337,7 @@ static void write_pack_file(void)
uint32_t nr_remaining = nr_result;
time_t last_mtime = 0;
struct object_entry **write_order;
off_t bytes_written = 0;

if (progress > pack_to_stdout)
progress_state = start_progress(the_repository,
@ -1389,6 +1390,8 @@ static void write_pack_file(void)
display_progress(progress_state, written);
}

bytes_written += hashfile_total(f) +
the_repository->hash_algo->rawsz;
if (pack_to_stdout) {
/*
* We never fsync when writing to stdout since we may
@ -1510,6 +1513,8 @@ static void write_pack_file(void)
written, nr_result);
trace2_data_intmax("pack-objects", the_repository,
"write_pack_file/wrote", nr_result);
trace2_data_intmax("pack-objects", the_repository,
"write_pack_file/wrote_bytes", bytes_written);
}

static int no_try_delta(const char *path)

View File

@ -33,6 +33,30 @@ test_expect_success 'setup' '
} >expect
'

test_expect_success 'pack-object traces bytes written to stdout' '
test_when_finished "rm -f pack.trace pack.pack" &&
GIT_TRACE2_EVENT="$PWD/pack.trace" \
git pack-objects --quiet --revs --stdout >pack.pack <<-EOF &&
$commit
EOF
bytes=$(test_file_size pack.pack) &&
test_grep "\"key\":\"write_pack_file/wrote_bytes\",\"value\":\"$bytes\"" pack.trace
'

test_expect_success 'pack-object traces bytes written to split pack files' '
test_when_finished "rm -f split.trace traced-pack-*" &&
GIT_TRACE2_EVENT="$PWD/split.trace" \
git -c pack.packSizeLimit=3m pack-objects --quiet traced-pack <obj-list &&
test 2 = $(ls traced-pack-*.pack | wc -l) &&
bytes=0 &&
for pack in traced-pack-*.pack
do
pack_size=$(test_file_size "$pack") &&
bytes=$((bytes + pack_size)) || return 1
done &&
test_grep "\"key\":\"write_pack_file/wrote_bytes\",\"value\":\"$bytes\"" split.trace
'

test_expect_success 'setup pack-object <stdin' '
git init pack-object-stdin &&
test_commit -C pack-object-stdin one &&