All of lore.kernel.org
 help / color / mirror / Atom feed
From: Brandon Williams <bmwill@google.com>
To: Junio C Hamano <gitster@pobox.com>
Cc: Jonathan Tan <jonathantanmy@google.com>,
	git@vger.kernel.org, jrnieder@gmail.com, peff@peff.net
Subject: Re: [PATCH v3] connect: in ref advertisement, shallows are last
Date: Fri, 22 Sep 2017 09:45:04 -0700	[thread overview]
Message-ID: <20170922164504.GD77641@google.com> (raw)
In-Reply-To: <xmqq7ewrmrzo.fsf@gitster.mtv.corp.google.com>

On 09/22, Junio C Hamano wrote:
> Junio C Hamano <gitster@pobox.com> writes:
> 
> > Jonathan Tan <jonathantanmy@google.com> writes:
> >
> >> Currently, get_remote_heads() parses the ref advertisement in one loop,
> >> allowing refs and shallow lines to intersperse, despite this not being
> >> allowed by the specification. Refactor get_remote_heads() to use two
> >> loops instead, enforcing that refs come first, and then shallows.
> >>
> >> This also makes it easier to teach get_remote_heads() to interpret other
> >> lines in the ref advertisement, which will be done in a subsequent
> >> patch.
> >
> > Sounds sensible.  This still replaces the earlier 1.5?
> 
> Well, it does, but it also invalidates how the new "pick the version
> offered and used" feature is integrated to this callchain.  I guess
> we'd need a new "we are now expecting the version info" state in a
> patch to replace "connect: teach client to recognize v1 server
> response".

Yeah given we go with this patch, which is probably a better cleanup
than what I attempted, then I would need to change how a client
recognizes a v1 server.  That would probably be easily done by adding a
new state.

I do think that once a v2 protocol rolls around we'll probably have to
do even more refactoring because I don't think we'll want to keep all
the version checking logic in get_remote_heads() for different protocol
versions which may not be interested in a servers ref advertisement, but
that'll be for another time.

