Git development
 help / color / mirror / Atom feed
From: Justin Tobler <jltobler@gmail.com>
To: Patrick Steinhardt <ps@pks.im>
Cc: git@vger.kernel.org
Subject: Re: [PATCH 3/7] odb/streaming: support streaming arbitrary object types
Date: Tue, 4 Aug 2026 13:03:41 -0500	[thread overview]
Message-ID: <anInniMjCtU9Qae7@denethor> (raw)
In-Reply-To: <20260804-pks-odb-stream-unification-v1-3-86d70e82345e@pks.im>

On 26/08/04 09:25AM, Patrick Steinhardt wrote:
> The object database supports the ability to write object streams into
> it. This functionality is used when we encounter a blob that is larger
> than "core.bigFileThreshold" so that we don't have to soak large files
> into memory.
> 
> As we only ever write large files, the infrastructure doesn't support
> specifying any other object type than "blob". This limitation is quite
> artificial though: there is no reason why we shouldn't support writing
> arbitrary large objects with a stream. While it's very unlikely that we
> encounter a huge object other than a blob, users are known to be
> creative and sometimes like to inflict pain on themselves by creating
> commits or trees that are huge.
> 
> Extend the infrastructure to support streaming arbitrary object types.
> For now we don't use this functionality anywhere, but it brings us a bit
> closer to unify `struct odb_read_stream` and `struct odb_write_stream`.

Very happy to see this change. :)

> Signed-off-by: Patrick Steinhardt <ps@pks.im>
> ---
>  builtin/unpack-objects.c      |  1 +
>  object-file.c                 | 31 +++++++++++++++----------------
>  odb/source-inmemory.c         |  2 +-
>  odb/source-loose.c            |  2 +-
>  odb/streaming.c               |  3 ++-
>  odb/streaming.h               |  3 ++-
>  t/unit-tests/u-odb-inmemory.c |  7 +++++--
>  7 files changed, 27 insertions(+), 22 deletions(-)

Just FYI, there is also a comment in "odb/transaction.h" for the
`write_object_stream` callback that is also now outdated due to this
change. We may want to update that too.

[snip]
> @@ -953,7 +953,7 @@ int index_fd(struct index_state *istate, struct object_id *oid,
>  				 type, path, flags);
>  	} else {
>  		struct odb_write_stream stream;
> -		odb_write_stream_from_fd(&stream, fd, xsize_t(st->st_size));
> +		odb_write_stream_from_fd(&stream, fd, xsize_t(st->st_size), OBJ_BLOB);

We still only target large blobs for streaming here, but the underlying
infrastructure is now generic which is nice.

[snip]
> diff --git a/odb/streaming.h b/odb/streaming.h
> index 5e8e6e532e..3c8ed55129 100644
> --- a/odb/streaming.h
> +++ b/odb/streaming.h
> @@ -56,6 +56,7 @@ struct odb_write_stream {
>  	ssize_t (*read)(struct odb_write_stream *, unsigned char *, size_t);
>  	void *data;
>  	size_t size;
> +	enum object_type type;

We now store the object type in the stream itself. Similar to size
information, the type information is always known in advance when
creating the object stream.

The rest of this patch is just updating call sites accordingly. Looks
good.

-Justin

  reply	other threads:[~2026-08-04 18:03 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-04  7:25 [PATCH 0/7] odb: unify read and write streams Patrick Steinhardt
2026-08-04  7:25 ` [PATCH 1/7] odb/streaming: track write stream size in the structure Patrick Steinhardt
2026-08-04 16:47   ` Justin Tobler
2026-08-04  7:25 ` [PATCH 2/7] odb/streaming: drop `is_finished` field Patrick Steinhardt
2026-08-04 17:46   ` Justin Tobler
2026-08-04  7:25 ` [PATCH 3/7] odb/streaming: support streaming arbitrary object types Patrick Steinhardt
2026-08-04 18:03   ` Justin Tobler [this message]
2026-08-05  6:06     ` Patrick Steinhardt
2026-08-04 18:54   ` Junio C Hamano
2026-08-05  6:06     ` Patrick Steinhardt
2026-08-04  7:25 ` [PATCH 4/7] odb/streaming: rename `struct odb_read_stream` Patrick Steinhardt
2026-08-04  7:25 ` [PATCH 5/7] odb/streaming: consolidate read and write streams Patrick Steinhardt
2026-08-04 18:23   ` Justin Tobler
2026-08-05  6:06     ` Patrick Steinhardt
2026-08-04  7:25 ` [PATCH 6/7] odb/streaming: rename `struct read_object_fd_data` Patrick Steinhardt
2026-08-04 18:25   ` Justin Tobler
2026-08-04  7:25 ` [PATCH 7/7] odb/streaming: unify function names to create new streams Patrick Steinhardt
2026-08-04 18:30   ` Justin Tobler
2026-08-05  7:44 ` [PATCH v2 0/8] odb: unify read and write streams Patrick Steinhardt
2026-08-05  7:44   ` [PATCH v2 1/8] odb/streaming: track write stream size in the structure Patrick Steinhardt
2026-08-05  7:44   ` [PATCH v2 2/8] odb/streaming: drop `is_finished` field Patrick Steinhardt
2026-08-05  7:44   ` [PATCH v2 3/8] odb/streaming: support streaming arbitrary object types Patrick Steinhardt
2026-08-05  7:44   ` [PATCH v2 4/8] odb/streaming: rename `struct odb_read_stream` Patrick Steinhardt
2026-08-05  7:44   ` [PATCH v2 5/8] odb/streaming: consolidate read and write streams Patrick Steinhardt
2026-08-05  7:44   ` [PATCH v2 6/8] odb/streaming: rename `struct read_object_fd_data` Patrick Steinhardt
2026-08-05  7:44   ` [PATCH v2 7/8] odb/streaming: rename `struct input_zstream_data` Patrick Steinhardt
2026-08-05  7:44   ` [PATCH v2 8/8] odb/streaming: unify function names to create new streams Patrick Steinhardt

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=anInniMjCtU9Qae7@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox