From: Justin Tobler <jltobler@gmail.com>
To: git@vger.kernel.org
Cc: ps@pks.im, gitster@pobox.com, Justin Tobler <jltobler@gmail.com>
Subject: [PATCH v5 0/9] builtin/receive-pack: support pluggable packfile writes
Date: Thu, 20 Aug 2026 18:49:31 -0500 [thread overview]
Message-ID: <20260820234940.894624-1-jltobler@gmail.com> (raw)
In-Reply-To: <20260819215311.3880274-1-jltobler@gmail.com>
Greetings,
With bdee7b3013 (builtin/receive-pack: stage incoming objects via ODB
transactions, 2026-07-10), git-receive-pack(1) started using the ODB
transaction interfaces to stage incoming objects. While this brought the
command closer to being ODB backend agnostic, the underlying
git-index-pack(1) and git-unpack-objects(1) processes used to actually
write the objects to the transaction are still fundamentally tied to the
"files" backend.
This series aims to address this by introducing a generic
`odb_transaction_write_pack()` transaction interface to handle writing
the incoming packfile to the transaction. The existing logic in
git-receive-pack(1) that spawns the child processes to write the
packfile becomes the "files" backend implementation of this interface.
Changes since V4:
- Added an additional test assertion in the frist patch to ensure keep
files are also migrated to the main ODB prior to being removed when
the transaction is finalized.
- Updated a commit message.
Chances since V3:
- In preparation for future `odb_transaction_write_pack()` users, the
unpack limit takes into consideration odb_transaction_flags to augment
configutation.
- Added additional test assertion in first patch to ensure keep file is
generated and placed in quarantine directory.
- Removed an include statement in favor of just forward declaring a
struct.
- Updated some commit messages.
Changes since V2:
- Added a patch to address a bug causing ".keep" files from not being
removed.
- Started handling errors at transaction commit and finalize call sites
instead of ignoring them. We also make sure
`odb_transaction_finalize()` runs after every successful commit
callsite to ensure proper cleanup.
- Updated the code handling lazy loading of unpack limit configuration
to not longer cache the value.
- Added a patch to begin explictly tracking the ODB source used by the
"files" transaction to avoid relying on the ordering of the ODB source
list.
- Updated some commit messages to improve clarity.
Changes since V1:
- Changed the "release" interface name to "finalize" and updated it to
return error codes.
- Marked some function parameters as const.
- Unpack limit configuration is now resolved in the ODB transaction
backend instead of wiring it through the interface.
- When writing a packfile to the transaction, now only the transaction
source is prepared.
- Updated some commit messages.
- Updated some code formatting.
Thanks for the review,
-Justin
Justin Tobler (9):
builtin/receive-pack: properly clean up keep files
odb/transaction: add transaction finalize interface
builtin/receive-pack: pass shallow file explicitly
builtin/receive-pack: read unpack limit config lazily
builtin/receive-pack: lift global state out of unpack()
builtin/receive-pack: report unpack errors via strbuf
builtin/receive-pack: explicitly pass packfile fd
odb: return temporary ODB source when set
odb/transaction: add transaction interface to write packfiles
builtin/add.c | 4 +-
builtin/receive-pack.c | 211 ++++++++-----------------------------
builtin/unpack-objects.c | 2 +-
builtin/update-index.c | 4 +-
cache-tree.c | 2 +-
fetch-pack.c | 2 +-
object-file.c | 183 +++++++++++++++++++++++++++++++-
odb.c | 9 +-
odb.h | 6 +-
odb/transaction.c | 21 ++++
odb/transaction.h | 85 +++++++++++++++
pack-write.c | 7 +-
pack.h | 4 +-
read-cache.c | 2 +-
t/t5547-push-quarantine.sh | 31 ++++++
tmp-objdir.c | 8 +-
tmp-objdir.h | 6 +-
17 files changed, 399 insertions(+), 188 deletions(-)
Range-diff against v4:
1: 13a57feea7 ! 1: 1bae015e8c builtin/receive-pack: properly clean up keep files
@@ t/t5547-push-quarantine.sh: test_expect_success 'updating a ref from quarantine
+
+ git -C keep.git config set receive.unpackLimit 0 &&
+
-+ # While incoming objects are still quarantined, validate that the keep
-+ # lockfile does indeed exist.
++ # While incoming objects are still quarantined, validate that the
++ # ".keep" lockfile is present in the quarantine directory.
+ test_hook -C keep.git pre-receive <<-\EOF &&
+ keep="$(ls "$GIT_QUARANTINE_PATH"/pack/pack-*.keep)" &&
+ test -f "$keep"
+ EOF
+
++ # After quarantined objects are migrated, validate that the ".keep"
++ # lockfile is migrated and present in the main ODB.
++ test_hook -C keep.git reference-transaction <<-\EOF &&
++ keep="$(ls objects/pack/pack-*.keep)" &&
++ test -f "$keep"
++ EOF
++
+ test_commit foo &&
+ git push keep.git HEAD &&
++
++ # Once the operation is complete, validate that the ".keep" lockfile has
++ # been removed.
+ pack="$(ls keep.git/objects/pack/pack-*.pack)" &&
+ keep="${pack%.pack}.keep" &&
-+
+ test_path_is_file "$pack" &&
+ test_path_is_missing "$keep"
+'
2: 49254af71c ! 2: a2a10966a8 odb/transaction: add transaction finalize interface
@@ Commit message
`odb_transaction_finalize()` call site in git-receive-pack(1) is made
after the reference updates are finished.
- All other callers commit a transaction and immediately finalize it with
- no work in between and cannot meaningfully recover should either fail,
- so introduce an `odb_transaction_commit_and_finalize_or_die()` helper
- that performs both and dies on error. Call sites are updated
- accordingly.
+ All other callers commit a transaction and immediately finalize it
+ without any work happening in between those two operations.
+ Consequently, they cannot meaningfully recover in case either of them
+ would fail, and spelling out these two separate steps with proper error
+ handling would be quite repetitive and pointless. Introduce a helper
+ `odb_transaction_commit_and_finalize_or_die()` for those call sites and
+ update them accordingly.
Signed-off-by: Justin Tobler <jltobler@gmail.com>
3: 882cf06bc3 = 3: 063b1830a1 builtin/receive-pack: pass shallow file explicitly
4: 8deec37a09 = 4: 04c42ebefd builtin/receive-pack: read unpack limit config lazily
5: 92d56134f0 = 5: f4a633a212 builtin/receive-pack: lift global state out of unpack()
6: d614b10715 = 6: 9b89af0bd8 builtin/receive-pack: report unpack errors via strbuf
7: bc5839ad8e = 7: edb54e79f6 builtin/receive-pack: explicitly pass packfile fd
8: 13540b91b8 = 8: 452affa42f odb: return temporary ODB source when set
9: 62d46d5c07 = 9: dae4b96bc3 odb/transaction: add transaction interface to write packfiles
base-commit: 2c78326f810173a4f3aefd8021f1e07575412481
--
2.55.0.424.g13c7afec21
next prev parent reply other threads:[~2026-08-20 23:49 UTC|newest]
Thread overview: 78+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-06 21:38 [PATCH 0/6] builtin/receive-pack: support pluggable packfile writes Justin Tobler
2026-08-06 21:38 ` [PATCH 1/6] odb/transaction: add transaction release interface Justin Tobler
2026-08-07 7:03 ` Patrick Steinhardt
2026-08-07 15:11 ` Justin Tobler
2026-08-06 21:38 ` [PATCH 2/6] builtin/receive-pack: pass shallow file explicitly Justin Tobler
2026-08-07 7:03 ` Patrick Steinhardt
2026-08-06 21:38 ` [PATCH 3/6] builtin/receive-pack: lift global state out of unpack() Justin Tobler
2026-08-07 7:03 ` Patrick Steinhardt
2026-08-07 15:33 ` Justin Tobler
2026-08-06 21:38 ` [PATCH 4/6] builtin/receive-pack: report unpack errors via strbuf Justin Tobler
2026-08-07 7:03 ` Patrick Steinhardt
2026-08-07 15:36 ` Justin Tobler
2026-08-09 19:00 ` Justin Tobler
2026-08-10 5:15 ` Patrick Steinhardt
2026-08-06 21:38 ` [PATCH 5/6] builtin/receive-pack: explicitly pass packfile fd Justin Tobler
2026-08-06 21:38 ` [PATCH 6/6] odb/transaction: add transaction interface to write packfiles Justin Tobler
2026-08-07 7:03 ` Patrick Steinhardt
2026-08-07 16:01 ` Justin Tobler
2026-08-09 19:00 ` [PATCH v2 0/7] builtin/receive-pack: support pluggable packfile writes Justin Tobler
2026-08-09 19:01 ` [PATCH v2 1/7] odb/transaction: add transaction finalize interface Justin Tobler
2026-08-10 3:38 ` Junio C Hamano
2026-08-10 19:10 ` Justin Tobler
2026-08-09 19:01 ` [PATCH v2 2/7] builtin/receive-pack: pass shallow file explicitly Justin Tobler
2026-08-09 19:01 ` [PATCH v2 3/7] builtin/receive-pack: read unpack limit config lazily Justin Tobler
2026-08-10 5:15 ` Patrick Steinhardt
2026-08-10 15:42 ` Justin Tobler
2026-08-10 17:54 ` Junio C Hamano
2026-08-10 19:16 ` Justin Tobler
2026-08-09 19:01 ` [PATCH v2 4/7] builtin/receive-pack: lift global state out of unpack() Justin Tobler
2026-08-09 19:01 ` [PATCH v2 5/7] builtin/receive-pack: report unpack errors via strbuf Justin Tobler
2026-08-09 19:01 ` [PATCH v2 6/7] builtin/receive-pack: explicitly pass packfile fd Justin Tobler
2026-08-09 19:01 ` [PATCH v2 7/7] odb/transaction: add transaction interface to write packfiles Justin Tobler
2026-08-10 1:54 ` Junio C Hamano
2026-08-10 19:29 ` Justin Tobler
2026-08-10 4:02 ` Junio C Hamano
2026-08-10 19:54 ` Justin Tobler
2026-08-11 17:54 ` [PATCH v3 0/9] builtin/receive-pack: support pluggable packfile writes Justin Tobler
2026-08-11 17:54 ` [PATCH v3 1/9] builtin/receive-pack: properly clean up keep files Justin Tobler
2026-08-12 6:07 ` Patrick Steinhardt
2026-08-13 21:45 ` Justin Tobler
2026-08-14 7:46 ` Patrick Steinhardt
2026-08-11 17:54 ` [PATCH v3 2/9] odb/transaction: add transaction finalize interface Justin Tobler
2026-08-12 6:07 ` Patrick Steinhardt
2026-08-11 17:54 ` [PATCH v3 3/9] builtin/receive-pack: pass shallow file explicitly Justin Tobler
2026-08-11 17:54 ` [PATCH v3 4/9] builtin/receive-pack: read unpack limit config lazily Justin Tobler
2026-08-11 17:54 ` [PATCH v3 5/9] builtin/receive-pack: lift global state out of unpack() Justin Tobler
2026-08-11 17:54 ` [PATCH v3 6/9] builtin/receive-pack: report unpack errors via strbuf Justin Tobler
2026-08-11 17:54 ` [PATCH v3 7/9] builtin/receive-pack: explicitly pass packfile fd Justin Tobler
2026-08-11 17:54 ` [PATCH v3 8/9] odb: return temporary ODB source when set Justin Tobler
2026-08-12 6:07 ` Patrick Steinhardt
2026-08-11 17:54 ` [PATCH v3 9/9] odb/transaction: add transaction interface to write packfiles Justin Tobler
2026-08-14 8:51 ` Patrick Steinhardt
2026-08-14 13:40 ` Justin Tobler
2026-08-17 5:17 ` Patrick Steinhardt
2026-08-19 21:53 ` [PATCH v4 0/9] builtin/receive-pack: support pluggable packfile writes Justin Tobler
2026-08-19 21:53 ` [PATCH v4 1/9] builtin/receive-pack: properly clean up keep files Justin Tobler
2026-08-20 6:46 ` Patrick Steinhardt
2026-08-20 21:33 ` Justin Tobler
2026-08-19 21:53 ` [PATCH v4 2/9] odb/transaction: add transaction finalize interface Justin Tobler
2026-08-20 6:46 ` Patrick Steinhardt
2026-08-19 21:53 ` [PATCH v4 3/9] builtin/receive-pack: pass shallow file explicitly Justin Tobler
2026-08-19 21:53 ` [PATCH v4 4/9] builtin/receive-pack: read unpack limit config lazily Justin Tobler
2026-08-19 21:53 ` [PATCH v4 5/9] builtin/receive-pack: lift global state out of unpack() Justin Tobler
2026-08-19 21:53 ` [PATCH v4 6/9] builtin/receive-pack: report unpack errors via strbuf Justin Tobler
2026-08-19 21:53 ` [PATCH v4 7/9] builtin/receive-pack: explicitly pass packfile fd Justin Tobler
2026-08-19 21:53 ` [PATCH v4 8/9] odb: return temporary ODB source when set Justin Tobler
2026-08-19 21:53 ` [PATCH v4 9/9] odb/transaction: add transaction interface to write packfiles Justin Tobler
2026-08-20 6:46 ` Patrick Steinhardt
2026-08-20 23:49 ` Justin Tobler [this message]
2026-08-20 23:49 ` [PATCH v5 1/9] builtin/receive-pack: properly clean up keep files Justin Tobler
2026-08-20 23:49 ` [PATCH v5 2/9] odb/transaction: add transaction finalize interface Justin Tobler
2026-08-20 23:49 ` [PATCH v5 3/9] builtin/receive-pack: pass shallow file explicitly Justin Tobler
2026-08-20 23:49 ` [PATCH v5 4/9] builtin/receive-pack: read unpack limit config lazily Justin Tobler
2026-08-20 23:49 ` [PATCH v5 5/9] builtin/receive-pack: lift global state out of unpack() Justin Tobler
2026-08-20 23:49 ` [PATCH v5 6/9] builtin/receive-pack: report unpack errors via strbuf Justin Tobler
2026-08-20 23:49 ` [PATCH v5 7/9] builtin/receive-pack: explicitly pass packfile fd Justin Tobler
2026-08-20 23:49 ` [PATCH v5 8/9] odb: return temporary ODB source when set Justin Tobler
2026-08-20 23:49 ` [PATCH v5 9/9] odb/transaction: add transaction interface to write packfiles Justin Tobler
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=20260820234940.894624-1-jltobler@gmail.com \
--to=jltobler@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=ps@pks.im \
/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