Jun's tweaked proposal sounds good to me. In terms of completing KIP-43,
this changes the format of the request-response for exchanging mechanisms,
but not the overall logic. Since the request format in KIP-43 is worth
changing anyway, I will update the KIP and the PR.

On Tue, Apr 12, 2016 at 2:13 AM, Jun Rao <j...@confluent.io> wrote:

> Magnus,
>
> That sounds reasonable. To reduce the changes on the server side, I'd
> suggest the following minor tweaks on the proposal.
>
> 1. Continue supporting the separate SASL and SASL_SSL port.
>
> On SASL port, we support the new sequence
>     ApiVersionRequest (optional), SaslHandshakeRequest, SASL tokens,
> regular
> requests
>
> On SASL_SSL port, we support the new sequence
>     SSL handshake bytes, ApiVersionRequest (optional),
> SaslHandshakeRequest,
> SASL tokens, regular requests
>
> 2. We don't wrap SASL tokens in Kafka protocol. Similar to your argument
> about SSL handshake, those SASL tokens are generated by SASL library and
> Kafka doesn't really control its versioning. Kafka only controls the
> selection of SASL mechanism, which will be versioned in
> SaslHandshakeRequest.
>
> Does that work for you?
>
> Thanks,
>
> Jun
>
>
> On Mon, Apr 11, 2016 at 11:15 AM, Magnus Edenhill <mag...@edenhill.se>
> wrote:
>
> > Hey Jun, see inline
> >
> > 2016-04-11 19:19 GMT+02:00 Jun Rao <j...@confluent.io>:
> >
> > > Hi, Magnus,
> > >
> > > Let me understand your proposal in more details just from the client's
> > > perspective. My understanding of your proposal is the following.
> > >
> > > On plaintext port, the client will send the following bytes in order.
> > >     ApiVersionRequest, SaslHandshakeRequest, SASL tokens (if SASL is
> > > enabled), regular requests
> > >
> > > On SSL port, the client will send the following bytes in order.
> > >     SSL handshake bytes, ApiVersionRequest, SaslHandshakeRequest, SASL
> > > tokens (if SASL is enabled), regular requests
> > >
> >
> >
> > Yup!
> > "SASL tokens" is a series of proper Kafka protocol SaslHandshakeRequests
> > until
> > the handshake is done.
> >
> >
> >
> > >
> > > Is that right? Since we can use either SSL or SASL for authentication,
> > it's
> > > weird that in one case, we require ApiVersionRequest to happen before
> > > authentication and in another case we require the reverse.
> > >
> >
> > Since the SSL/TLS is standardised and taken care of for us by the SSL
> > libraries it
> > doesnt make sense to reimplement that on top of Kafka, so it isn't really
> > comparable.
> > But for SASL there is no standardised handshake protocol so we must
> either
> > conceive one from scratch, or use the protocol that we already have
> > (Kafka).
> > For the initial SASL implementation in 0.9 the first option was chosen
> and
> > while
> > it required a new protocol implementation in supporting clients and the
> > broker
> > it served its purpose. But not for long,  it already needs to evolve,
> > and this gives us a golden[1] opportunity to make the implementation
> > reusable, evolvable, less complex
> > and in line with all our other protocol work, by using the  protocol
> stack
> > of Kafka which the
> > broker and all clients already have in place.
> >
> > Not taking this chance and instead diverging the custom SASL handshake
> > protocol
> > even further from Kafka seems to me a weird choice.
> >
> > The current KIP-43 proposal does not have a clear compatibility story; it
> > doesnt seem to be possible
> > to upgrade clients before brokers, while this might be okay for the Java
> > client, the KIP-35 discussion
> > has hopefully proven that this assumption can't be made for the entire
> > eco-system.
> >
> > Let me be clear that there isn't anything technically wrong with the
> KIP-43
> > proposal (well,
> > except for the hack to check byte[0] for 0x60 perhaps), but I'm worried
> the
> > proposal will eventually lead to
> > reimplementing Api Versioning, KIP-35, etc, in the custom SASL handshake,
> > and this is just redundant,
> > there is no technical reason for doing so and it'll just make protocol
> > semantics and implementations more complex.
> >
> >
> > Regards,
> > Magnus
> >
> > [1]: Timing is good for this change since only two clients, Java and C,
> > currently supports
> > the existing SASL handshake so far.
> >
> >
> > >
> > > Thanks,
> > >
> > > Jun
> > >
> > > On Mon, Apr 11, 2016 at 12:20 AM, Magnus Edenhill <mag...@edenhill.se>
> > > wrote:
> > >
> > > > 2016-04-11 3:01 GMT+02:00 Jun Rao <j...@confluent.io>:
> > > >
> > > > > Thinking about ApiVersionRequest a bit more. There are quite a few
> > > things
> > > > > special about it. In the ideal case, (1) its version should never
> > > change;
> > > > >
> > > >
> > > > The only thing we know of the future is that we dont know anything,
> we
> > > > can't
> > > > think of every possible future use case, that's why need to be able
> to
> > > > evolve interfaces
> > > > as requirements and use-cases change. This is the gist of KIP-35, and
> > > > hampering
> > > > KIP-35 itself, by not letting it also evolve, does not seem right to
> me
> > > at
> > > > all.
> > > >
> > > >
> > > >
> > > >
> > > > > (2) it needs to be done before authentication (either SSL/SASL);
> (3)
> > it
> > > > is
> > > > > required to be issued at the beginning of each connection but never
> > > needs
> > > > > to be issued again on the same connection. So, instead of modeling
> it
> > > as
> > > > a
> > > > > regular request, it seems a cleaner approach is to just bake that
> > into
> > > > the
> > > > > initial connection handshake even before the authentication layer.
> So
> > > the
> > > > > sequencing in a connection will be api discovery, authentication,
> > > > followed
> > > > > by regular requests. I am not sure we can still add this in a
> > backward
> > > > > compatible way now (e.g., not sure what the initial bytes from an
> SSL
> > > > > connection will look like). Even if we can do this in a backward
> > > > compatible
> > > > > way, it's probably non-trivial amount of work though.
> > > > >
> > > >
> > > > I have the luxory of not knowing the broker internals, so I can only
> > > > discuss
> > > > this on a conceptual design level.
> > > >
> > > > In its simplest form each API request type has a NeedsAuth flag and
> the
> > > > broker protocol request layer simply checks if the current session is
> > > > Authenticated
> > > > before processing the request: If not the session is closed and an
> > error
> > > is
> > > > logged.
> > > > The only two API requests that dont have the NeedsAuth flag would be
> > > > SaslHandshakeRequest
> > > > and ApiVersionRequest, the latter could also use filtering to only
> > return
> > > > the same two
> > > > requests in ApiVersionResponse before the client is authenticated (as
> > not
> > > > to "leak" information).
> > > > If authentication is not configured on the broker all sessions are
> > deemed
> > > > authenticated by default.
> > > >
> > > >
> > > > Re backwards compatibility:
> > > > My suggestion is to keep the current special SASL handshake protocol
> on
> > > the
> > > > SASL_PLAIN/SASL_SSL
> > > > endpoints, but use the new in-band Kafka SaslHandshakeRequest API on
> > the
> > > > PLAIN/SSL endpoints.
> > > > This way the broker is backwards compatible with older clients that
> > only
> > > > supports the special SASL protocol,
> > > > and newer cliets are also backwards compatible with older brokers
> that
> > > only
> > > > supports the special SASL protocol.
> > > > Newer clients connecting to new brokers will be configured to use
> > > non-SASL
> > > > ports and use the
> > > > in-band Kafka SaslHandshakeRequest to authenticate.
> > > >
> > > > Using the existing standard Kafka protocol and the new future-proof
> > > > functionality of ApiVersionRequest
> > > > allows the in-band authentication mechanisms and semantics to
> naturally
> > > > evolve over time
> > > > without breaking existing clients.
> > > >
> > > >
> > > >
> > > >
> > > >
> > > > >
> > > > > We started KIP-35 with supporting a client to know if a version is
> > > > > supported by the broker. It's now evolved into supporting a client
> to
> > > > > implement multiple versions of the protocol and dynamically pick a
> > > > version
> > > > > supported by the broker. The former is likely solvable without
> > > > > ApiVersionRequest. How important is the latter? What if the C
> client
> > > just
> > > > > follows the java client model by implementing one version of
> protocol
> > > > per C
> > > > > client release (which seems easier to implement)?
> > > > >
> > > >
> > > > We've discussed this at length and it is not an option for
> librdkafka,
> > > nor
> > > > kafka-python, and
> > > > probably other clients as well, due to usability/UX and maintenance
> > > > reasons.
> > > > (There's even discussion of making the Java client more version
> > > agnostic!)
> > > >
> > > >
> > > >
> > > >
> > > >
> > > > >
> > > > > Thanks,
> > > > >
> > > > > Jun
> > > > >
> > > > >
> > > > > On Fri, Apr 8, 2016 at 4:20 PM, Jun Rao <j...@confluent.io> wrote:
> > > > >
> > > > > > Magnus,
> > > > > >
> > > > > > A while back, we had another proposal for the broker to just send
> > the
> > > > > > correlation id and an empty payload if it receives an unsupported
> > > > version
> > > > > > of the request. I didn't see that in the rejected section. It
> seems
> > > > > simpler
> > > > > > than the current proposal where the client has to issue an
> > > > > > ApiVersionRequest on every connection. Could you document the
> > reason
> > > > why
> > > > > we
> > > > > > rejected it?
> > > > > >
> > > > > > Thanks,
> > > > > >
> > > > > > Jun
> > > > > >
> > > > > > On Tue, Apr 5, 2016 at 1:47 PM, Ashish Singh <
> asi...@cloudera.com>
> > > > > wrote:
> > > > > >
> > > > > >> On Fri, Apr 1, 2016 at 1:32 AM, Ismael Juma <ism...@juma.me.uk>
> > > > wrote:
> > > > > >>
> > > > > >> > Two more things:
> > > > > >> >
> > > > > >> > 3. We talk about backporting of new request versions to stable
> > > > > branches
> > > > > >> in
> > > > > >> > the KIP. In practice, we can't do that until the Java client
> is
> > > > > changed
> > > > > >> so
> > > > > >> > that it doesn't blindly use the latest protocol version.
> > > Otherwise,
> > > > if
> > > > > >> new
> > > > > >> > request versions were added to 0.9.0.2, the client would break
> > > when
> > > > > >> talking
> > > > > >> > to a 0.9.0.1 broker (given Jason's proposal, it would fail a
> bit
> > > > more
> > > > > >> > gracefully, but that's still not good enough for a stable
> > branch).
> > > > It
> > > > > >> may
> > > > > >> > be worth making this clear in the KIP (yes, it is a bit
> > orthogonal
> > > > and
> > > > > >> > doesn't prevent the KIP from being adopted, but good to avoid
> > > > > >> confusion).
> > > > > >> >
> > > > > >> Good point. Adding this note and also adding a note that Kafka
> has
> > > not
> > > > > >> backported an api version so far.
> > > > > >>
> > > > > >> >
> > > > > >> > 4. The paragraph below is a bit confusing. It starts talking
> > about
> > > > > 0.9.0
> > > > > >> > and trunk and then switches to 0.9.1. Is that intentional?
> > > > > >> >
> > > > > >> Yes.
> > > > > >>
> > > > > >> >
> > > > > >> > "Deprecation of a protocol version will be done by marking a
> > > > protocol
> > > > > >> > version as deprecated in protocol documentation. Documentation
> > > shall
> > > > > >> also
> > > > > >> > be used to indicate a protocol version that must not be used,
> or
> > > for
> > > > > any
> > > > > >> > such information.For instance, say 0.9.0 had protocol versions
> > [0]
> > > > for
> > > > > >> api
> > > > > >> > key 1. On trunk, version 1 of the api key was added. Users
> > running
> > > > off
> > > > > >> > trunk started using version 1 of the api and found out a major
> > > bug.
> > > > To
> > > > > >> > rectify that version 2 of the api is added to trunk. For some
> > > > reason,
> > > > > >> it is
> > > > > >> > now deemed important to have version 2 of the api in 0.9.1 as
> > > well.
> > > > To
> > > > > >> do
> > > > > >> > so, version 1 and version 2 both of the api will be backported
> > to
> > > > the
> > > > > >> 0.9.1
> > > > > >> > branch. 0.9.1 broker will return 0 as min supported version
> for
> > > the
> > > > > api
> > > > > >> and
> > > > > >> > 2 for the max supported version for the api. However, the
> > version
> > > 1
> > > > > >> should
> > > > > >> > be clearly marked as deprecated on its documentation. It will
> be
> > > > > >> client's
> > > > > >> > responsibility to make sure they are not using any such
> > deprecated
> > > > > >> version
> > > > > >> > to the best knowledge of the client at the time of development
> > (or
> > > > > >> > alternatively by configuration)."
> > > > > >> >
> > > > > >> > Ismael
> > > > > >> >
> > > > > >> >
> > > > > >> >
> > > > > >> > On Fri, Apr 1, 2016 at 9:22 AM, Ismael Juma <
> ism...@juma.me.uk>
> > > > > wrote:
> > > > > >> >
> > > > > >> > > A couple of questions:
> > > > > >> > >
> > > > > >> > > 1. The KIP says "Specific version may be deprecated through
> > > > protocol
> > > > > >> > > documentation but must still be supported (although it is
> fair
> > > to
> > > > > >> return
> > > > > >> > an
> > > > > >> > > error code if the specific API supports it).". It may be
> worth
> > > > > >> expanding
> > > > > >> > > this a little more. For example, what does it mean to
> support
> > > the
> > > > > >> API? I
> > > > > >> > > guess this means that the broker must not disconnect the
> > client
> > > > and
> > > > > >> the
> > > > > >> > > broker must return a valid protocol response. Given that it
> > says
> > > > > that
> > > > > >> it
> > > > > >> > is
> > > > > >> > > "fair" (I would probably replace "fair" with "valid") to
> > return
> > > an
> > > > > >> error
> > > > > >> > > code if the specific API supports it, it sounds like we are
> > > saying
> > > > > >> that
> > > > > >> > we
> > > > > >> > > don't have to maintain the semantic behaviour (i.e. we could
> > > > > _always_
> > > > > >> > > return an error for a deprecated API?). Is this true?
> > > > > >> > >
> > > > > >> > > 2. ApiVersionQueryRequest seems a bit verbose, why not
> > > > > >> ApiVersionRequest?
> > > > > >> > >
> > > > > >> > > Ismael
> > > > > >> > >
> > > > > >> >
> > > > > >>
> > > > > >>
> > > > > >>
> > > > > >> --
> > > > > >>
> > > > > >> Regards,
> > > > > >> Ashish
> > > > > >>
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> >
>



-- 
Regards,

Rajini

Reply via email to