From: Justin Tobler <jltobler@gmail.com>
To: Patrick Steinhardt <ps@pks.im>
Cc: git@vger.kernel.org
Subject: Re: [PATCH 2/6] odb: make backend-specific fields optional
Date: Mon, 29 Jun 2026 12:25:21 -0500 [thread overview]
Message-ID: <akKmwPGSAGEGKZjL@denethor> (raw)
In-Reply-To: <20260624-b4-pks-odb-drop-whence-v1-2-8d1877b790ac@pks.im>
On 26/06/24 02:19PM, Patrick Steinhardt wrote:
> The `struct object_info` carries two pieces of information
> about how an object was looked up:
>
> - The `whence` enum identifying the backend.
>
> - The backend-tagged union `u` exposing backend-specific details
> (currently only the packed-source case, which records the owning
> pack, offset and packed object type).
>
> The union is populated unconditionally, even though most callers don't
> care about provenance at all.
>
> Split the backend-specific union out into a new public type, `struct
> object_info_source`, and make the object info structure carry it via
> just another opt-in request pointer. As with all the other requestable
> information, callers that need source info allocate a `struct
> object_info_source` on the stack and point `sourcep` at it; callers that
> don't care about it simply leave the field as a `NULL` pointer. Adapt
> callers accordingly.
Since not all callers may require this information, requiring callers to
explicitly request it seems reasonable to me.
> Note that the `whence` enum is strictly-speaking also backend-specific
> information, so it would be another good candidate to be moved into the
> `struct object_info_source`. For now though it is left alone, as it will
> be replaced by a `struct odb_source` pointer in a subsequent commit.
>
> Signed-off-by: Patrick Steinhardt <ps@pks.im>
> ---
> builtin/cat-file.c | 8 +++++--
> builtin/index-pack.c | 8 +++++--
> builtin/pack-objects.c | 15 +++++++++----
> odb.c | 3 ++-
> odb.h | 60 +++++++++++++++++++++++++++++++++-----------------
> packfile.c | 33 ++++++++++++++-------------
> reachable.c | 5 ++++-
> 7 files changed, 87 insertions(+), 45 deletions(-)
>
> diff --git a/builtin/cat-file.c b/builtin/cat-file.c
> index 8726485f1f..adc626ce30 100644
> --- a/builtin/cat-file.c
> +++ b/builtin/cat-file.c
> @@ -835,7 +835,8 @@ static int batch_one_object_oi(const struct object_id *oid,
> {
> struct for_each_object_payload *payload = _payload;
> if (oi && oi->whence == OI_PACKED)
> - return payload->callback(oid, oi->u.packed.pack, oi->u.packed.offset,
> + return payload->callback(oid, oi->sourcep->u.packed.pack,
> + oi->sourcep->u.packed.offset,
> payload->payload);
We update callsites now that object source info is stored differently in
`struct object_info`.
> return payload->callback(oid, NULL, 0, payload->payload);
> }
> @@ -906,7 +907,10 @@ static void batch_each_object(struct batch_options *opt,
> &payload, flags);
> }
> } else {
> - struct object_info oi = { 0 };
> + struct object_info_source oi_source;
> + struct object_info oi = {
> + .sourcep = &oi_source,
> + };
Caller that wish to know information regarding the source of the object
are required to explicitly request it. Makes sense.
[snip]
> struct object_info {
> /* Request */
> enum object_type *typep;
> @@ -269,32 +301,20 @@ struct object_info {
> */
> time_t *mtimep;
>
> + /*
> + * Backend-specific information that tells the caller where exactly an
> + * object was looked up from. This information should help disambiguate
> + * object lookups in case the same object exists in multiple sources,
> + * or multiple times in the same source.
> + */
> + struct object_info_source *sourcep;
To me, the name `sourcep` makes me think a pointer to `struct
odb_source`. This did confuse me slightly when initially reading, but
I'm not sure it's worth it to be overly verbose here.
[snip]
> diff --git a/packfile.c b/packfile.c
> index 2b741d7a76..688c410b35 100644
> --- a/packfile.c
> +++ b/packfile.c
> @@ -1422,22 +1422,25 @@ int packed_object_info_with_index_pos(struct odb_source_packed *source UNUSED,
> }
>
> oi->whence = OI_PACKED;
> - oi->u.packed.offset = obj_offset;
> - oi->u.packed.pack = p;
>
> - switch (type) {
> - case OBJ_NONE:
> - oi->u.packed.type = PACKED_OBJECT_TYPE_UNKNOWN;
> - break;
> - case OBJ_REF_DELTA:
> - oi->u.packed.type = PACKED_OBJECT_TYPE_REF_DELTA;
> - break;
> - case OBJ_OFS_DELTA:
> - oi->u.packed.type = PACKED_OBJECT_TYPE_OFS_DELTA;
> - break;
> - default:
> - oi->u.packed.type = PACKED_OBJECT_TYPE_FULL;
> - break;
> + if (oi->sourcep) {
> + oi->sourcep->u.packed.offset = obj_offset;
> + oi->sourcep->u.packed.pack = p;
> +
> + switch (type) {
> + case OBJ_NONE:
> + oi->sourcep->u.packed.type = PACKED_OBJECT_TYPE_UNKNOWN;
> + break;
> + case OBJ_REF_DELTA:
> + oi->sourcep->u.packed.type = PACKED_OBJECT_TYPE_REF_DELTA;
> + break;
> + case OBJ_OFS_DELTA:
> + oi->sourcep->u.packed.type = PACKED_OBJECT_TYPE_OFS_DELTA;
> + break;
> + default:
> + oi->sourcep->u.packed.type = PACKED_OBJECT_TYPE_FULL;
> + break;
> + }
Source information is no longer unconditionally set.
Overall, this patch looks good.
-Justin
next prev parent reply other threads:[~2026-06-29 17:25 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-24 12:19 [PATCH 0/6] odb: refactor source-specific information in object info Patrick Steinhardt
2026-06-24 12:19 ` [PATCH 1/6] packfile: thread odb_source_packed through packed_object_info() Patrick Steinhardt
2026-06-29 17:01 ` Justin Tobler
2026-06-30 11:28 ` Patrick Steinhardt
2026-06-24 12:19 ` [PATCH 2/6] odb: make backend-specific fields optional Patrick Steinhardt
2026-06-29 17:25 ` Justin Tobler [this message]
2026-06-30 11:28 ` Patrick Steinhardt
2026-06-24 12:19 ` [PATCH 3/6] odb: add `source` field to struct object_info_source Patrick Steinhardt
2026-06-29 17:49 ` Justin Tobler
2026-06-29 20:47 ` Junio C Hamano
2026-06-30 11:28 ` Patrick Steinhardt
2026-06-30 16:54 ` Junio C Hamano
2026-06-24 12:19 ` [PATCH 4/6] treewide: convert users of `whence` to the new source field Patrick Steinhardt
2026-06-29 17:55 ` Justin Tobler
2026-06-24 12:19 ` [PATCH 5/6] odb: drop `whence` field from object info Patrick Steinhardt
2026-06-29 17:57 ` Justin Tobler
2026-06-24 12:19 ` [PATCH 6/6] odb: document object info fields Patrick Steinhardt
2026-06-24 17:13 ` [PATCH 0/6] odb: refactor source-specific information in object info Junio C Hamano
2026-07-02 12:01 ` [PATCH v2 " Patrick Steinhardt
2026-07-02 12:01 ` [PATCH v2 1/6] packfile: thread odb_source_packed through packed_object_info() Patrick Steinhardt
2026-07-02 12:02 ` [PATCH v2 2/6] odb: make backend-specific fields optional Patrick Steinhardt
2026-07-02 12:02 ` [PATCH v2 3/6] odb: add `source` field to struct object_info_source Patrick Steinhardt
2026-07-02 12:02 ` [PATCH v2 4/6] treewide: convert users of `whence` to the new source field Patrick Steinhardt
2026-07-02 12:02 ` [PATCH v2 5/6] odb: drop `whence` field from object info Patrick Steinhardt
2026-07-02 12:02 ` [PATCH v2 6/6] odb: document object info fields Patrick Steinhardt
2026-07-05 1:28 ` [PATCH v2 0/6] odb: refactor source-specific information in object info 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=akKmwPGSAGEGKZjL@denethor \
--to=jltobler@gmail.com \
--cc=git@vger.kernel.org \
--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 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.