Git development
 help / color / mirror / Atom feed
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


  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