From: Junio C Hamano <gitster@pobox.com>
To: git@vger.kernel.org
Cc: Duy Nguyen <pclouds@gmail.com>, Stefan Beller <sbeller@google.com>
Subject: Re: [PATCH] protocol upload-pack-v2
Date: Tue, 31 Mar 2015 12:58:08 -0700 [thread overview]
Message-ID: <xmqqd23pq6r3.fsf@gitster.dls.corp.google.com> (raw)
In-Reply-To: <xmqqr3szql9r.fsf@gitster.dls.corp.google.com> (Junio C. Hamano's message of "Sun, 08 Mar 2015 13:36:32 -0700")
Junio C Hamano <gitster@pobox.com> writes:
> I have a feeling that it is a bit too premature to specify the
> details at such a low level as "capaiblities are announced by
> prefixing four-byte 'c', 'a', 'p', ':' in front" and "a multi-record
> group has its element count at the beginning (or an end marker at
> the end, for that matter)", and it may be a better idea to outline
> all the necessary elements at a bit higher level first---that would
> avoid needs for useless exchanges like what we are having right now.
>
> .... If you keep the
> discussion at the level like "fetch first asks capabilities it wants
> upload-pack-2 to enable, optionally gives the current shallow
> boundaries when the capaibilty says the other side supports it, and
> then starts showing what it has" while we are trying to achieve
> concensus on what kind of protocol elements we would need, and what
> information each element would carry, the discussion will help us
> reach a shared understanding on what to write down in EBNF form
> exactly faster, I would imagine.
And I see we went silent after this, so let's try to stir the pot
again to see if it simmers.
This is a follow-up on $gmane/264553, which is a continuation of
$gmane/264000, but instead of giving two required readings to
readers, I'll start with reproduction of the two, and add a few more
things the current protocol lacks that I would want to see in the
updated protocol.
The current protocol has the following problems that limit us:
- It is not easy to make it resumable, because we recompute every
time. This is especially problematic for the initial fetch aka
"clone" as we will be talking about a large transfer. Redirection
to a bundle hosted on CDN might be something we could do
transparently.
- The protocol extension has a fairly low length limit.
- Because the protocol exchange starts by the server side
advertising all its refs, even when the fetcher is interested in
a single ref, the initial overhead is nontrivial, especially when
you are doing a small incremental update. The worst case is an
auto-builder that polls every five minutes, even when there is no
new commits to be fetched.
- Because we recompute every time, taking into account of what the
fetcher has, in addition to what the fetcher obtained earlier
from us in order to reduce the transferred bytes, the payload for
incremental updates become tailor-made for each fetch and cannot
be easily reused.
- The semantics of the side-bands are unclear.
- Is band #2 meant only for progress output (I think the current
protocol handlers assume that and unconditionally squelch it
under --quiet)? Do we rather want a dedicated "progress" and
"error message" sidebands instead?
- Is band #2 meant for human consumption, or do we expect the
other end to interpret and act on it? If the former, would it
make sense to send locale information from the client side and
ask the server side to produce its output with _("message")?
- The semantics of packet_flush() is suboptimal, and this
shortcoming seeps through to the protocol mapped to the
smart-HTTP transport.
Originally, packet_flush() was meant as "Here is an end of one
logical section of what I am going to speak.", hinting that it
might be a good idea for the underlying implementation to hold
the packets up to that point in-core and then write(2) them all
out (i.e. "flush") to the file descriptor only when we handle
packet_flush(). It never meant "Now I am finished speaking for
now and it is your turn to speak."
But because HTTP is inherently a ping-pong protocol where the
requestor at one point stops talking and lets the responder
speak, the code to map our protocol to the smart HTTP transport
made the packet_flush() boundary as "Now I am done talking, it is
my turn to listen."
We probably need two kinds of packet_flush(). When a requestor
needs to say two or more logical groups of things before telling
the other side "Now I am done talking; it is your turn.", we need
some marker (i.e. the original meaning of packet_flush()) at the
end of these logical groups. And in order to be able to say "Now
I am done saying everything I need to say at this point for you
to respond to me. It is your turn.", we need another kind of
marker.
- The fetch-pack direction does the common-parent discovery but the
push-pack direction does not. This is OK for the normal
fast-forward push, in which case we will see a known commit on
the tip of the branch we are pushing into, but makes forced push
inefficient.
- The existing common-parent discovery done on the fetch-pack side
enumerates commits contiguously traversing the history to the
past. We might want to go exponential or Fibonacci to quickly
find an ancient common commit and bisect the history from there
(or it might turn out not to be worth it).
- We may want to revamp the builtin/receive-pack.c::report() that
reports the final result of a push back to the pusher to tell the
exact object name that sits at the updated tips of refs, not just
refnames. It will allow the server side to accept a push of
commit X to a branch, do some "magic" on X (e.g. rebase it on top
of the current tip, merge it with the current tip, or let a hook
to rewrite the commit in any way it deems appropriate) and put
the resulting commit Y at the tip of the branch. Without such a
revamp, it is currently not possible to sensibly allow the server
side to rewrite what got pushed.
- If we were to start allowing the receiver side to rewrite pushed
commits, the updated send-pack protocol must be able to send the
new objects created by that "magic" back to the pusher. The
current protocol does not allow the receive-pack to send packdata
back to send-pack.
I'd like to see a new protocol that lets us overcome the above
limitations (did I miss others? I am sure people can help here)
sometime this year.
next prev parent reply other threads:[~2015-03-31 19:58 UTC|newest]
Thread overview: 80+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-02-24 3:12 [RFC/PATCH 0/3] protocol v2 Stefan Beller
2015-02-24 3:12 ` [PATCH 1/3] Document protocol capabilities extension Stefan Beller
2015-02-24 3:12 ` [PATCH 2/3] receive-pack: add advertisement of different protocol options Stefan Beller
2015-02-24 3:12 ` [PATCH 3/3] receive-pack: enable protocol v2 Stefan Beller
2015-02-24 4:02 ` [RFC/PATCH 0/3] " Duy Nguyen
2015-02-24 5:40 ` Stefan Beller
2015-02-24 6:15 ` Junio C Hamano
2015-02-24 23:37 ` Stefan Beller
2015-02-25 12:44 ` Duy Nguyen
2015-02-25 18:04 ` Junio C Hamano
2015-02-26 7:31 ` Stefan Beller
2015-02-26 10:15 ` Duy Nguyen
2015-02-26 20:08 ` Stefan Beller
[not found] ` <CACsJy8DOS_999ZgW7TqsH-dkrUFpjZf0TFQeFUt9s0bNhHY0Bw@mail.gmail.com>
2015-02-27 22:20 ` Stefan Beller
2015-02-26 20:13 ` Junio C Hamano
2015-02-27 1:26 ` Stefan Beller
2015-02-27 2:15 ` Stefan Beller
2015-02-27 23:05 ` Junio C Hamano
2015-02-27 23:44 ` Stefan Beller
2015-02-28 0:33 ` Junio C Hamano
2015-02-28 0:46 ` Stefan Beller
2015-02-28 1:01 ` [RFC/PATCH 0/5] protocol v2 for upload-pack Stefan Beller
2015-02-28 1:01 ` [RFC/PATCH 1/5] upload-pack: only accept capabilities on the first "want" line Stefan Beller
2015-02-28 1:01 ` [RFC/PATCH 2/5] upload-pack: support out of band client capability requests Stefan Beller
2015-02-28 7:47 ` Kyle J. McKay
2015-02-28 11:22 ` Duy Nguyen
2015-02-28 22:36 ` Kyle J. McKay
2015-03-01 0:11 ` Duy Nguyen
2015-02-28 11:36 ` Duy Nguyen
2015-02-28 1:01 ` [RFC/PATCH 3/5] connect.c: connect to a remote service with some flags Stefan Beller
2015-02-28 11:11 ` Torsten Bögershausen
2015-03-01 3:22 ` Junio C Hamano
2015-02-28 1:01 ` [RFC/PATCH 4/5] daemon.c: accept extra service arguments Stefan Beller
2015-03-01 3:39 ` Junio C Hamano
2015-02-28 1:01 ` [RFC/PATCH 5/5] WIP/Document the http protocol change Stefan Beller
2015-02-28 12:26 ` Duy Nguyen
2015-03-01 9:11 ` [RFC/PATCH 0/5] protocol v2 for upload-pack Johannes Sixt
2015-03-02 2:58 ` Junio C Hamano
2015-03-02 3:47 ` [RFC/PATCH 0/3] protocol v2 Junio C Hamano
2015-03-02 9:21 ` Duy Nguyen
2015-03-02 9:24 ` Duy Nguyen
2015-03-03 10:33 ` Duy Nguyen
2015-03-03 17:13 ` Junio C Hamano
2015-03-03 19:47 ` Junio C Hamano
2015-03-04 1:54 ` Duy Nguyen
2015-03-04 4:27 ` Shawn Pearce
2015-03-04 12:05 ` Duy Nguyen
2015-03-04 19:10 ` Shawn Pearce
2015-03-05 1:03 ` Stefan Beller
2015-03-05 16:03 ` Stefan Beller
2015-03-24 17:42 ` Stefan Beller
2015-03-24 18:00 ` Junio C Hamano
2015-03-06 23:38 ` [PATCH] protocol upload-pack-v2 Stefan Beller
2015-03-06 23:40 ` Stefan Beller
2015-03-06 23:55 ` Duy Nguyen
2015-03-07 0:00 ` Duy Nguyen
2015-03-07 0:28 ` Junio C Hamano
2015-03-07 4:28 ` Stefan Beller
2015-03-07 5:21 ` Duy Nguyen
2015-03-08 20:36 ` Junio C Hamano
2015-03-31 19:58 ` Junio C Hamano [this message]
2015-04-02 12:37 ` Duy Nguyen
2015-04-02 14:45 ` Junio C Hamano
2015-04-02 22:18 ` Martin Fick
2015-04-02 22:58 ` Junio C Hamano
2015-04-02 23:00 ` Stefan Beller
2015-04-02 23:14 ` Stefan Beller
2015-03-10 1:38 ` Duy Nguyen
2015-03-10 19:36 ` Kyle J. McKay
2015-02-28 0:07 ` [RFC/PATCH 0/3] protocol v2 Duy Nguyen
2015-02-28 0:26 ` Junio C Hamano
2015-03-01 8:41 ` Junio C Hamano
2015-03-01 11:32 ` Duy Nguyen
2015-03-01 19:56 ` Stefan Beller
2015-03-02 1:05 ` David Lang
2015-03-01 23:06 ` Junio C Hamano
2015-03-02 1:09 ` David Lang
2015-03-02 3:10 ` Junio C Hamano
2015-03-01 23:06 ` Philip Oakley
2015-03-02 9:32 ` Duy Nguyen
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=xmqqd23pq6r3.fsf@gitster.dls.corp.google.com \
--to=gitster@pobox.com \
--cc=git@vger.kernel.org \
--cc=pclouds@gmail.com \
--cc=sbeller@google.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 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.