git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v9 10/14] pkt-line: add functions to read/write flush terminated packet streams

From
Junio C Hamano <gitster@pobox.com>
Date
Oct 4, 2016, 19:53 UTC
Message-ID
<xmqq8tu3ubzl.fsf@gitster.mtv.corp.google.com>
In-Reply-To
<20161004125947.67104-11-larsxschneider@gmail.com>
larsxschneider@gmail.com writes:
Show 43 quoted lines
> From: Lars Schneider <larsxschneider@gmail.com>
>
> write_packetized_from_fd() and write_packetized_from_buf() write a
> stream of packets. All content packets use the maximal packet size
> except for the last one. After the last content packet a `flush` control
> packet is written.
>
> read_packetized_to_strbuf() reads arbitrary sized packets until it
> detects a `flush` packet.
>
> Signed-off-by: Lars Schneider <larsxschneider@gmail.com>
> Signed-off-by: Junio C Hamano <gitster@pobox.com>
> ---
>  pkt-line.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  pkt-line.h |  8 ++++++++
>  2 files changed, 77 insertions(+)
>
> diff --git a/pkt-line.c b/pkt-line.c
> index 3fd4dc0..8ffde22 100644
> --- a/pkt-line.c
> +++ b/pkt-line.c
> @@ -196,6 +196,47 @@ void packet_buf_write(struct strbuf *buf, const char *fmt, ...)
>  	va_end(args);
>  }
>  
> +int write_packetized_from_fd(int fd_in, int fd_out)
> +{
> +	static char buf[LARGE_PACKET_DATA_MAX];
> +	int err = 0;
> +	ssize_t bytes_to_write;
> +
> +	while (!err) {
> +		bytes_to_write = xread(fd_in, buf, sizeof(buf));
> +		if (bytes_to_write < 0)
> +			return COPY_READ_ERROR;
> +		if (bytes_to_write == 0)
> +			break;
> +		err = packet_write_gently(fd_out, buf, bytes_to_write);
> +	}
> +	if (!err)
> +		err = packet_flush_gently(fd_out);
> +	return err;
> +}
OK.
Show 21 quoted lines
> +int write_packetized_from_buf(const char *src_in, size_t len, int fd_out)
> +{
> +	static char buf[LARGE_PACKET_DATA_MAX];
> +	int err = 0;
> +	size_t bytes_written = 0;
> +	size_t bytes_to_write;
> +
> +	while (!err) {
> +		if ((len - bytes_written) > sizeof(buf))
> +			bytes_to_write = sizeof(buf);
> +		else
> +			bytes_to_write = len - bytes_written;
> +		if (bytes_to_write == 0)
> +			break;
> +		err = packet_write_gently(fd_out, src_in + bytes_written, bytes_to_write);
> +		bytes_written += bytes_to_write;
> +	}
> +	if (!err)
> +		err = packet_flush_gently(fd_out);
> +	return err;
> +}

Hmph, what is buf[] used for, other than its sizeof() taken to yield a constant LARGE_PACKET_DATA_MAX?

Show 16 quoted lines
> @@ -305,3 +346,31 @@ char *packet_read_line_buf(char **src, size_t *src_len, int *dst_len)
>  {
>  	return packet_read_line_generic(-1, src, src_len, dst_len);
>  }
> +
> +ssize_t read_packetized_to_strbuf(int fd_in, struct strbuf *sb_out)
> +{
> +	int packet_len;
> +
> +	size_t orig_len = sb_out->len;
> +	size_t orig_alloc = sb_out->alloc;
> +
> +	for (;;) {
> +		strbuf_grow(sb_out, LARGE_PACKET_DATA_MAX);
> +		packet_len = packet_read(fd_in, NULL, NULL,
> +			// TODO: explain + 1
No // C99 comment please.
And I agree that the +1 needs to be explained.
> +			sb_out->buf + sb_out->len, LARGE_PACKET_DATA_MAX+1,
> +			PACKET_READ_GENTLE_ON_EOF);
> +		if (packet_len <= 0)
> +			break;

Hmph. So at the end of a data stream, we ask packet_read() to read 64kB or so, packet_read() gets the packet length by calling get_packet_data() and then another get_packet_data() reads that much and return. What happens during the next round? The first call to get_packet_data() in packet_read() will find that the stream has ended and returns -1, which is stored in packet_len here? But then the data is discarded after the loop when packet_len is negative.

I must be missing something. Is the other side always supposed to give a flush packet or something? Perhaps that is what is happening here. If so, I am OK with that, even though it somehow sounds a bit wasteful.

Previous: larsxschneider@gmail.comNext: Junio C Hamano
Message 11 of 28 in “Git filter protocol”
  1. 00/14 Git filter protocollarsxschneider@gmail.com, Oct 4, 2016
  2. 02/14 convert: modernize testslarsxschneider@gmail.com, Oct 4, 2016
  3. 06/14 pkt-line: extract set_packet_header()larsxschneider@gmail.com, Oct 4, 2016
  4. 07/14 pkt-line: add packet_write_fmt_gently()larsxschneider@gmail.com, Oct 4, 2016
  5. 09/14 pkt-line: add packet_write_gently()larsxschneider@gmail.com, Oct 4, 2016
  6. Junio C HamanoOct 4, 2016
  7. Lars SchneiderOct 5, 2016
  8. Junio C HamanoOct 6, 2016
  9. 11/14 convert: make apply_filter() adhere to standard Git error handlinglarsxschneider@gmail.com, Oct 4, 2016
  10. 10/14 pkt-line: add functions to read/write flush terminated packet streamslarsxschneider@gmail.com, Oct 4, 2016
  11. Junio C HamanoOct 4, 2016
  12. Junio C HamanoOct 4, 2016
  13. Lars SchneiderOct 5, 2016
  14. 12/14 convert: prepare filter.<driver>.process optionlarsxschneider@gmail.com, Oct 4, 2016
  15. 13/14 convert: add filter.<driver>.process optionlarsxschneider@gmail.com, Oct 4, 2016
  16. 01/14 convert: quote filter names in error messageslarsxschneider@gmail.com, Oct 4, 2016
  17. 08/14 pkt-line: add packet_flush_gently()larsxschneider@gmail.com, Oct 4, 2016
  18. 14/14 contrib/long-running-filter: add long running filter examplelarsxschneider@gmail.com, Oct 4, 2016
  19. 04/14 run-command: add wait_on_exitlarsxschneider@gmail.com, Oct 4, 2016
  20. Junio C HamanoOct 4, 2016
  21. Lars SchneiderOct 5, 2016
  22. Junio C HamanoOct 5, 2016
  23. Johannes SchindelinOct 6, 2016
  24. Lars SchneiderOct 6, 2016
  25. Junio C HamanoOct 6, 2016
  26. 03/14 run-command: move check_pipe() from write_or_die to run_commandlarsxschneider@gmail.com, Oct 4, 2016
  27. 05/14 pkt-line: rename packet_write() to packet_write_fmt()larsxschneider@gmail.com, Oct 4, 2016
  28. Jakub NarębskiOct 5, 2016

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.