> 
> >> +static int process_ref(int *state, int len, struct ref ***list,
> >> +		       unsigned int flags, struct oid_array *extra_have)
> >> +{
> >> +	struct object_id old_oid;
> >> +	char *name;
> >> +	int name_len;
> >> +
> >> +	if (len < GIT_SHA1_HEXSZ + 2 ||
> >> +	    get_oid_hex(packet_buffer, &old_oid) ||
> >> +	    packet_buffer[GIT_SHA1_HEXSZ] != ' ') {
> >> +		*state = EXPECTING_SHALLOW;
> >> +		return 0;
> >> +	}
> >> +
> >> +	name = packet_buffer + GIT_SHA1_HEXSZ + 1;
> >> +	name_len = strlen(name);
> >> +	if (*state == EXPECTING_REF_WITH_CAPABILITIES &&
> >> +	    len != name_len + GIT_SHA1_HEXSZ + 1) {
> >> +		free(server_capabilities);
> 
> Is this free() still needed?  After hitting this block, you'd set
> *state to EXPECTING_REF before you return, so nobody would set
> server_capabilities by hitting this block twice, and an attempt to
> do so will hit the die("unexpected cap") below, no?
> 
> Or it may be a signal that this patch tightens it too much and
> breaks older or third-party implementations of the other side that
> can emit more than one refs with capability advertisement?
> 
> >> +		server_capabilities = xstrdup(name + name_len + 1);
> >> +	} else if (*state == EXPECTING_REF) {
> >> +		if (len != name_len + GIT_SHA1_HEXSZ + 1)
> >> +			die("unexpected capabilities after ref name");
> >> +	}
> >> +	...
> >> +	}
> >> +	*state = EXPECTING_REF;
> >> +	return 1;
> >> +}
> 
> >> @@ -123,76 +208,26 @@ struct ref **get_remote_heads(int in, char *src_buf, size_t src_len,
> >>  	 * willing to talk to us.  A hang-up before seeing any
> >>  	 * response does not necessarily mean an ACL problem, though.
> >>  	 */
> >> -	int saw_response;
> >> -	int got_dummy_ref_with_capabilities_declaration = 0;
> >> +	int responded = 0;
> >> +	int len;
> >> +	int state = EXPECTING_REF_WITH_CAPABILITIES;
> >>  
> >>  	*list = NULL;
> 
> >> +	while ((len = read_remote_ref(in, &src_buf, &src_len, &responded))) {
> >> +		switch (state) {
> >> +		case EXPECTING_REF_WITH_CAPABILITIES:
> >> +		case EXPECTING_REF:
> >> +			if (process_ref(&state, len, &list, flags, extra_have))
> >> +				break;
> >> +			/* fallthrough */
> 
> OK.  This fallthrough is because expecting-ref is really expecting
> ref or shallow and once we see a shallow, we no longer expect ref
> and expect only shallow.  So from that point of view, an assignment
> to set state to EXPECTING_SHALLOW could happen here, not inside
> process_ref.  I mention this because in general, passing state
> around and let it be updated in helper functions would make the
> state transition harder to follow, not easier, even though
> refactoring the processing needed in different stages into helper
> functions like this patch does ought to make it easier to see by
> shrinking the outer loop (i.e. this one) that controls the whole
> process.
> 
> I think if we split process_ref() further into two, then we no
> longer need to pass &state to that function?  We start this loop
> with "expecting the dummy ref (or other)" state, have a new
> process_dummy_ref() function check if we got "capabilities^{}" thing
> and do its thing if that is the case (otherwise we fall through to
> the call to process_ref(), just like the above code falls through to
> call process_shallow() when it realizes what it got is not a ref),
> and after the first call to process_dummy_ref() we'd be in the
> "expecting ref (or other)" state---and the state transition can
> happen in this caller, not in process_dummy_ref() or process_ref().
> 
> Inside process_dummy_ref() and process_ref(), there would be a call
> to the same helper that notices and extracts the server capability
> and stores it (or barfs against the second line that advertises the
> capability, by noticing that server_capabilities is not NULL).
> 
> Wouldn't that make the presentation of the state machine cleaner?

I mentioned this when looking at v2 of this patch, that it would
probably be cleaner to remove passing the state variable around the
place and updating it inside a helper function.  It would just make the
logic simpler to follow if 'state' is updated directly instead of
indirectly.

-- 
Brandon Williams

  reply	other threads:[~2017-09-22 16:45 UTC|newest]

Thread overview: 161+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-09-13 21:54 [PATCH 0/8] protocol transition Brandon Williams
2017-09-13 21:54 ` [PATCH 1/8] pkt-line: add packet_write function Brandon Williams
2017-09-13 21:54 ` [PATCH 2/8] protocol: introduce protocol extention mechanisms Brandon Williams
2017-09-13 22:27   ` Stefan Beller
2017-09-18 17:02     ` Brandon Williams
2017-09-18 18:34       ` Stefan Beller
2017-09-18 19:58         ` Brandon Williams
2017-09-18 20:06           ` Stefan Beller
2017-09-13 21:54 ` [PATCH 3/8] daemon: recognize hidden request arguments Brandon Williams
2017-09-13 22:31   ` Stefan Beller
2017-09-18 16:56     ` Brandon Williams
2017-09-21  0:24   ` Jonathan Tan
2017-09-21  0:31     ` Jonathan Tan
2017-09-21 21:55       ` Brandon Williams
2017-09-13 21:54 ` [PATCH 4/8] upload-pack, receive-pack: introduce protocol version 1 Brandon Williams
2017-09-13 21:54 ` [PATCH 5/8] connect: teach client to recognize v1 server response Brandon Williams
2017-09-13 21:54 ` [PATCH 6/8] connect: tell server that the client understands v1 Brandon Williams
2017-09-13 21:54 ` [PATCH 7/8] http: " Brandon Williams
2017-09-13 21:54 ` [PATCH 8/8] i5700: add interop test for protocol transition Brandon Williams
2017-09-20 18:48 ` [PATCH 1.5/8] connect: die when a capability line comes after a ref Brandon Williams
2017-09-20 19:14   ` Jeff King
2017-09-20 20:06     ` Brandon Williams
2017-09-20 20:48       ` Jonathan Nieder
2017-09-21  3:02       ` Junio C Hamano
2017-09-21 20:45       ` [PATCH] connect: in ref advertisement, shallows are last Jonathan Tan
2017-09-21 23:45         ` [PATCH v2] " Jonathan Tan
2017-09-22  0:00           ` Brandon Williams
2017-09-22  0:08             ` [PATCH v3] " Jonathan Tan
2017-09-22  1:06               ` Junio C Hamano
2017-09-22  1:39                 ` Junio C Hamano
2017-09-22 16:45                   ` Brandon Williams [this message]
2017-09-22 20:15                     ` [PATCH v4] " Jonathan Tan
2017-09-22 21:01                       ` Brandon Williams
2017-09-22 22:16                         ` Jonathan Tan
2017-09-24  0:52                       ` Junio C Hamano
2017-09-26 18:21         ` [PATCH v5] " Jonathan Tan
2017-09-26 18:31           ` Brandon Williams
2017-09-26 23:56 ` [PATCH v2 0/9] protocol transition Brandon Williams
2017-09-26 23:56   ` [PATCH v2 1/9] connect: in ref advertisement, shallows are last Brandon Williams
2017-09-26 23:56   ` [PATCH v2 2/9] pkt-line: add packet_write function Brandon Williams
2017-09-26 23:56   ` [PATCH v2 3/9] protocol: introduce protocol extention mechanisms Brandon Williams
2017-09-27  5:17     ` Junio C Hamano
2017-09-27 11:23       ` Junio C Hamano
2017-09-29 21:20         ` Brandon Williams
2017-09-28 21:58       ` Brandon Williams
2017-09-27  6:30     ` Stefan Beller
2017-09-28 21:04       ` Brandon Williams
2017-09-26 23:56   ` [PATCH v2 4/9] daemon: recognize hidden request arguments Brandon Williams
2017-09-27  5:20     ` Junio C Hamano
2017-09-27 21:22       ` Brandon Williams
2017-09-28 16:57         ` Brandon Williams
2017-09-26 23:56   ` [PATCH v2 5/9] upload-pack, receive-pack: introduce protocol version 1 Brandon Williams
2017-09-27  5:23     ` Junio C Hamano
2017-09-27 21:29       ` Brandon Williams
2017-09-26 23:56   ` [PATCH v2 6/9] connect: teach client to recognize v1 server response Brandon Williams
2017-09-27  1:07     ` Junio C Hamano
2017-09-27 17:34       ` Brandon Williams
2017-09-27  5:29     ` Junio C Hamano
2017-09-28 22:08       ` Brandon Williams
2017-09-26 23:56   ` [PATCH v2 7/9] connect: tell server that the client understands v1 Brandon Williams
2017-09-27  6:21     ` Junio C Hamano
2017-09-27  6:29       ` Junio C Hamano
2017-09-29 21:32         ` Brandon Williams
2017-09-28 22:20       ` Brandon Williams
2017-09-26 23:56   ` [PATCH v2 8/9] http: " Brandon Williams
2017-09-27  6:24     ` Junio C Hamano
2017-09-27 21:36       ` Brandon Williams
2017-09-26 23:56   ` [PATCH v2 9/9] i5700: add interop test for protocol transition Brandon Williams
2017-10-03 20:14   ` [PATCH v3 00/10] " Brandon Williams
2017-10-03 20:14     ` [PATCH v3 01/10] connect: in ref advertisement, shallows are last Brandon Williams
2017-10-10 18:14       ` Jonathan Tan
2017-10-03 20:14     ` [PATCH v3 02/10] pkt-line: add packet_write function Brandon Williams
2017-10-10 18:15       ` Jonathan Tan
2017-10-03 20:15     ` [PATCH v3 03/10] protocol: introduce protocol extention mechanisms Brandon Williams
2017-10-06  9:09       ` Simon Ruderich
2017-10-06  9:40         ` Junio C Hamano
2017-10-06 11:11           ` Martin Ågren
2017-10-06 12:09             ` Junio C Hamano
2017-10-06 19:42               ` Martin Ågren
2017-10-06 20:27                 ` Stefan Beller
2017-10-08 14:24                   ` Martin Ågren
2017-10-10 21:00             ` Brandon Williams
2017-10-10 21:17               ` Jonathan Nieder
2017-10-10 21:32                 ` Stefan Beller
2017-10-11  0:39                 ` Junio C Hamano
2017-10-13 22:46                 ` Brandon Williams
2017-10-09  4:05           ` Martin Ågren
2017-10-10 19:51       ` Jonathan Tan
2017-10-03 20:15     ` [PATCH v3 04/10] daemon: recognize hidden request arguments Brandon Williams
2017-10-10 18:24       ` Jonathan Tan
2017-10-13 22:04         ` Brandon Williams
2017-10-03 20:15     ` [PATCH v3 05/10] upload-pack, receive-pack: introduce protocol version 1 Brandon Williams
2017-10-10 18:28       ` Jonathan Tan
2017-10-13 22:18         ` Brandon Williams
2017-10-03 20:15     ` [PATCH v3 06/10] connect: teach client to recognize v1 server response Brandon Williams
2017-10-03 20:15     ` [PATCH v3 07/10] connect: tell server that the client understands v1 Brandon Williams
2017-10-10 18:30       ` Jonathan Tan
2017-10-13 22:56         ` Brandon Williams
2017-10-03 20:15     ` [PATCH v3 08/10] http: " Brandon Williams
2017-10-03 20:15     ` [PATCH v3 09/10] i5700: add interop test for protocol transition Brandon Williams
2017-10-03 20:15     ` [PATCH v3 10/10] ssh: introduce a 'simple' ssh variant Brandon Williams
2017-10-03 21:42       ` Jonathan Nieder
2017-10-16 17:18         ` Brandon Williams
2017-10-23 21:28           ` [PATCH 0/5] Coping with unrecognized ssh wrapper scripts in GIT_SSH Jonathan Nieder
2017-10-23 21:29             ` [PATCH 1/5] connect: split git:// setup into a separate function Jonathan Nieder
2017-10-23 22:16               ` Stefan Beller
2017-10-24  0:09                 ` [WIP PATCH] diff: add option to ignore whitespaces for move detection only Stefan Beller
2017-10-24 18:48                   ` Brandon Williams
2017-10-25  1:25                     ` Junio C Hamano
2017-10-25  1:26                       ` Junio C Hamano
2017-10-25 18:58                         ` Brandon Williams
2017-10-24  1:54                 ` [PATCH 1/5] connect: split git:// setup into a separate function Junio C Hamano
2017-10-24  2:52                   ` Stefan Beller
2017-10-23 21:30             ` [PATCH 2/5] connect: split ssh command line options into " Jonathan Nieder
2017-10-23 21:48               ` Stefan Beller
2017-10-23 21:31             ` [PATCH 3/5] ssh: 'auto' variant to select between 'ssh' and 'simple' Jonathan Nieder
2017-10-23 22:19               ` Jonathan Tan
2017-10-23 22:43                 ` Jonathan Nieder
2017-10-23 22:51                   ` Brandon Williams
2017-10-23 22:57                     ` Jonathan Tan
2017-10-23 23:16                       ` [PATCH v2 0/5] Coping with unrecognized ssh wrapper scripts in GIT_SSH Jonathan Nieder
2017-10-23 23:17                         ` [PATCH 1/5] connect: split git:// setup into a separate function Jonathan Nieder
2017-10-24  1:44                           ` Junio C Hamano
2017-11-15 20:25                             ` Jonathan Nieder
2017-11-17  1:12                               ` Junio C Hamano
2017-10-23 23:17                         ` [PATCH 2/5] connect: split ssh command line options into " Jonathan Nieder
2017-10-24  2:01                           ` Junio C Hamano
2017-10-23 23:18                         ` [PATCH 3/5] ssh: 'auto' variant to select between 'ssh' and 'simple' Jonathan Nieder
2017-10-23 23:27                           ` Brandon Williams
2017-10-23 23:33                             ` Stefan Beller
2017-10-23 23:19                         ` [PATCH 4/5] ssh: 'simple' variant does not support -4/-6 Jonathan Nieder
2017-10-23 23:19                         ` [PATCH 5/5] ssh: 'simple' variant does not support --port Jonathan Nieder
2017-10-24  2:22                         ` [PATCH v2 0/5] Coping with unrecognized ssh wrapper scripts in GIT_SSH Junio C Hamano
2017-10-23 23:12                     ` [PATCH 3/5] ssh: 'auto' variant to select between 'ssh' and 'simple' Jonathan Nieder
2017-10-23 22:33               ` Stefan Beller
2017-10-23 22:54                 ` Jonathan Nieder
2017-10-24  2:16               ` Junio C Hamano
2017-10-25 12:51               ` Johannes Schindelin
2017-10-25 16:18                 ` Stefan Beller
2017-10-25 16:32                   ` Jonathan Nieder
2017-10-30  0:40                     ` Junio C Hamano
2017-10-30 12:37                       ` Johannes Schindelin
2017-10-23 21:32             ` [PATCH 4/5] ssh: 'simple' variant does not support -4/-6 Jonathan Nieder
2017-10-23 21:33             ` [PATCH 5/5] ssh: 'simple' variant does not support --port Jonathan Nieder
2017-10-23 22:37               ` Stefan Beller
2017-10-04  6:20     ` [PATCH v3 00/10] protocol transition Junio C Hamano
2017-10-10 19:39     ` [PATCH] Documentation: document Extra Parameters Jonathan Tan
2017-10-13 22:26       ` Brandon Williams
2017-10-16 17:55     ` [PATCH v4 00/11] protocol transition Brandon Williams
2017-10-16 17:55       ` [PATCH v4 01/11] connect: in ref advertisement, shallows are last Brandon Williams
2017-10-16 17:55       ` [PATCH v4 02/11] pkt-line: add packet_write function Brandon Williams
2017-10-16 17:55       ` [PATCH v4 03/11] protocol: introduce protocol extension mechanisms Brandon Williams
2017-10-16 21:25         ` Kevin Daudt
2017-10-16 17:55       ` [PATCH v4 04/11] daemon: recognize hidden request arguments Brandon Williams
2017-10-16 17:55       ` [PATCH v4 05/11] upload-pack, receive-pack: introduce protocol version 1 Brandon Williams
2017-10-16 17:55       ` [PATCH v4 06/11] connect: teach client to recognize v1 server response Brandon Williams
2017-10-16 17:55       ` [PATCH v4 07/11] connect: tell server that the client understands v1 Brandon Williams
2017-10-16 17:55       ` [PATCH v4 08/11] http: " Brandon Williams
2017-10-16 17:55       ` [PATCH v4 09/11] i5700: add interop test for protocol transition Brandon Williams
2017-10-16 17:55       ` [PATCH v4 10/11] ssh: introduce a 'simple' ssh variant Brandon Williams
2017-10-16 17:55       ` [PATCH v4 11/11] Documentation: document Extra Parameters Brandon Williams

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=20170922164504.GD77641@google.com \
    --to=bmwill@google.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=jonathantanmy@google.com \
    --cc=jrnieder@gmail.com \
    --cc=peff@peff.net \
    /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.