From: David Lin <davidzylin@gmail.com>
To: git@vger.kernel.org
Cc: gitster@pobox.com, me@ttaylorr.com, David Lin <davidlin@stripe.com>
Subject: [PATCH] pack-bitmap: handle objects at bitmap position zero
Date: Mon, 27 Jul 2026 13:13:31 -0400 [thread overview]
Message-ID: <20260727171331.21088-1-davidlin@stripe.com> (raw)
`bitmap_position()` only returns a negative value when an object is not present in the bitmap index.
In `find_objects()`, we have added a check in 11d45a6e6a to avoid processing a root whose reachability is already represented by the base bitmap, but accidentally uses `pos > 0`. Consequently, it never performs the membership test for an object at position zero.
If that object has an individual reachability bitmap, we unnecessarily load and OR that bitmap into the base again. Otherwise, we add the object to the not-mapped list, only for the subsequent pass to recognize that it is already present. The latter pass correctly treats all non-negative positions as valid, so this does not change the resulting object set, but an off-by-one edge case.
Treat position zero as valid by changing the condition to `pos >= 0`.
The existing pseudo-merge traversal test exercises this case. Its position-zero commit is presented through multiple roots. Before this change, each occurrence is counted as a bitmap hit; afterwards, only the first occurrence loads the bitmap. Assert the resulting hit count to cover the boundary condition.
Thanks in advance for the review!
Signed-off-by: David Lin <davidlin@stripe.com>
---
pack-bitmap.c | 2 +-
t/t5333-pseudo-merge-bitmaps.sh | 4 ++++
2 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/pack-bitmap.c b/pack-bitmap.c
index d8dc4ae8d1..e85bd69ba4 100644
--- a/pack-bitmap.c
+++ b/pack-bitmap.c
@@ -1569,7 +1569,7 @@ static struct bitmap *find_objects(struct bitmap_index *bitmap_git,
if (base) {
int pos = bitmap_position(bitmap_git, &object->oid);
- if (pos > 0 && bitmap_get(base, pos)) {
+ if (pos >= 0 && bitmap_get(base, pos)) {
object->flags |= SEEN;
continue;
}
diff --git a/t/t5333-pseudo-merge-bitmaps.sh b/t/t5333-pseudo-merge-bitmaps.sh
index 305d677108..2a6c0e2318 100755
--- a/t/t5333-pseudo-merge-bitmaps.sh
+++ b/t/t5333-pseudo-merge-bitmaps.sh
@@ -85,6 +85,10 @@ test_expect_success 'bitmap traversal with pseudo-merges' '
test_pseudo_merges_satisfied 8 <trace2.txt &&
test_pseudo_merges_cascades 1 <trace2.txt &&
+
+ # Position zero is named by HEAD, its branch, and its tag, but its
+ # bitmap should only be loaded once.
+ test_trace2_data bitmap bitmap/hits 1 <trace2.txt &&
test_cmp expect actual
'
base-commit: 9a0c4701dcd5725c4184599322b52933ff5005ca
--
2.54.0
next reply other threads:[~2026-07-27 17:15 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-27 17:13 David Lin [this message]
2026-07-27 20:05 ` [PATCH] pack-bitmap: handle objects at bitmap position zero Taylor Blau
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=20260727171331.21088-1-davidlin@stripe.com \
--to=davidzylin@gmail.com \
--cc=davidlin@stripe.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=me@ttaylorr.com \
/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