git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Patrick Steinhardt <ps@pks.im>
To: Eric Ju <eric.peijian@gmail.com>
Cc: git@vger.kernel.org, calvinwan@google.com,
	jonathantanmy@google.com, chriscool@tuxfamily.org,
	karthik.188@gmail.com, toon@iotcl.com, jltobler@gmail.com
Subject: Re: [PATCH v7 5/6] transport: add client support for object-info
Date: Mon, 25 Nov 2024 10:51:40 +0100	[thread overview]
Message-ID: <Z0RIrKwUnaWWm_gJ@pks.im> (raw)
In-Reply-To: <20241125053616.25170-6-eric.peijian@gmail.com>

On Mon, Nov 25, 2024 at 12:36:15AM -0500, Eric Ju wrote:
> diff --git a/fetch-object-info.c b/fetch-object-info.c
> new file mode 100644
> index 0000000000..2aa9f2b70d
> --- /dev/null
> +++ b/fetch-object-info.c
> @@ -0,0 +1,92 @@
> +#include "git-compat-util.h"
> +#include "gettext.h"
> +#include "hex.h"
> +#include "pkt-line.h"
> +#include "connect.h"
> +#include "oid-array.h"
> +#include "object-store-ll.h"
> +#include "fetch-object-info.h"
> +#include "string-list.h"
> +
> +/**
> + * send_object_info_request sends git-cat-file object-info command and its
> + * arguments into the request buffer.
> + */
> +static void send_object_info_request(const int fd_out, struct object_info_args *args)
> +{
> +	struct strbuf req_buf = STRBUF_INIT;
> +
> +	write_command_and_capabilities(&req_buf, "object-info", args->server_options);
> +
> +	if (unsorted_string_list_has_string(args->object_info_options, "size"))
> +		packet_buf_write(&req_buf, "size");

Do we have a document somewhere that spells out the wire format that
client- and server-side talk with each other? If so it would be nice to
point it out in the commit message so that I know where to look, and
otherwise we should document it. Without such a doc it's hard to figure
out whether this is correct.

> +	if (args->oids) {
> +		for (size_t i = 0; i < args->oids->nr; i++)
> +			packet_buf_write(&req_buf, "oid %s", oid_to_hex(&args->oids->oid[i]));
> +	}

Nit: needless curly braces.

> +	packet_buf_flush(&req_buf);
> +	if (write_in_full(fd_out, req_buf.buf, req_buf.len) < 0)
> +		die_errno(_("unable to write request to remote"));

So we write the whole request into `req_buf` first before sending it to
the remote. Isn't that quite inefficient memory wise? In other words,
couldn't we instead stream the request line by line or at least in
batches to the file descriptor?

> +	strbuf_release(&req_buf);
> +}
> +
> +/**

Nit: s|/**|/*|

> + * fetch_object_info sends git-cat-file object-info command into the request buf
> + * and read the results from packets.
> + */
> +int fetch_object_info(const enum protocol_version version, struct object_info_args *args,
> +		      struct packet_reader *reader, struct object_info *object_info_data,
> +		      const int stateless_rpc, const int fd_out)
> +{
> +	int size_index = -1;
> +
> +	switch (version) {
> +	case protocol_v2:
> +		if (!server_supports_v2("object-info"))
> +			die(_("object-info capability is not enabled on the server"));
> +		send_object_info_request(fd_out, args);
> +		break;
> +	case protocol_v1:
> +	case protocol_v0:
> +		die(_("wrong protocol version. expected v2"));
> +	case protocol_unknown_version:
> +		BUG("unknown protocol version");
> +	}
> +
> +	for (size_t i = 0; i < args->object_info_options->nr; i++) {
> +		if (packet_reader_read(reader) != PACKET_READ_NORMAL) {
> +			check_stateless_delimiter(stateless_rpc, reader, "stateless delimiter expected");
> +			return -1;
> +		}
> +		if (unsorted_string_list_has_string(args->object_info_options, reader->line)) {

Hum. Does this result in quadratic runtime behaviour?

> +			if (!strcmp(reader->line, "size")) {
> +				size_index = i;
> +				for (size_t j = 0; j < args->oids->nr; j++)
> +					object_info_data[j].sizep = xcalloc(1, sizeof(long));

This might be a bit more future proof in case the `sizep` type were ever
to change:

	object_info_data[j].sizep = xcalloc(1, sizeof(*object_info_data[j].sizep));

It also allows you to skip double-checking whether you picked the
correct type. In fact, the type is actually an `unsigned long`, which
is confusing but ultimately does not make much of a difference because
it should have the same size.

> +			}
> +			continue;
> +		}
> +		return -1;
> +	}
> +
> +	for (size_t i = 0; packet_reader_read(reader) == PACKET_READ_NORMAL && i < args->oids->nr; i++){
> +		struct string_list object_info_values = STRING_LIST_INIT_DUP;
> +
> +		string_list_split(&object_info_values, reader->line, ' ', -1);
> +		if (0 <= size_index) {
> +			if (!strcmp(object_info_values.items[1 + size_index].string, ""))
> +				die("object-info: not our ref %s",
> +					object_info_values.items[0].string);
> +
> +			*object_info_data[i].sizep = strtoul(object_info_values.items[1 + size_index].string, NULL, 10);

We're completely missing error handling for strtoul(3p) here. That
function is also discouraged nowadays because error handling is hard to
do correct. We have `strtoul_ui()` and friends, but don't have a variant
yet that know to return an `unsigned long`. We might backfill that
omission and then use it instead.

> diff --git a/transport-helper.c b/transport-helper.c
> index bc27653cde..bf0a1877c7 100644
> --- a/transport-helper.c
> +++ b/transport-helper.c
> @@ -728,6 +728,13 @@ static int fetch_refs(struct transport *transport,
>  		free_refs(dummy);
>  	}
>  
> +	/* fail the command explicitly to avoid further commands input. */
> +	if (transport->smart_options->object_info)
> +		die(_("remote-object-info requires protocol v2"));

The code path that checks for for protocol v2 with "--negotiate-only"
knows to warn and return an error. Should we do the same here?

> diff --git a/transport.c b/transport.c
> index 47fda6a773..746ec19ddc 100644
> --- a/transport.c
> +++ b/transport.c
> @@ -9,6 +9,7 @@
>  #include "hook.h"
>  #include "pkt-line.h"
>  #include "fetch-pack.h"
> +#include "fetch-object-info.h"
>  #include "remote.h"
>  #include "connect.h"
>  #include "send-pack.h"
> @@ -444,8 +445,33 @@ static int fetch_refs_via_pack(struct transport *transport,
>  	args.server_options = transport->server_options;
>  	args.negotiation_tips = data->options.negotiation_tips;
>  	args.reject_shallow_remote = transport->smart_options->reject_shallow;
> +	args.object_info = transport->smart_options->object_info;
> +
> +	if (transport->smart_options
> +		&& transport->smart_options->object_info
> +		&& transport->smart_options->object_info_oids->nr > 0) {

Formatting is wrong here:

	if (transport->smart_options &&
	    transport->smart_options->object_info &&
	    transport->smart_options->object_info_oids->nr > 0) {

Patrick

  reply	other threads:[~2024-11-25  9:51 UTC|newest]

Thread overview: 174+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-06-28 19:04 [PATCH 0/6] cat-file: add remote-object-info to batch-command Eric Ju
2024-06-28 19:04 ` [PATCH 1/6] fetch-pack: refactor packet writing Eric Ju
2024-07-04 16:59   ` Karthik Nayak
2024-07-08 15:17     ` Peijian Ju
2024-07-10  9:39       ` Karthik Nayak
2024-07-15 16:40         ` Peijian Ju
2024-06-28 19:04 ` [PATCH 2/6] fetch-pack: move fetch initialization Eric Ju
2024-06-28 19:05 ` [PATCH 3/6] serve: advertise object-info feature Eric Ju
2024-06-28 19:05 ` [PATCH 4/6] transport: add client support for object-info Eric Ju
2024-07-09  7:15   ` Toon claes
2024-07-09 16:37     ` Junio C Hamano
2024-07-13  2:32       ` Peijian Ju
2024-07-13  2:30     ` Peijian Ju
2024-07-10 10:13   ` Karthik Nayak
2024-07-16  2:39     ` Peijian Ju
2024-06-28 19:05 ` [PATCH 5/6] cat-file: add declaration of variable i inside its for loop Eric Ju
2024-07-10 10:16   ` Karthik Nayak
2024-07-16  2:59     ` Peijian Ju
2024-06-28 19:05 ` [PATCH 6/6] cat-file: add remote-object-info to batch-command Eric Ju
2024-07-09  1:50   ` Justin Tobler
2024-07-12 17:41     ` Peijian Ju
2024-07-09  7:16   ` Toon claes
2024-07-13  2:35     ` Peijian Ju
2024-07-10 12:08   ` Karthik Nayak
2024-07-17  2:38     ` Peijian Ju
2024-07-20  3:43 ` [PATCH v2 0/6] " Eric Ju
2024-07-20  3:43   ` [PATCH v2 1/6] fetch-pack: refactor packet writing Eric Ju
2024-09-24 11:45     ` Christian Couder
2024-09-25 20:42       ` Peijian Ju
2024-07-20  3:43   ` [PATCH v2 2/6] fetch-pack: move fetch initialization Eric Ju
2024-07-20  3:43   ` [PATCH v2 3/6] serve: advertise object-info feature Eric Ju
2024-07-20  3:43   ` [PATCH v2 4/6] transport: add client support for object-info Eric Ju
2024-09-24 11:45     ` Christian Couder
2024-09-24 17:29       ` Junio C Hamano
2024-09-25 18:29       ` Peijian Ju
2024-07-20  3:43   ` [PATCH v2 5/6] cat-file: add declaration of variable i inside its for loop Eric Ju
2024-07-20  3:43   ` [PATCH v2 6/6] cat-file: add remote-object-info to batch-command Eric Ju
2024-09-11 13:11     ` Toon Claes
2024-09-25 18:18       ` Peijian Ju
2024-09-24 12:13     ` Christian Couder
2024-09-25 18:12       ` Peijian Ju
2024-08-22 21:24 ` [PATCH 0/6] " Peijian Ju
2024-09-26  1:38 ` [PATCH v3 " Eric Ju
2024-09-26  1:38   ` [PATCH v3 1/6] fetch-pack: refactor packet writing Eric Ju
2024-09-26  1:38   ` [PATCH v3 2/6] fetch-pack: move fetch initialization Eric Ju
2024-09-26  1:38   ` [PATCH v3 3/6] serve: advertise object-info feature Eric Ju
2024-09-26  1:38   ` [PATCH v3 4/6] transport: add client support for object-info Eric Ju
2024-10-23  9:48     ` Christian Couder
2024-10-24 20:23       ` Peijian Ju
2024-09-26  1:38   ` [PATCH v3 5/6] cat-file: add declaration of variable i inside its for loop Eric Ju
2024-09-26  1:38   ` [PATCH v3 6/6] cat-file: add remote-object-info to batch-command Eric Ju
2024-10-23  9:49     ` Christian Couder
2024-10-23 20:25       ` Taylor Blau
2024-10-24 20:28         ` Peijian Ju
2024-10-24 20:28       ` Peijian Ju
2024-10-24 20:53 ` [PATCH v4 0/6] " Eric Ju
2024-10-24 20:53   ` [PATCH v4 1/6] fetch-pack: refactor packet writing Eric Ju
2024-10-25  9:52     ` karthik nayak
2024-10-25 16:06       ` Peijian Ju
2024-10-24 20:53   ` [PATCH v4 2/6] fetch-pack: move fetch initialization Eric Ju
2024-10-24 20:53   ` [PATCH v4 3/6] serve: advertise object-info feature Eric Ju
2024-10-24 20:53   ` [PATCH v4 4/6] transport: add client support for object-info Eric Ju
2024-10-25 10:12     ` karthik nayak
2024-10-28  5:39       ` Peijian Ju
2024-10-24 20:53   ` [PATCH v4 5/6] cat-file: add declaration of variable i inside its for loop Eric Ju
2024-10-24 20:53   ` [PATCH v4 6/6] cat-file: add remote-object-info to batch-command Eric Ju
2024-10-25 10:53     ` karthik nayak
2024-10-25 13:55       ` Christian Couder
2024-10-25 20:56   ` [PATCH v4 0/6] " Taylor Blau
2024-10-27  3:54     ` Peijian Ju
2024-10-28  0:01       ` Taylor Blau
2024-10-28 20:34 ` [PATCH v5 " Eric Ju
2024-10-28 20:34   ` [PATCH v5 1/6] fetch-pack: refactor packet writing Eric Ju
2024-11-05 17:44     ` Christian Couder
2024-11-06  1:06       ` Junio C Hamano
2024-11-06 18:00         ` Peijian Ju
2024-11-06 19:50       ` Peijian Ju
2024-10-28 20:34   ` [PATCH v5 2/6] fetch-pack: move fetch initialization Eric Ju
2024-10-28 20:34   ` [PATCH v5 3/6] serve: advertise object-info feature Eric Ju
2024-10-28 20:34   ` [PATCH v5 4/6] transport: add client support for object-info Eric Ju
2024-10-28 20:34   ` [PATCH v5 5/6] cat-file: add declaration of variable i inside its for loop Eric Ju
2024-10-28 20:34   ` [PATCH v5 6/6] cat-file: add remote-object-info to batch-command Eric Ju
2024-11-08 16:24 ` [PATCH v6 0/6] " Eric Ju
2024-11-08 16:24   ` [PATCH v6 1/6] cat-file: add declaration of variable i inside its for loop Eric Ju
2024-11-08 16:24   ` [PATCH v6 2/6] fetch-pack: refactor packet writing Eric Ju
2024-11-08 16:24   ` [PATCH v6 3/6] fetch-pack: move fetch initialization Eric Ju
2024-11-08 16:24   ` [PATCH v6 4/6] serve: advertise object-info feature Eric Ju
2024-11-08 16:24   ` [PATCH v6 5/6] transport: add client support for object-info Eric Ju
2024-11-08 16:24   ` [PATCH v6 6/6] cat-file: add remote-object-info to batch-command Eric Ju
2024-11-11  4:38   ` [PATCH v6 0/6] " Junio C Hamano
2024-11-18 16:28     ` Peijian Ju
2024-11-19  0:16       ` Junio C Hamano
2024-11-19  6:31         ` Patrick Steinhardt
2024-11-19  6:48           ` Junio C Hamano
2024-11-19 16:35             ` Peijian Ju
2024-11-20  1:19               ` Junio C Hamano
2024-11-25  5:36 ` [PATCH v7 " Eric Ju
2024-11-25  5:36   ` [PATCH v7 1/6] cat-file: add declaration of variable i inside its for loop Eric Ju
2024-11-25  9:51     ` Patrick Steinhardt
2024-12-03 19:26       ` Peijian Ju
2024-11-25  5:36   ` [PATCH v7 2/6] fetch-pack: refactor packet writing Eric Ju
2024-11-25  9:51     ` Patrick Steinhardt
2024-12-03 19:09       ` Peijian Ju
2024-11-25  5:36   ` [PATCH v7 3/6] fetch-pack: move fetch initialization Eric Ju
2024-11-25  5:36   ` [PATCH v7 4/6] serve: advertise object-info feature Eric Ju
2024-11-25  5:36   ` [PATCH v7 5/6] transport: add client support for object-info Eric Ju
2024-11-25  9:51     ` Patrick Steinhardt [this message]
2024-12-03  3:15       ` Peijian Ju
2024-11-25  5:36   ` [PATCH v7 6/6] cat-file: add remote-object-info to batch-command Eric Ju
2024-11-25  9:51     ` Patrick Steinhardt
2024-12-03 19:23       ` Peijian Ju
2024-12-05  9:50         ` Patrick Steinhardt
2024-12-05 10:34           ` Christian Couder
2024-12-23 23:25 ` [PATCH v8 0/6] " Eric Ju
2024-12-23 23:25   ` [PATCH v8 1/6] cat-file: add declaration of variable i inside its for loop Eric Ju
2024-12-23 23:25   ` [PATCH v8 2/6] fetch-pack: refactor packet writing Eric Ju
2024-12-23 23:25   ` [PATCH v8 3/6] fetch-pack: move fetch initialization Eric Ju
2024-12-23 23:25   ` [PATCH v8 4/6] serve: advertise object-info feature Eric Ju
2024-12-23 23:25   ` [PATCH v8 5/6] transport: add client support for object-info Eric Ju
2025-01-07 18:31     ` Calvin Wan
2025-01-07 18:53       ` Junio C Hamano
2025-01-08 15:55       ` Peijian Ju
2024-12-23 23:25   ` [PATCH v8 6/6] cat-file: add remote-object-info to batch-command Eric Ju
2025-01-07 21:29     ` Calvin Wan
2024-12-26 21:56   ` [PATCH v8 0/6] " Junio C Hamano
2024-12-30 23:25     ` Peijian Ju
2025-01-08 18:37 ` [PATCH v9 0/8] cat-file: " Eric Ju
2025-01-08 18:37   ` [PATCH v9 1/8] git-compat-util: add strtoul_ul() with error handling Eric Ju
2025-01-10 11:33     ` Christian Couder
2025-01-14  1:39       ` Peijian Ju
2025-01-08 18:37   ` [PATCH v9 2/8] cat-file: add declaration of variable i inside its for loop Eric Ju
2025-01-10 11:39     ` Christian Couder
2025-01-14  1:36       ` Peijian Ju
2025-01-08 18:37   ` [PATCH v9 3/8] cat-file: split test utility functions into a separate library file Eric Ju
2025-01-10 14:26     ` Christian Couder
2025-01-14  1:33       ` Peijian Ju
2025-01-08 18:37   ` [PATCH v9 4/8] fetch-pack: refactor packet writing Eric Ju
2025-01-08 18:37   ` [PATCH v9 5/8] fetch-pack: move fetch initialization Eric Ju
2025-01-08 18:37   ` [PATCH v9 6/8] serve: advertise object-info feature Eric Ju
2025-01-08 18:37   ` [PATCH v9 7/8] transport: add client support for object-info Eric Ju
2025-01-08 18:37   ` [PATCH v9 8/8] cat-file: add remote-object-info to batch-command Eric Ju
2025-01-10 11:20     ` Christian Couder
2025-01-14  1:24       ` Peijian Ju
2025-01-14  2:14 ` [PATCH v10 0/8] " Eric Ju
2025-01-14  2:14   ` [PATCH v10 1/8] git-compat-util: add strtoul_ul() with error handling Eric Ju
2025-01-14  2:14   ` [PATCH v10 2/8] cat-file: add declaration of variable i inside its for loop Eric Ju
2025-01-14  2:14   ` [PATCH v10 3/8] t1006: split test utility functions into new "lib-cat-file.sh" Eric Ju
2025-01-14  2:14   ` [PATCH v10 4/8] fetch-pack: refactor packet writing Eric Ju
2025-01-14  2:14   ` [PATCH v10 5/8] fetch-pack: move fetch initialization Eric Ju
2025-01-14  2:14   ` [PATCH v10 6/8] serve: advertise object-info feature Eric Ju
2025-01-14  2:14   ` [PATCH v10 7/8] transport: add client support for object-info Eric Ju
2025-02-01  2:08     ` Jeff King
2025-02-20 22:52       ` Peijian Ju
2025-01-14  2:15   ` [PATCH v10 8/8] cat-file: add remote-object-info to batch-command Eric Ju
2025-02-01  2:03     ` Jeff King
2025-02-21 15:34       ` Peijian Ju
2025-02-24 23:45         ` Jeff King
2025-03-12 19:53           ` Peijian Ju
2025-02-21 19:04 ` [PATCH v11 0/8] " Eric Ju
2025-02-21 19:04   ` [PATCH v11 1/8] git-compat-util: add strtoul_ul() with error handling Eric Ju
2025-02-21 19:04   ` [PATCH v11 2/8] cat-file: add declaration of variable i inside its for loop Eric Ju
2025-02-21 19:04   ` [PATCH v11 3/8] t1006: split test utility functions into new "lib-cat-file.sh" Eric Ju
2025-02-21 19:04   ` [PATCH v11 4/8] fetch-pack: refactor packet writing Eric Ju
2025-02-21 19:04   ` [PATCH v11 5/8] fetch-pack: move fetch initialization Eric Ju
2025-02-21 19:04   ` [PATCH v11 6/8] serve: advertise object-info feature Eric Ju
2025-02-21 19:04   ` [PATCH v11 7/8] transport: add client support for object-info Eric Ju
2025-02-21 19:04   ` [PATCH v11 8/8] cat-file: add remote-object-info to batch-command Eric Ju
2025-02-24 20:46     ` Junio C Hamano
2025-03-11 23:10       ` Peijian Ju
2025-02-24 23:47     ` Jeff King
2025-03-12  2:19       ` Peijian Ju
2025-03-13  6:02         ` Jeff King
2025-03-21 18:24           ` Peijian Ju
2025-03-24  3:39             ` Jeff King

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=Z0RIrKwUnaWWm_gJ@pks.im \
    --to=ps@pks.im \
    --cc=calvinwan@google.com \
    --cc=chriscool@tuxfamily.org \
    --cc=eric.peijian@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=jltobler@gmail.com \
    --cc=jonathantanmy@google.com \
    --cc=karthik.188@gmail.com \
    --cc=toon@iotcl.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).