From: "Elijah Newren via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: Elijah Newren <newren@gmail.com>
Subject: [PATCH 0/2] Objects treated as missing despite being present, due to race with geometric repacking
Date: Tue, 18 Aug 2026 22:34:04 +0000 [thread overview]
Message-ID: <pull.2207.git.1787092446.gitgitgadget@gmail.com> (raw)
When an object is found in multiple packs that are in a multi-pack-index,
and a subsequent geometric repacking creates a new multi-pack-index and
removes the pack that was considered the owner of the object in the old
multi-pack-index, then an already-running process that had opened the old
multi-pack-index and hadn't yet opened the removed packfile will not be able
to access the object -- lookups will return it as missing. Additionally,
replay has a separate bug where a missing object causes a SIGSEGV rather
than an error message.
This appears to affect a very small percentage of git operations in
production since it is a tiny window, but I've found evidence of it
occurring in at least eight distinct server-side operations, covering seven
different git commands:
git operation symptom
----------------------------------- -----------------------------
git replay (server-side rebase) SIGSEGV (this series, 1/2)
git merge-tree spurious read-miss failure
git diff (raw and tree-vs-tree) spurious read-miss failure
git rev-list --count spurious read-miss failure
git merge-base spurious read-miss failure
object/rev resolution (rev-parse, spurious read-miss failure
cat-file)
repository repair (fsck/repack) spurious read-miss failure
There are also commands that could be changing behavior without throwing an
error -- e.g. object negotiation thinking an object doesn't exist and
instead negotiating based on an older common commit, or cat-file --batch
reporting that some objects don't exist.
This series fixes the replay bug first, since it's simpler; investigating
it, together with my other recent repacking work, is what led me to the
underlying multi-pack-index issue that 2/2 addresses.
Elijah Newren (2):
replay: fail gracefully when a merge input is unreadable
packfile: recover when a multi-pack-index names a removed pack
odb/source-packed.c | 29 +++++++++++++++++++++++++++
replay.c | 7 +++++++
t/t3650-replay-basics.sh | 35 ++++++++++++++++++++++++++++++++
t/t5319-multi-pack-index.sh | 40 +++++++++++++++++++++++++++++++++++++
4 files changed, 111 insertions(+)
base-commit: 18e66859d87fb4b76599f73460b54f0848c76b16
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-2207%2Fnewren%2Fmidx-removed-pack-recovery-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-2207/newren/midx-removed-pack-recovery-v1
Pull-Request: https://github.com/gitgitgadget/git/pull/2207
--
gitgitgadget
next reply other threads:[~2026-08-18 22:34 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-18 22:34 Elijah Newren via GitGitGadget [this message]
2026-08-18 22:34 ` [PATCH 1/2] replay: fail gracefully when a merge input is unreadable Elijah Newren via GitGitGadget
2026-08-18 22:34 ` [PATCH 2/2] packfile: recover when a multi-pack-index names a removed pack Elijah Newren via GitGitGadget
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=pull.2207.git.1787092446.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=git@vger.kernel.org \
--cc=newren@gmail.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 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.