From: friel@openai.com
To: git@vger.kernel.org
Subject: [PATCH] pack-objects: trace pack bytes written
Date: Mon, 17 Aug 2026 16:39:15 -0700 [thread overview]
Message-ID: <20260817233914.8740-2-friel@openai.com> (raw)
From: Friel <friel@openai.com>
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>
---
builtin/pack-objects.c | 7 +++++++
t/t5300-pack-object.sh | 24 ++++++++++++++++++++++++
2 files changed, 31 insertions(+)
diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c
index 1ec5b6f206..bbf1adb437 100644
--- a/builtin/pack-objects.c
+++ b/builtin/pack-objects.c
@@ -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,
@@ -1347,6 +1348,7 @@ static void write_pack_file(void)
do {
unsigned char hash[GIT_MAX_RAWSZ];
char *pack_tmp_name = NULL;
+ off_t pack_bytes;
if (pack_to_stdout) {
/*
@@ -1389,6 +1391,8 @@ static void write_pack_file(void)
display_progress(progress_state, written);
}
+ pack_bytes = hashfile_total(f) +
+ the_repository->hash_algo->rawsz;
if (pack_to_stdout) {
/*
* We never fsync when writing to stdout since we may
@@ -1419,6 +1423,7 @@ static void write_pack_file(void)
write_bitmap_index = 0;
}
}
+ bytes_written += pack_bytes;
if (!pack_to_stdout) {
struct stat st;
@@ -1510,6 +1515,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)
diff --git a/t/t5300-pack-object.sh b/t/t5300-pack-object.sh
index 9dabb3615a..aac139e6a0 100755
--- a/t/t5300-pack-object.sh
+++ b/t/t5300-pack-object.sh
@@ -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 &&
base-commit: 18e66859d87fb4b76599f73460b54f0848c76b16
next reply other threads:[~2026-08-17 23:39 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-17 23:39 friel [this message]
2026-08-18 1:08 ` [PATCH] pack-objects: trace pack bytes written Junio C Hamano
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=20260817233914.8740-2-friel@openai.com \
--to=friel@openai.com \
--cc=git@vger.kernel.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.