>
>
> Anyway, I'm not particularly strong in favor of either approach, but I
> think what's concerning Gwen (and myself) is that we're going down to the
> wire with a significant decision and the KIP itself seems different every
> time we look at it. And still a little incomplete. It would be nice, for
> example, if the rejected alternatives explained why each alternative was
> rejected. It would also be nice to discuss the way the current client
> versioning works and why it is inadequate for third-party clients.
>

+1


>
> Thanks,
> Jason
>
> On Thu, Mar 17, 2016 at 12:28 PM, Magnus Edenhill <mag...@edenhill.se>
> wrote:
>
> > I dont really see how first checking if the broker supports a certain set
> > of API versions
> > is so much more complex than calling the same set of API versions during
> > operation?
> > The only difference is that without the check we might only make it
> halfway
> > through,
> > i.e., being able to join a group, consume messages, but then fail to
> commit
> > them
> >
> > Another concrete example is support for KIP-31 and KIP-32:
> > How will a client with support for 0.8.0-0.10.0 know when to use the new
> > Message format?
> > If a client uses the old Message format (v0) the broker will need to
> > convert message formats
> > in the slow path which will increase the broker CPU usage and decrease
> its
> > performance.
> > Sure, clients can expose a configuration property to let the user enable
> > this but most
> > users will miss this (there are a lot of config properties already).
> >
> >
> >
> >
> > 2016-03-17 19:43 GMT+01:00 Gwen Shapira <g...@confluent.io>:
> >
> > > My problem with per-api is that not all combinations are supported. So
> > the
> > > client will need to figure out which "safe" combination to revert to -
> > > which is a lot like global numbers, but less linear...
> > >
> > >
> > > On Thu, Mar 17, 2016 at 11:29 AM, Joel Koshy <jjkosh...@gmail.com>
> > wrote:
> > >
> > > > @Gwen - yes it did come back to per-API versions - I think that
> > happened
> > > > toward the end of the KIP hangout. I already said this, but
> personally
> > > I'm
> > > > also in favor of per-API versions. A global/aggregate API version
> also
> > > > works but that is just a proxy to a vector of per-API versions and at
> > the
> > > > end of the day a client implementation will need to somehow derive
> > *some*
> > > > per-API version vector to talk to the broker. The other challenges
> > (that
> > > > I'm sure can be solved) with the global API version are automatically
> > > > computing it in the first place or if set manually, automatically
> > > verifying
> > > > that it was correctly bumped; then there are the nuances of API
> > evolution
> > > > across multiple branches and thereby the need for some convention to
> > > manage
> > > > trees of aggregate API versions.
> > > >
> > > > Jason and Jay had brought up (earlier in this thread) some practical
> > > > difficulties in using per-API versions by client implementations
> that I
> > > > think is worth quoting verbatim to make sure people are aware of the
> > > > implications:
> > > >
> > > > Maybe you could try to capture feature
> > > > > compatibility by checking the versions for a subset of request
> types?
> > > For
> > > > > example, to ensure that you can use the new consumer API, you check
> > > that
> > > > > the group coordinator request is present, the offset commit request
> > > > version
> > > > > is greater than 2, the offset fetch request is greater than 1, and
> > the
> > > > join
> > > > > group request is present. And to ensure compatibility with KIP-32,
> > > maybe
> > > > > you only need to check the appropriate versions of the fetch and
> > > produce
> > > > > requests. That sounds kind of complicated to keep track of and you
> > > > probably
> > > > > end up trying to handle combinations which aren't even possible in
> > > > > practice.
> > > > >
> > > >
> > > > Unless I'm missing something I don't recollect any other significant
> > > > drawbacks to per-API versions or are there any?
> > > >
> > > > For the above concern I think indicating support for certain features
> > > > ultimately has to be accomplished one way or the other by documenting
> > > what
> > > > per-API request version ranges need to be used. This is obviously
> more
> > > > tedious for more complex client-server interactions such as the new
> > > > consumer's rebalance process; but not so much for other features such
> > as
> > > > KIP-32; or reading throttle time in produce/fetch responses that were
> > > > delayed due to quota violations.
> > > >
> > > > On Thu, Mar 17, 2016 at 1:50 AM, Magnus Edenhill <mag...@edenhill.se
> >
> > > > wrote:
> > > >
> > > > > I'm sorry for the confusion but I was referring to a simplified
> > version
> > > > of
> > > > > the KIP
> > > > > that I'd failed to document on the wiki yet, my bad!
> > > > >
> > > > > The now updated KIP leaves the existing MetadataRequest untouched
> and
> > > > > instead
> > > > > adds a specific API to query the broker for supported APIs:
> > > > > ApiVersionQueryRequest.
> > > > >
> > > > >
> > > > >
> > > >
> > >
> >
> https://cwiki.apache.org/confluence/display/KAFKA/KIP-35+-+Retrieving+protocol+version
> > > > >
> > > > > With all the new protocol additions of the upcoming 0.10.0 release
> it
> > > is
> > > > > imperative
> > > > > to get this support in now, so let's be constructive, pragmatic and
> > > most
> > > > > importantly quick
> > > > > in commenting on this latest proposal so we can start a voting
> thread
> > > > ASAP.
> > > > >
> > > > > Ashish will have the patch ready within a day and librdkafka will
> be
> > > used
> > > > > to verify the functionality,
> > > > > we should have a technical green light before the weekend.
> Additional
> > > > > client devs
> > > > > are very welcome to join in.
> > > > >
> > > > > I'll send a message to kafka-clients to pull in any 3rd party
> client
> > > devs
> > > > > that have missed
> > > > > the recent uprise in discussion.
> > > > >
> > > > >
> > > > > /Magnus
> > > > >
> > > > > 2016-03-17 5:21 GMT+01:00 Ewen Cheslack-Postava <e...@confluent.io
> >:
> > > > >
> > > > > > I'm a fan of separating feature support/versions into a separate
> > > > request
> > > > > > from metadata -- they're different requests and I don't see how
> the
> > > > > current
> > > > > > model of metadata can properly map to the request version info we
> > > need.
> > > > > The
> > > > > > complexity of support differing across brokers seems like
> something
> > > > > clients
> > > > > > need to handle regardless of any solution we come up with here
> > > (current
> > > > > > auto detection approaches are vulnerable to similar issues).
> > > > > >
> > > > > > More importantly -- has this KIP ever made it over to the
> > > kafka-clients
> > > > > > list, or have we reached out to other client library developers?
> My
> > > > brief
> > > > > > scan of the list suggests it hasn't, but maybe I missed
> something.
> > > > We've
> > > > > > got Magnus & Dana participating, which is great and accounts for
> > some
> > > > > > really important clients, but have we reached out as broadly as
> we
> > > can
> > > > to
> > > > > > other client developers to get feedback? We're largely operating
> in
> > > an
> > > > > echo
> > > > > > chamber, and some of the current challenges might trace back to
> > that
> > > > mode
> > > > > > of operation -- the Java client, which has the benefit of
> > > development,
> > > > > > testing, and release alongside the broker, doesn't follow the
> same
> > > > > > compatibility and release approach as most other clients.
> > > > > >
> > > > > > I'm happy to help with that outreach and bring feedback back into
> > > this
> > > > > > discussion, but I think this will end up being longer process
> than
> > we
> > > > can
> > > > > > resolve in the next few days...
> > > > > >
> > > > > > -Ewen
> > > > > >
> > > > > >
> > > > > > On Wed, Mar 16, 2016 at 5:22 PM, Gwen Shapira <g...@confluent.io
> >
> > > > wrote:
> > > > > >
> > > > > > > I was a bit surprised to discover that the latest KIP includes
> an
> > > > array
> > > > > > of
> > > > > > > versions per request. Especially since we spent an hour
> > discussing
> > > > > global
> > > > > > > APIs and their tradeoffs.
> > > > > > >
> > > > > > > I'm pointing this out in case anyone else missed that - to make
> > > sure
> > > > we
> > > > > > are
> > > > > > > all on the same page in this discussion.
> > > > > > >
> > > > > > > Gwen
> > > > > > >
> > > > > > > On Tue, Mar 15, 2016 at 10:41 PM, Ashish Singh <
> > > asi...@cloudera.com>
> > > > > > > wrote:
> > > > > > >
> > > > > > > > Sent incomplete message by mistake.
> > > > > > > >
> > > > > > > > I do not have a preference for (1) or (2). (1) basically
> makes
> > us
> > > > > view
> > > > > > > > supported versions for all brokers as a part of cluster wide
> > > state,
> > > > > > > however
> > > > > > > > (2) lets client deal with individual brokers. From usage
> > > > perspective,
> > > > > > > > clients would need to choose a certain feature or not based
> on
> > > > > minimal
> > > > > > > > supported version across all brokers they are talking to. In
> > (1)
> > > > this
> > > > > > > state
> > > > > > > > will be maintained and provided by server, however in (2) the
> > > onus
> > > > > will
> > > > > > > be
> > > > > > > > on client to maintain the state. What do you suggest will be
> > the
> > > > > right
> > > > > > > > thing to do here?
> > > > > > > >
> > > > > > > >
> > > > > > > > On Tue, Mar 15, 2016 at 10:27 PM, Ashish Singh <
> > > > asi...@cloudera.com>
> > > > > > > > wrote:
> > > > > > > >
> > > > > > > > > I do not have a preference for 1 or 2. 1 basically makes us
> > > view
> > > > > > > > supported
> > > > > > > > > versions for all brokers
> > > > > > > > >
> > > > > > > > > On Tuesday, March 15, 2016, Jay Kreps <j...@confluent.io>
> > > wrote:
> > > > > > > > >
> > > > > > > > > > Yeah I think there are two possible approaches:
> > > > > > > > > > 1. You get the versions in the metadata request and cache
> > > them
> > > > > and
> > > > > > > > > > invalidate that cache if you get a version mismatch error
> > > > > > (basically
> > > > > > > > > > as we do with leadership information).
> > > > > > > > > > 2. You check each connection
> > > > > > > > > >
> > > > > > > > > > I think combining metadata request and version check only
> > > makes
> > > > > > sense
> > > > > > > > > > in (1), right? If it is (2) I don't see how you save
> > anything
> > > > and
> > > > > > the
> > > > > > > > > > requests don't really make sense because you're mixing
> > > cluster
> > > > > wide
> > > > > > > > > > state about partitions with info about the answering
> > broker.
> > > > > > > > >
> > > > > > > > >
> > > > > > > > > > -Jay
> > > > > > > > > >
> > > > > > > > > > On Tue, Mar 15, 2016 at 4:25 PM, Magnus Edenhill <
> > > > > > mag...@edenhill.se
> > > > > > > > > > <javascript:;>> wrote:
> > > > > > > > > > > Hey Jay,
> > > > > > > > > > >
> > > > > > > > > > > as discussed earlier it is not safe to cache/relay a
> > > broker's
> > > > > > > version
> > > > > > > > > or
> > > > > > > > > > > its supported API versions,
> > > > > > > > > > > by the time the client connects the broker might have
> > > > upgraded
> > > > > to
> > > > > > > > > another
> > > > > > > > > > > version which effectively
> > > > > > > > > > > makes this information useless in a cached form.
> > > > > > > > > > >
> > > > > > > > > > > The complexity of querying for protocol verion is very
> > > > > > > implementation
> > > > > > > > > > > dependent and
> > > > > > > > > > > hard to generalize on, I dont foresee any bigger
> problems
> > > > > adding
> > > > > > > > > support
> > > > > > > > > > > for an extra protocol version
> > > > > > > > > > > querying state in librdkafka, but other client devs
> > should
> > > > > chime
> > > > > > > in.
> > > > > > > > > > > There are already post-connect,pre-operation states for
> > > > dealing
> > > > > > > with
> > > > > > > > > SSL
> > > > > > > > > > > and SASL.
> > > > > > > > > > >
> > > > > > > > > > > The reason for putting the API versioning stuff in the
> > > > Metadata
> > > > > > > > request
> > > > > > > > > > is
> > > > > > > > > > > that it is already used
> > > > > > > > > > > for bootstrapping a client and/or connection and thus
> > saves
> > > > us
> > > > > a
> > > > > > > > > > round-trip
> > > > > > > > > > > (and possibly a state).
> > > > > > > > > > >
> > > > > > > > > > >
> > > > > > > > > > > For how this will be used; I can't speak for other
> client
> > > > devs
> > > > > > but
> > > > > > > > aim
> > > > > > > > > to
> > > > > > > > > > > make a mapping between
> > > > > > > > > > > the features my client exposes to a set of specific
> APIs
> > > and
> > > > > > their
> > > > > > > > > > minimum
> > > > > > > > > > > version..
> > > > > > > > > > > E.g.: Balanced consumer groups requires JoinGroup >=
> V0,
> > > > > > LeaveGroup
> > > > > > > > >=
> > > > > > > > > > V0,
> > > > > > > > > > > SyncGroup >= V0, and so on.
> > > > > > > > > > > If those requirements can be fullfilled then the
> feature
> > is
> > > > > > > enabled,
> > > > > > > > > > > otherwise an error is returned to the user.
> > > > > > > > > > >
> > > > > > > > > > > /Magnus
> > > > > > > > > > >
> > > > > > > > > > >
> > > > > > > > > > > 2016-03-15 23:35 GMT+01:00 Jay Kreps <j...@confluent.io
> > > > > > > > > <javascript:;>>:
> > > > > > > > > > >
> > > > > > > > > > >> Hey Ashish,
> > > > > > > > > > >>
> > > > > > > > > > >> Can you expand in the proposal on how this would be
> used
> > > by
> > > > > > > clients?
> > > > > > > > > > >> This proposal only has one slot for api versions,
> though
> > > in
> > > > > fact
> > > > > > > > there
> > > > > > > > > > >> is potentially a different version on each broker. I
> > think
> > > > the
> > > > > > > > > > >> proposal is that every single time the client
> > establishes
> > > a
> > > > > > > > connection
> > > > > > > > > > >> it would then need to issue a metadata request on that
> > > > > > connection
> > > > > > > to
> > > > > > > > > > >> check supported versions. Is that correct?
> > > > > > > > > > >>
> > > > > > > > > > >> The point of merging version information with metadata
> > > > request
> > > > > > was
> > > > > > > > > > >> that the client wouldn't have to manage this
> additional
> > > > state
> > > > > > for
> > > > > > > > each
> > > > > > > > > > >> connection, but rather the broker would gather the
> > > > information
> > > > > > and
> > > > > > > > > > >> give a summary of all brokers in the cluster.
> (Managing
> > > the
> > > > > > state
> > > > > > > > > > >> doesn't seem complex but actually since the full state
> > > > machine
> > > > > > > for a
> > > > > > > > > > >> request is something like begin connecting=>connection
> > > > > > > > complete=>begin
> > > > > > > > > > >> sending request=>do work sending=>await response=>do
> > work
> > > > > > reading
> > > > > > > > > > >> response adding to the state machine around this is
> not
> > as
> > > > > > simple
> > > > > > > as
> > > > > > > > > > >> it seems...you can see the code in the java client
> > around
> > > > > this).
> > > > > > > > > > >>
> > > > > > > > > > >> It sounds like in this proposal you are proposing
> > merging
> > > > with
> > > > > > the
> > > > > > > > > > >> metadata request but not summarizing across the
> cluster?
> > > Can
> > > > > you
> > > > > > > > > > >> explain the thinking vs a separate request?
> > > > > > > > > > >>
> > > > > > > > > > >> It would really be good if the KIP can summarize the
> > whole
> > > > > > > > interaction
> > > > > > > > > > >> and how clients will work.
> > > > > > > > > > >>
> > > > > > > > > > >> -Jay
> > > > > > > > > > >>
> > > > > > > > > > >> On Tue, Mar 15, 2016 at 3:24 PM, Ashish Singh <
> > > > > > > asi...@cloudera.com
> > > > > > > > > > <javascript:;>> wrote:
> > > > > > > > > > >> > Magnus and I had a brief discussion following the
> KIP
> > > > call.
> > > > > > > KIP-35
> > > > > > > > > > >> > <
> > > > > > > > > > >>
> > > > > > > > > >
> > > > > > > > >
> > > > > > > >
> > > > > > >
> > > > > >
> > > > >
> > > >
> > >
> >
> https://cwiki.apache.org/confluence/display/KAFKA/KIP-35+-+Retrieving+protocol+version
> > > > > > > > > > >> >
> > > > > > > > > > >> > wiki has been updated accordingly. Please review the
> > KIP
> > > > and
> > > > > > > vote
> > > > > > > > on
> > > > > > > > > > the
> > > > > > > > > > >> > corresponding vote thread.
> > > > > > > > > > >> >
> > > > > > > > > > >> > On Mon, Mar 14, 2016 at 11:27 PM, Ashish Singh <
> > > > > > > > asi...@cloudera.com
> > > > > > > > > > <javascript:;>>
> > > > > > > > > > >> wrote:
> > > > > > > > > > >> >
> > > > > > > > > > >> >> I think there is a bit of misunderstanding going on
> > > here
> > > > > > > > regarding
> > > > > > > > > > >> >> protocol documentation and its versioning. It could
> > be
> > > > > that I
> > > > > > > am
> > > > > > > > > the
> > > > > > > > > > one
> > > > > > > > > > >> >> who misunderstood it, please correct me if so.
> > > > > > > > > > >> >>
> > > > > > > > > > >> >> Taking Gwen's example.
> > > > > > > > > > >> >>
> > > > > > > > > > >> >> 1. 0.10.0 (protocol v4)  is released with current
> > > KIP-35
> > > > > > > > > > >> >> 2. On trunk, modify produce requests and bump to v5
> > > > > > > > > > >> >> 3. On trunk, we modify metadata requests and bump
> to
> > v6
> > > > > > > > > > >> >> 4. Now we decide that the metadata change fixes a
> > super
> > > > > > > critical
> > > > > > > > > > issue
> > > > > > > > > > >> and
> > > > > > > > > > >> >> want to backport the change. What's the protocol
> > > version
> > > > of
> > > > > > the
> > > > > > > > > next
> > > > > > > > > > >> >> release of 0.10.0 - which supports v6 protocol only
> > > > > > partially?
> > > > > > > > > > >> >>
> > > > > > > > > > >> >> As per my understanding, this will be v7. When we
> > say a
> > > > > > broker
> > > > > > > is
> > > > > > > > > on
> > > > > > > > > > >> >> ApiVersion 7, we do not necessarily mean that it
> also
> > > > > > supports
> > > > > > > > > > >> ApiVersion
> > > > > > > > > > >> >> up to v7. A broker on ApiVersion v7 should probably
> > > mean,
> > > > > > > please
> > > > > > > > > > refer
> > > > > > > > > > >> v7
> > > > > > > > > > >> >> of protocol documentation to find out supported
> > > protocol
> > > > > > > versions
> > > > > > > > > of
> > > > > > > > > > >> this
> > > > > > > > > > >> >> broker.
> > > > > > > > > > >> >>
> > > > > > > > > > >> >> I just added an example on the KIP wiki to
> elaborate
> > > more
> > > > > on
> > > > > > > > > protocol
> > > > > > > > > > >> >> documentation versioning. Below is the excerpt.
> > > > > > > > > > >> >>
> > > > > > > > > > >> >> For instance say we have two brokers, BrokerA has
> > > > > ApiVersion
> > > > > > 4
> > > > > > > > and
> > > > > > > > > > >> BrokerB
> > > > > > > > > > >> >> has ApiVersion 5. This means we should have
> protocol
> > > > > > > > documentations
> > > > > > > > > > for
> > > > > > > > > > >> >> ApiVersions 4 and 5. Say we have the following as
> > > > protocol
> > > > > > > > > > documentation
> > > > > > > > > > >> >> for these two versions.
> > > > > > > > > > >> >>
> > > > > > > > > > >> >> Sample Protocol Documentation V4
> > > > > > > > > > >> >> Version: 4 // Comes from ApiVersion
> > > > > > > > > > >> >> REQ_A_0: ...
> > > > > > > > > > >> >> REQ_A_1: ...
> > > > > > > > > > >> >> RESP_A_0: ...
> > > > > > > > > > >> >> RESP_A_1: ...
> > > > > > > > > > >> >>
> > > > > > > > > > >> >> Sample Protocol Documentation V5
> > > > > > > > > > >> >> Version: 5 // Comes from ApiVersion
> > > > > > > > > > >> >> REQ_A_1: ...
> > > > > > > > > > >> >> REQ_A_2: ...
> > > > > > > > > > >> >> RESP_A_1: ...
> > > > > > > > > > >> >> RESP_A_2: ...
> > > > > > > > > > >> >>
> > > > > > > > > > >> >> All a client needs to know to be able to
> successfully
> > > > > > > communicate
> > > > > > > > > > with a
> > > > > > > > > > >> >> broker is what is the supported ApiVersion of the
> > > broker.
> > > > > Say
> > > > > > > via
> > > > > > > > > > some
> > > > > > > > > > >> >> mechanism, discussed below, client gets to know
> that
> > > > > BrokerA
> > > > > > > has
> > > > > > > > > > >> ApiVersion
> > > > > > > > > > >> >> 4 and BrokerB has ApiVersion 5. With that
> > information,
> > > > and
> > > > > > the
> > > > > > > > > > available
> > > > > > > > > > >> >> protocol documentations for those ApiVersions
> client
> > > can
> > > > > > deduce
> > > > > > > > > what
> > > > > > > > > > >> >> protocol versions does the broker supports. In this
> > > case
> > > > > > client
> > > > > > > > > will
> > > > > > > > > > >> deduce
> > > > > > > > > > >> >> that it can use v0 and v1 of REQ_A and RESP_A while
> > > > talking
> > > > > > to
> > > > > > > > > > BrokerA,
> > > > > > > > > > >> >> while it can use v1 and v2 of REQ_A and RESP_A
> while
> > > > > talking
> > > > > > to
> > > > > > > > > > BrokerB.
> > > > > > > > > > >> >>
> > > > > > > > > > >> >> On Mon, Mar 14, 2016 at 10:50 PM, Ewen
> > > Cheslack-Postava <
> > > > > > > > > > >> e...@confluent.io <javascript:;>
> > > > > > > > > > >> >> > wrote:
> > > > > > > > > > >> >>
> > > > > > > > > > >> >>> Yeah, Gwen's example is a good one. And it doesn't
> > > even
> > > > > have
> > > > > > > to
> > > > > > > > be
> > > > > > > > > > >> thought
> > > > > > > > > > >> >>> of in terms of the implementation -- you can think
> > of
> > > > the
> > > > > > > > protocol
> > > > > > > > > > >> itself
> > > > > > > > > > >> >>> as effectively being possible to branch and have
> > > changes
> > > > > > > > > > cherry-picked.
> > > > > > > > > > >> >>> Given the way some changes interact and that only
> > some
> > > > may
> > > > > > be
> > > > > > > > > > feasible
> > > > > > > > > > >> to
> > > > > > > > > > >> >>> backport, this may be important.
> > > > > > > > > > >> >>>
> > > > > > > > > > >> >>> Similarly, it's difficult to make that definition
> .
> > In
> > > > > > > practice,
> > > > > > > > > we
> > > > > > > > > > >> >>> sometimes branch and effectively merge the
> protocol
> > --
> > > > > i.e.
> > > > > > we
> > > > > > > > > > develop
> > > > > > > > > > >> 2
> > > > > > > > > > >> >>> KIPs with independent changes at the same time. If
> > you
> > > > > > force a
> > > > > > > > > > linear
> > > > > > > > > > >> >>> model, you also *force* the ordering of
> > > implementation,
> > > > > > which
> > > > > > > > will
> > > > > > > > > > be a
> > > > > > > > > > >> >>> pretty serious constraint in a lot of cases. Two
> > > > > > > > protocol-changing
> > > > > > > > > > KIPs
> > > > > > > > > > >> >>> may
> > > > > > > > > > >> >>> occur near in time, but one may be a much larger
> > > change.
> > > > > > > > > > >> >>>
> > > > > > > > > > >> >>> Finally, it might be worth noting that from a
> client
> > > > > > > developer's
> > > > > > > > > > >> >>> perspective, the linear order may not be all that
> > > > > intuitive
> > > > > > > when
> > > > > > > > > we
> > > > > > > > > > >> pile
> > > > > > > > > > >> >>> on
> > > > > > > > > > >> >>> a bunch of protocol changes in one release. They
> > > > probably
> > > > > > > don't
> > > > > > > > > > >> actually
> > > > > > > > > > >> >>> care about that global protocol version. They'll
> > care
> > > > more
> > > > > > > about
> > > > > > > > > the
> > > > > > > > > > >> types
> > > > > > > > > > >> >>> of things Dana was talking about previously: LZ4
> > > support
> > > > > > > (which
> > > > > > > > > > isn't
> > > > > > > > > > >> even
> > > > > > > > > > >> >>> a protocol change, but an important feature
> clients
> > > > might
> > > > > > need
> > > > > > > > to
> > > > > > > > > > know
> > > > > > > > > > >> >>> about!), Kafka-backed offset storage (requires 2
> > > > protocol
> > > > > > > > > changes),
> > > > > > > > > > >> etc.
> > > > > > > > > > >> >>> While we want to encourage supporting all
> features,
> > we
> > > > > > should
> > > > > > > be
> > > > > > > > > > >> realistic
> > > > > > > > > > >> >>> about how client developers tackle feature
> > development
> > > > and
> > > > > > > > limited
> > > > > > > > > > >> >>> bandwidth. They are probably more feature driven
> > than
> > > > > > version
> > > > > > > > > > driven.
> > > > > > > > > > >> >>>
> > > > > > > > > > >> >>> This is what Gwen was saying I had mentioned. The
> > idea
> > > > of
> > > > > > > > features
> > > > > > > > > > is
> > > > > > > > > > >> >>> actually separate from what has been described so
> > far
> > > > and
> > > > > > > *does*
> > > > > > > > > > >> require a
> > > > > > > > > > >> >>> mapping to protocol versions, but also allows you
> to
> > > > > capture
> > > > > > > > more
> > > > > > > > > > than
> > > > > > > > > > >> >>> that
> > > > > > > > > > >> >>> and at more flexible granularity (single request
> > type
> > > > > > protocol
> > > > > > > > > > version
> > > > > > > > > > >> >>> bump
> > > > > > > > > > >> >>> or the whole set of requests could change). The
> idea
> > > > isn't
> > > > > > > quite
> > > > > > > > > the
> > > > > > > > > > >> same
> > > > > > > > > > >> >>> as browser feature detection, but that's my frame
> of
> > > > > > reference
> > > > > > > > for
> > > > > > > > > > it
> > > > > > > > > > >> (see
> > > > > > > > > > >> >>>
> > > > > > > > >
> > > > https://developer.mozilla.org/en-US/docs/Browser_Feature_Detection
> > > > > > > > > > ),
> > > > > > > > > > >> the
> > > > > > > > > > >> >>> process of trying to sort out supported features
> and
> > > > > > protocols
> > > > > > > > > > based on
> > > > > > > > > > >> >>> browser version IDs (sort of equivalent to broker
> > > > > > > implementation
> > > > > > > > > > >> versions
> > > > > > > > > > >> >>> here) is a huge mess. Going entirely the other
> route
> > > > (say,
> > > > > > > only
> > > > > > > > > > >> enabling a
> > > > > > > > > > >> >>> feature in CSS3 if *all* CSS3 features are
> > > implemented)
> > > > is
> > > > > > > > really
> > > > > > > > > > >> >>> restrictive.
> > > > > > > > > > >> >>>
> > > > > > > > > > >> >>> I don't have a concrete proposal right now, but
> > > > something
> > > > > > like
> > > > > > > > > > >> "features"
> > > > > > > > > > >> >>> that sit somewhere between a global protocol
> version
> > > > > number
> > > > > > > and
> > > > > > > > > only
> > > > > > > > > > >> >>> individual request versions more accurately
> captures
> > > > what
> > > > > we
> > > > > > > > want
> > > > > > > > > to
> > > > > > > > > > >> >>> express, in my opinion.
> > > > > > > > > > >> >>>
> > > > > > > > > > >> >>> -Ewen
> > > > > > > > > > >> >>>
> > > > > > > > > > >> >>> On Mon, Mar 14, 2016 at 6:45 PM, Gwen Shapira <
> > > > > > > > g...@confluent.io
> > > > > > > > > > <javascript:;>>
> > > > > > > > > > >> wrote:
> > > > > > > > > > >> >>>
> > > > > > > > > > >> >>> > Jay,
> > > > > > > > > > >> >>> >
> > > > > > > > > > >> >>> > Ewen had a good example:
> > > > > > > > > > >> >>> >
> > > > > > > > > > >> >>> > 1. 0.10.0 (protocol v4)  is released with
> current
> > > > KIP-35
> > > > > > > > > > >> >>> > 2. On trunk, modify produce requests and bump to
> > v5
> > > > > > > > > > >> >>> > 3. On trunk, we modify metadata requests and
> bump
> > to
> > > > v6
> > > > > > > > > > >> >>> > 4. Now we decide that the metadata change fixes
> a
> > > > super
> > > > > > > > critical
> > > > > > > > > > >> issue
> > > > > > > > > > >> >>> and
> > > > > > > > > > >> >>> > want to backport the change. What's the protocol
> > > > version
> > > > > > of
> > > > > > > > the
> > > > > > > > > > next
> > > > > > > > > > >> >>> > release of 0.10.0 - which supports v6 protocol
> > only
> > > > > > > partially?
> > > > > > > > > > >> >>> >
> > > > > > > > > > >> >>> > Gwen
> > > > > > > > > > >> >>> >
> > > > > > > > > > >> >>> > On Mon, Mar 14, 2016 at 6:38 PM, Jay Kreps <
> > > > > > > j...@confluent.io
> > > > > > > > > > <javascript:;>> wrote:
> > > > > > > > > > >> >>> >
> > > > > > > > > > >> >>> > > Hey Dana,
> > > > > > > > > > >> >>> > >
> > > > > > > > > > >> >>> > > I am actually thinking about it differently.
> > > > > Basically I
> > > > > > > > think
> > > > > > > > > > you
> > > > > > > > > > >> are
> > > > > > > > > > >> >>> > > imagining a world in which the Kafka code is
> the
> > > > > source
> > > > > > of
> > > > > > > > > > truth,
> > > > > > > > > > >> and
> > > > > > > > > > >> >>> > > the Kafka developers make random changes that
> > > > inflict
> > > > > > pain
> > > > > > > > on
> > > > > > > > > > you
> > > > > > > > > > >> at
> > > > > > > > > > >> >>> > > will. The protocol documentation is basically
> > just
> > > > > some
> > > > > > > > > > >> semi-accurate
> > > > > > > > > > >> >>> > > description of what the code does. It sounds
> > like
> > > > this
> > > > > > > isn't
> > > > > > > > > too
> > > > > > > > > > >> far
> > > > > > > > > > >> >>> > > from the actual world. :-) In that world I
> agree
> > > > that
> > > > > > the
> > > > > > > > best
> > > > > > > > > > we
> > > > > > > > > > >> >>> > > could do would be to assign some id to
> versions
> > > (the
> > > > > md5
> > > > > > > of
> > > > > > > > > the
> > > > > > > > > > >> Kafka
> > > > > > > > > > >> >>> > > jar, maybe) and put in various checks around
> > that
> > > in
> > > > > > > clients
> > > > > > > > > to
> > > > > > > > > > >> try to
> > > > > > > > > > >> >>> > > keep things working.
> > > > > > > > > > >> >>> > >
> > > > > > > > > > >> >>> > > But imagine a different approach where we try
> to
> > > > > really
> > > > > > > > treat
> > > > > > > > > > the
> > > > > > > > > > >> >>> > > protocol as a document and treat that as the
> > > source
> > > > of
> > > > > > > > truth.
> > > > > > > > > We
> > > > > > > > > > >> try
> > > > > > > > > > >> >>> > > to make this document cover what is and isn't
> > > > > specified
> > > > > > > and
> > > > > > > > > > make it
> > > > > > > > > > >> >>> > > cover enough to support client implementations
> > > and a
> > > > > > given
> > > > > > > > > Kafka
> > > > > > > > > > >> >>> > > version covers some range of protocols
> > explicitly.
> > > > > There
> > > > > > > is
> > > > > > > > a
> > > > > > > > > > >> version
> > > > > > > > > > >> >>> > > of this document for each protocol version.
> The
> > > code
> > > > > > > > > implements
> > > > > > > > > > the
> > > > > > > > > > >> >>> > > protocol rather than vice versa.
> > > > > > > > > > >> >>> > >
> > > > > > > > > > >> >>> > > So in other words protocol changes are totally
> > > > ordered
> > > > > > and
> > > > > > > > > > separate
> > > > > > > > > > >> >>> > > from code development (we might develop them
> > > > together
> > > > > > but
> > > > > > > > the
> > > > > > > > > > >> protocol
> > > > > > > > > > >> >>> > > assignment would come when you checked in the
> > new
> > > > > > protocol
> > > > > > > > > > version
> > > > > > > > > > >> >>> > > which would happen with your code).
> > > > > > > > > > >> >>> > >
> > > > > > > > > > >> >>> > > This was really the intention with the
> protocol
> > > > > > originally
> > > > > > > > > > (though
> > > > > > > > > > >> we
> > > > > > > > > > >> >>> > > were doing it on a per-api basis), but I think
> > > that
> > > > > > > > > > understanding
> > > > > > > > > > >> was
> > > > > > > > > > >> >>> > > not shared by the full team and we have not
> > done a
> > > > > great
> > > > > > > job
> > > > > > > > > of
> > > > > > > > > > >> >>> > > important things like documentation or
> > explaining
> > > > how
> > > > > > this
> > > > > > > > are
> > > > > > > > > > >> >>> > > supposed to work so we fall back on the "the
> > > > protocol
> > > > > is
> > > > > > > > > > whatever
> > > > > > > > > > >> the
> > > > > > > > > > >> >>> > > code does" thing.
> > > > > > > > > > >> >>> > >
> > > > > > > > > > >> >>> > > Does that make sense? In that sense think one
> of
> > > the
> > > > > > more
> > > > > > > > > > important
> > > > > > > > > > >> >>> > > things we could get out of this would not be
> > more
> > > > > > > versioning
> > > > > > > > > > >> features
> > > > > > > > > > >> >>> > > so much as clear docs and processes around
> > > protocol
> > > > > > > > > versioning.
> > > > > > > > > > >> >>> > >
> > > > > > > > > > >> >>> > > -Jay
> > > > > > > > > > >> >>> > >
> > > > > > > > > > >> >>> > > On Mon, Mar 14, 2016 at 6:22 PM, Dana Powers <
> > > > > > > > > > >> dana.pow...@gmail.com <javascript:;>>
> > > > > > > > > > >> >>> > > wrote:
> > > > > > > > > > >> >>> > > > Is a linear protocol int consistent with the
> > > > current
> > > > > > > > release
> > > > > > > > > > >> model?
> > > > > > > > > > >> >>> It
> > > > > > > > > > >> >>> > > > seems like that would break down w/ the
> > multiple
> > > > > > release
> > > > > > > > > > branches
> > > > > > > > > > >> >>> that
> > > > > > > > > > >> >>> > > are
> > > > > > > > > > >> >>> > > > all simultaneously maintained? Or is it
> > implicit
> > > > > that
> > > > > > no
> > > > > > > > > patch
> > > > > > > > > > >> >>> release
> > > > > > > > > > >> >>> > > can
> > > > > > > > > > >> >>> > > > ever bump the protocol int? Or maybe the
> > > protocol
> > > > > int
> > > > > > > gets
> > > > > > > > > > some
> > > > > > > > > > >> >>> extra
> > > > > > > > > > >> >>> > > > "wiggle" on minor / major releases to create
> > > > > > unallocated
> > > > > > > > > > version
> > > > > > > > > > >> >>> ints
> > > > > > > > > > >> >>> > > that
> > > > > > > > > > >> >>> > > > could be used on future patch releases /
> > > > backports?
> > > > > > > > > > >> >>> > > >
> > > > > > > > > > >> >>> > > > I think the protocol version int does make
> > sense
> > > > for
> > > > > > > folks
> > > > > > > > > > >> deploying
> > > > > > > > > > >> >>> > from
> > > > > > > > > > >> >>> > > > trunk.
> > > > > > > > > > >> >>> > > >
> > > > > > > > > > >> >>> > > > -Dana
> > > > > > > > > > >> >>> > > >
> > > > > > > > > > >> >>> > > > On Mon, Mar 14, 2016 at 6:13 PM, Jay Kreps <
> > > > > > > > > j...@confluent.io
> > > > > > > > > > <javascript:;>>
> > > > > > > > > > >> >>> wrote:
> > > > > > > > > > >> >>> > > >
> > > > > > > > > > >> >>> > > >> Yeah I think that is the point--we have a
> > > > proposal
> > > > > > for
> > > > > > > a
> > > > > > > > > new
> > > > > > > > > > >> >>> protocol
> > > > > > > > > > >> >>> > > >> versioning scheme and a vote on it but it
> > > doesn't
> > > > > > > > actually
> > > > > > > > > > >> describe
> > > > > > > > > > >> >>> > > >> how versioning will work yet! I gave my
> vague
> > > > > > > impression
> > > > > > > > > > based
> > > > > > > > > > >> on
> > > > > > > > > > >> >>> this
> > > > > > > > > > >> >>> > > >> thread, but I want to make sure that is
> > correct
> > > > and
> > > > > > get
> > > > > > > > it
> > > > > > > > > > >> written
> > > > > > > > > > >> >>> > > >> down before we adopt it.
> > > > > > > > > > >> >>> > > >>
> > > > > > > > > > >> >>> > > >> -Jay
> > > > > > > > > > >> >>> > > >>
> > > > > > > > > > >> >>> > > >> On Mon, Mar 14, 2016 at 5:58 PM, Gwen
> > Shapira <
> > > > > > > > > > >> g...@confluent.io <javascript:;>>
> > > > > > > > > > >> >>> > > wrote:
> > > > > > > > > > >> >>> > > >> > On Mon, Mar 14, 2016 at 5:31 PM, Jay
> Kreps
> > <
> > > > > > > > > > j...@confluent.io <javascript:;>>
> > > > > > > > > > >> >>> > wrote:
> > > > > > > > > > >> >>> > > >> >
> > > > > > > > > > >> >>> > > >> >> Couple of missing things:
> > > > > > > > > > >> >>> > > >> >>
> > > > > > > > > > >> >>> > > >> >> This KIP doesn't have a proposal on
> > > versioning
> > > > > it
> > > > > > > just
> > > > > > > > > > gives
> > > > > > > > > > >> >>> > > different
> > > > > > > > > > >> >>> > > >> >> options, it'd be good to get a concrete
> > > > proposal
> > > > > > in
> > > > > > > > the
> > > > > > > > > > KIP.
> > > > > > > > > > >> >>> Here
> > > > > > > > > > >> >>> > is
> > > > > > > > > > >> >>> > > my
> > > > > > > > > > >> >>> > > >> >> understanding of what we are proposing
> > (can
> > > > > > someone
> > > > > > > > > sanity
> > > > > > > > > > >> check
> > > > > > > > > > >> >>> > and
> > > > > > > > > > >> >>> > > if
> > > > > > > > > > >> >>> > > >> >> correct, update the kip):
> > > > > > > > > > >> >>> > > >> >>
> > > > > > > > > > >> >>> > > >> >>    1. We will augment the existing
> > > api_version
> > > > > > field
> > > > > > > > in
> > > > > > > > > > the
> > > > > > > > > > >> >>> header
> > > > > > > > > > >> >>> > > with
> > > > > > > > > > >> >>> > > >> a
> > > > > > > > > > >> >>> > > >> >>    protocol_version that will begin at
> > some
> > > > > > initial
> > > > > > > > > value
> > > > > > > > > > and
> > > > > > > > > > >> >>> > > increment
> > > > > > > > > > >> >>> > > >> by
> > > > > > > > > > >> >>> > > >> >> 1
> > > > > > > > > > >> >>> > > >> >>    every time we make a changes to any
> of
> > > the
> > > > > > > > > api_versions
> > > > > > > > > > >> >>> > (question:
> > > > > > > > > > >> >>> > > >> >>    including internal apis?).
> > > > > > > > > > >> >>> > > >> >>
> > > > > > > > > > >> >>> > > >> >
> > > > > > > > > > >> >>> > > >> > Jay, this part was not in the KIP and was
> > > never
> > > > > > > > > discussed.
> > > > > > > > > > >> >>> > > >> > Are you proposing adding this? Or is it
> > just
> > > an
> > > > > > > > > assumption
> > > > > > > > > > you
> > > > > > > > > > >> >>> made?
> > > > > > > > > > >> >>> > > >> >
> > > > > > > > > > >> >>> > > >> >
> > > > > > > > > > >> >>> > > >> >
> > > > > > > > > > >> >>> > > >> >>    2. The protocol_version will be added
> > to
> > > > the
> > > > > > > > metadata
> > > > > > > > > > >> request
> > > > > > > > > > >> >>> > > >> >>    3. We will also add a string that
> this
> > > > > proposal
> > > > > > > is
> > > > > > > > > > calling
> > > > > > > > > > >> >>> > > >> VersionString
> > > > > > > > > > >> >>> > > >> >>    which will describe the build of
> kafka
> > in
> > > > > some
> > > > > > > way.
> > > > > > > > > The
> > > > > > > > > > >> >>> clients
> > > > > > > > > > >> >>> > > >> should
> > > > > > > > > > >> >>> > > >> >> not
> > > > > > > > > > >> >>> > > >> >>    under any circumstances do anything
> > with
> > > > this
> > > > > > > > string
> > > > > > > > > > other
> > > > > > > > > > >> >>> than
> > > > > > > > > > >> >>> > > >> print it
> > > > > > > > > > >> >>> > > >> >>    out to the user.
> > > > > > > > > > >> >>> > > >> >>
> > > > > > > > > > >> >>> > > >> >> One thing I'm not sure about: I think
> > > > currently
> > > > > > > > metadata
> > > > > > > > > > >> sits in
> > > > > > > > > > >> >>> > the
> > > > > > > > > > >> >>> > > >> client
> > > > > > > > > > >> >>> > > >> >> for 10 mins by default. Say a client
> > > > bootstraps
> > > > > > and
> > > > > > > > > then a
> > > > > > > > > > >> >>> server
> > > > > > > > > > >> >>> > is
> > > > > > > > > > >> >>> > > >> >> downgraded to an earlier version, won't
> > the
> > > > > > client's
> > > > > > > > > > metadata
> > > > > > > > > > >> >>> > version
> > > > > > > > > > >> >>> > > >> >> indicate that that client handles a
> > version
> > > it
> > > > > > > doesn't
> > > > > > > > > > >> actually
> > > > > > > > > > >> >>> > > handle
> > > > > > > > > > >> >>> > > >> any
> > > > > > > > > > >> >>> > > >> >> more? We need to document how clients
> will
> > > > > handle
> > > > > > > > this.
> > > > > > > > > > >> >>> > > >> >>
> > > > > > > > > > >> >>> > > >> >> Here are some comments on other details:
> > > > > > > > > > >> >>> > > >> >>
> > > > > > > > > > >> >>> > > >> >>    1. As a minor thing I think we should
> > > avoid
> > > > > > > naming
> > > > > > > > > the
> > > > > > > > > > >> fields
> > > > > > > > > > >> >>> > > >> VersionId
> > > > > > > > > > >> >>> > > >> >>    and VersionString which sort of
> implies
> > > > they
> > > > > > are
> > > > > > > > both
> > > > > > > > > > used
> > > > > > > > > > >> >>> for
> > > > > > > > > > >> >>> > > >> >> versioning.
> > > > > > > > > > >> >>> > > >> >>    I think we should call them something
> > > like
> > > > > > > > > > ProtocolVersion
> > > > > > > > > > >> >>> and
> > > > > > > > > > >> >>> > > >> >>    BuildDescription, with
> BuildDescription
> > > > being
> > > > > > > > totally
> > > > > > > > > > >> >>> > unspecified
> > > > > > > > > > >> >>> > > >> other
> > > > > > > > > > >> >>> > > >> >>    than that it is some kind of human
> > > readable
> > > > > > > string
> > > > > > > > > > >> >>> describing a
> > > > > > > > > > >> >>> > > >> >> particular
> > > > > > > > > > >> >>> > > >> >>    Kafka build. We really don't want a
> > > client
> > > > > > > > attempting
> > > > > > > > > > to
> > > > > > > > > > >> use
> > > > > > > > > > >> >>> > this
> > > > > > > > > > >> >>> > > >> >> string in
> > > > > > > > > > >> >>> > > >> >>    any way as that would always be the
> > wrong
> > > > > thing
> > > > > > > to
> > > > > > > > do
> > > > > > > > > > in
> > > > > > > > > > >> the
> > > > > > > > > > >> >>> > > >> versioning
> > > > > > > > > > >> >>> > > >> >>    scheme we are proposing, you should
> > > always
> > > > > use
> > > > > > > the
> > > > > > > > > > >> protocol
> > > > > > > > > > >> >>> > > version.
> > > > > > > > > > >> >>> > > >> >>    2. Does making the topics field in
> the
> > > > > metadata
> > > > > > > > > request
> > > > > > > > > > >> >>> nullable
> > > > > > > > > > >> >>> > > >> >>    actually make sense? We have a
> history
> > of
> > > > > > wanting
> > > > > > > > to
> > > > > > > > > > add
> > > > > > > > > > >> >>> magical
> > > > > > > > > > >> >>> > > >> values
> > > > > > > > > > >> >>> > > >> >>    rather than fields. Currently
> > topics=[a]
> > > > > means
> > > > > > > give
> > > > > > > > > me
> > > > > > > > > > >> >>> > information
> > > > > > > > > > >> >>> > > >> about
> > > > > > > > > > >> >>> > > >> >>    topic a, topics=[] means give me
> > > > information
> > > > > > > about
> > > > > > > > > all
> > > > > > > > > > >> >>> topics,
> > > > > > > > > > >> >>> > > and we
> > > > > > > > > > >> >>> > > >> >> are
> > > > > > > > > > >> >>> > > >> >>    proposing topics=null would mean
> don't
> > > give
> > > > > me
> > > > > > > > > topics.
> > > > > > > > > > I
> > > > > > > > > > >> >>> don't
> > > > > > > > > > >> >>> > > have a
> > > > > > > > > > >> >>> > > >> >>    strong opinion.
> > > > > > > > > > >> >>> > > >> >>    3. I prefer Jason's proposal on
> using a
> > > > > > > > conservative
> > > > > > > > > > >> metadata
> > > > > > > > > > >> >>> > > version
> > > > > > > > > > >> >>> > > >> >>    versus the empty response hack.
> > However I
> > > > > think
> > > > > > > > that
> > > > > > > > > > may
> > > > > > > > > > >> >>> > actually
> > > > > > > > > > >> >>> > > >> >>    exacerbate the downgrade scenario I
> > > > > described.
> > > > > > > > > > >> >>> > > >> >>    4. I agree with Jason that we should
> > > really
> > > > > > look
> > > > > > > at
> > > > > > > > > the
> > > > > > > > > > >> >>> details
> > > > > > > > > > >> >>> > of
> > > > > > > > > > >> >>> > > >> the
> > > > > > > > > > >> >>> > > >> >>    implementation so we know it
> > > > > > works--implementing
> > > > > > > > > server
> > > > > > > > > > >> >>> support
> > > > > > > > > > >> >>> > > >> without
> > > > > > > > > > >> >>> > > >> >>    actually trying it is kind of risky.
> > > > > > > > > > >> >>> > > >> >>
> > > > > > > > > > >> >>> > > >> >> As a meta comment: I'd really like to
> > > > encourage
> > > > > us
> > > > > > > to
> > > > > > > > > > think
> > > > > > > > > > >> of
> > > > > > > > > > >> >>> the
> > > > > > > > > > >> >>> > > >> protocol
> > > > > > > > > > >> >>> > > >> >> as a document that includes the
> following
> > > > > things:
> > > > > > > > > > >> >>> > > >> >>
> > > > > > > > > > >> >>> > > >> >>    - The binary format, error codes, etc
> > > > > > > > > > >> >>> > > >> >>    - The request/response interaction
> > > > > > > > > > >> >>> > > >> >>    - The semantics of each request in
> > > > different
> > > > > > > cases
> > > > > > > > > > >> >>> > > >> >>    - Instructions on how to use this to
> > > > > implement
> > > > > > a
> > > > > > > > > client
> > > > > > > > > > >> >>> > > >> >>
> > > > > > > > > > >> >>> > > >> >> This document is versioned with the
> > protocol
> > > > > > number
> > > > > > > > and
> > > > > > > > > is
> > > > > > > > > > >> the
> > > > > > > > > > >> >>> > > source of
> > > > > > > > > > >> >>> > > >> >> truth for the protocol.
> > > > > > > > > > >> >>> > > >> >>
> > > > > > > > > > >> >>> > > >> >> Part of any protocol change needs to be
> an
> > > > > update
> > > > > > to
> > > > > > > > the
> > > > > > > > > > >> >>> > > instructions on
> > > > > > > > > > >> >>> > > >> >> how to use that part of the protocol. We
> > > > should
> > > > > be
> > > > > > > > > > >> opinionated.
> > > > > > > > > > >> >>> If
> > > > > > > > > > >> >>> > > there
> > > > > > > > > > >> >>> > > >> >> are two options there should be a
> reason,
> > > and
> > > > > then
> > > > > > > we
> > > > > > > > > > need to
> > > > > > > > > > >> >>> > > document
> > > > > > > > > > >> >>> > > >> both
> > > > > > > > > > >> >>> > > >> >> and say exactly when to use each.
> > > > > > > > > > >> >>> > > >> >>
> > > > > > > > > > >> >>> > > >> >> I think we also need to get a "how to"
> > > > document
> > > > > on
> > > > > > > > > > protocol
> > > > > > > > > > >> >>> changes
> > > > > > > > > > >> >>> > > >> just so
> > > > > > > > > > >> >>> > > >> >> people know what they need to do to add
> a
> > > new
> > > > > > > protocol
> > > > > > > > > > >> feature.
> > > > > > > > > > >> >>> > > >> >>
> > > > > > > > > > >> >>> > > >> >> -Jay
> > > > > > > > > > >> >>> > > >> >>
> > > > > > > > > > >> >>> > > >> >> On Mon, Mar 14, 2016 at 4:51 PM, Jason
> > > > > Gustafson <
> > > > > > > > > > >> >>> > ja...@confluent.io <javascript:;>
> > > > > > > > > > >> >>> > > >
> > > > > > > > > > >> >>> > > >> >> wrote:
> > > > > > > > > > >> >>> > > >> >>
> > > > > > > > > > >> >>> > > >> >> > >
> > > > > > > > > > >> >>> > > >> >> > > Are you suggesting this as a
> solution
> > > for
> > > > > the
> > > > > > > > > problem
> > > > > > > > > > >> where
> > > > > > > > > > >> >>> a
> > > > > > > > > > >> >>> > > KIP-35
> > > > > > > > > > >> >>> > > >> >> > aware
> > > > > > > > > > >> >>> > > >> >> > > client sends a higher version of
> > > metadata
> > > > > req,
> > > > > > > say
> > > > > > > > > v2,
> > > > > > > > > > >> to a
> > > > > > > > > > >> >>> > > KIP-35
> > > > > > > > > > >> >>> > > >> >> aware
> > > > > > > > > > >> >>> > > >> >> > > broker that only supports up to v1.
> > > > > > > > > > >> >>> > > >> >> >
> > > > > > > > > > >> >>> > > >> >> >
> > > > > > > > > > >> >>> > > >> >> > Yes, that's right. In that case, the
> > > client
> > > > > > first
> > > > > > > > > sends
> > > > > > > > > > v1,
> > > > > > > > > > >> >>> finds
> > > > > > > > > > >> >>> > > out
> > > > > > > > > > >> >>> > > >> >> that
> > > > > > > > > > >> >>> > > >> >> > the broker supports v2, and then sends
> > v2
> > > > (if
> > > > > it
> > > > > > > has
> > > > > > > > > any
> > > > > > > > > > >> >>> reason
> > > > > > > > > > >> >>> > to
> > > > > > > > > > >> >>> > > do
> > > > > > > > > > >> >>> > > >> >> so).
> > > > > > > > > > >> >>> > > >> >> >
> > > > > > > > > > >> >>> > > >> >> > We had a bit of discussion on such
> > > > scenarios,
> > > > > > and
> > > > > > > it
> > > > > > > > > > >> seemed to
> > > > > > > > > > >> >>> > be a
> > > > > > > > > > >> >>> > > >> >> chicken
> > > > > > > > > > >> >>> > > >> >> > > and egg problem that is hard to
> avoid.
> > > > Your
> > > > > > > > > suggestion
> > > > > > > > > > >> >>> > definitely
> > > > > > > > > > >> >>> > > >> makes
> > > > > > > > > > >> >>> > > >> >> > > sense, however it falls under the
> > > purview
> > > > of
> > > > > > > > > clients.
> > > > > > > > > > >> >>> > > >> >> >
> > > > > > > > > > >> >>> > > >> >> >
> > > > > > > > > > >> >>> > > >> >> > That basically means clients should
> > figure
> > > > it
> > > > > > out
> > > > > > > > for
> > > > > > > > > > >> >>> themselves?
> > > > > > > > > > >> >>> > > >> Might
> > > > > > > > > > >> >>> > > >> >> be
> > > > > > > > > > >> >>> > > >> >> > nice to have a better answer.
> > > > > > > > > > >> >>> > > >> >> >
> > > > > > > > > > >> >>> > > >> >> > KIP-35 only aims on adding support for
> > > > getting
> > > > > > the
> > > > > > > > > > version
> > > > > > > > > > >> >>> info
> > > > > > > > > > >> >>> > > from a
> > > > > > > > > > >> >>> > > >> >> > > broker. This definitely can be
> > utilized
> > > by
> > > > > our
> > > > > > > > > > clients.
> > > > > > > > > > >> >>> > However,
> > > > > > > > > > >> >>> > > >> that
> > > > > > > > > > >> >>> > > >> >> can
> > > > > > > > > > >> >>> > > >> >> > > follow KIP-35 changes. Does this
> sound
> > > > > > > reasonable
> > > > > > > > to
> > > > > > > > > > you?
> > > > > > > > > > >> >>> > > >> >> >
> > > > > > > > > > >> >>> > > >> >> >
> > > > > > > > > > >> >>> > > >> >> > It may be OK, but I'm a little
> concerned
> > > > about
> > > > > > > > > offering
> > > > > > > > > > a
> > > > > > > > > > >> >>> feature
> > > > > > > > > > >> >>> > > >> that we
> > > > > > > > > > >> >>> > > >> >> > don't support ourselves. Sometimes
> it's
> > > not
> > > > > > until
> > > > > > > > > > >> >>> implementation
> > > > > > > > > > >> >>> > > that
> > > > > > > > > > >> >>> > > >> we
> > > > > > > > > > >> >>> > > >> >> > find out whether it really works as
> > > > expected.
> > > > > > And
> > > > > > > if
> > > > > > > > > > we're
> > > > > > > > > > >> >>> > > eventually
> > > > > > > > > > >> >>> > > >> >> > planning to support it, I feel we
> should
> > > > think
> > > > > > > > through
> > > > > > > > > > >> some of
> > > > > > > > > > >> >>> > the
> > > > > > > > > > >> >>> > > >> cases
> > > > > > > > > > >> >>> > > >> >> a
> > > > > > > > > > >> >>> > > >> >> > bit more. For example, the upgrade and
> > > > > downgrade
> > > > > > > > cases
> > > > > > > > > > that
> > > > > > > > > > >> >>> > Becket
> > > > > > > > > > >> >>> > > >> >> > mentioned earlier. It doesn't feel too
> > > great
> > > > > to
> > > > > > > > > support
> > > > > > > > > > >> this
> > > > > > > > > > >> >>> > > feature
> > > > > > > > > > >> >>> > > >> >> unless
> > > > > > > > > > >> >>> > > >> >> > we can offer guidance on how to use
> it.
> > > > > > > > > > >> >>> > > >> >> >
> > > > > > > > > > >> >>> > > >> >> > -Jason
> > > > > > > > > > >> >>> > > >> >> >
> > > > > > > > > > >> >>> > > >> >> >
> > > > > > > > > > >> >>> > > >> >> >
> > > > > > > > > > >> >>> > > >> >> > On Mon, Mar 14, 2016 at 4:20 PM,
> Ashish
> > > > Singh
> > > > > <
> > > > > > > > > > >> >>> > asi...@cloudera.com <javascript:;>
> > > > > > > > > > >> >>> > > >
> > > > > > > > > > >> >>> > > >> >> wrote:
> > > > > > > > > > >> >>> > > >> >> >
> > > > > > > > > > >> >>> > > >> >> > > Hi Jason,
> > > > > > > > > > >> >>> > > >> >> > >
> > > > > > > > > > >> >>> > > >> >> > > On Mon, Mar 14, 2016 at 4:04 PM,
> Jason
> > > > > > > Gustafson <
> > > > > > > > > > >> >>> > > >> ja...@confluent.io <javascript:;>>
> > > > > > > > > > >> >>> > > >> >> > > wrote:
> > > > > > > > > > >> >>> > > >> >> > >
> > > > > > > > > > >> >>> > > >> >> > > > Perhaps clients should always send
> > the
> > > > > > oldest
> > > > > > > > > > version
> > > > > > > > > > >> of
> > > > > > > > > > >> >>> the
> > > > > > > > > > >> >>> > > >> metadata
> > > > > > > > > > >> >>> > > >> >> > > > request which supports KIP-35 when
> > > > > initially
> > > > > > > > > > >> connecting to
> > > > > > > > > > >> >>> > the
> > > > > > > > > > >> >>> > > >> >> cluster.
> > > > > > > > > > >> >>> > > >> >> > > > Depending on the versions in the
> > > > response,
> > > > > > it
> > > > > > > > can
> > > > > > > > > > >> upgrade
> > > > > > > > > > >> >>> to
> > > > > > > > > > >> >>> > a
> > > > > > > > > > >> >>> > > >> more
> > > > > > > > > > >> >>> > > >> >> > > recent
> > > > > > > > > > >> >>> > > >> >> > > > version. Then maybe we don't need
> > the
> > > > > empty
> > > > > > > > > response
> > > > > > > > > > >> hack?
> > > > > > > > > > >> >>> > > >> >> > > >
> > > > > > > > > > >> >>> > > >> >> > > Are you suggesting this as a
> solution
> > > for
> > > > > the
> > > > > > > > > problem
> > > > > > > > > > >> where
> > > > > > > > > > >> >>> a
> > > > > > > > > > >> >>> > > KIP-35
> > > > > > > > > > >> >>> > > >> >> > aware
> > > > > > > > > > >> >>> > > >> >> > > client sends a higher version of
> > > metadata
> > > > > req,
> > > > > > > say
> > > > > > > > > v2,
> > > > > > > > > > >> to a
> > > > > > > > > > >> >>> > > KIP-35
> > > > > > > > > > >> >>> > > >> >> aware
> > > > > > > > > > >> >>> > > >> >> > > broker that only supports up to v1.
> > > > > > > > > > >> >>> > > >> >> > >
> > > > > > > > > > >> >>> > > >> >> > > We had a bit of discussion on such
> > > > > scenarios,
> > > > > > > and
> > > > > > > > it
> > > > > > > > > > >> seemed
> > > > > > > > > > >> >>> to
> > > > > > > > > > >> >>> > > be a
> > > > > > > > > > >> >>> > > >> >> > chicken
> > > > > > > > > > >> >>> > > >> >> > > and egg problem that is hard to
> avoid.
> > > > Your
> > > > > > > > > suggestion
> > > > > > > > > > >> >>> > definitely
> > > > > > > > > > >> >>> > > >> makes
> > > > > > > > > > >> >>> > > >> >> > > sense, however it falls under the
> > > purview
> > > > of
> > > > > > > > > clients.
> > > > > > > > > > >> >>> > > >> >> > >
> > > > > > > > > > >> >>> > > >> >> > > >
> > > > > > > > > > >> >>> > > >> >> > > > One thing that's not clear to me
> is
> > > > > whether
> > > > > > > the
> > > > > > > > > > >> ultimate
> > > > > > > > > > >> >>> goal
> > > > > > > > > > >> >>> > > of
> > > > > > > > > > >> >>> > > >> this
> > > > > > > > > > >> >>> > > >> >> > KIP
> > > > > > > > > > >> >>> > > >> >> > > > is to have our clients support
> > > multiple
> > > > > > broker
> > > > > > > > > > >> versions.
> > > > > > > > > > >> >>> It
> > > > > > > > > > >> >>> > > would
> > > > > > > > > > >> >>> > > >> be
> > > > > > > > > > >> >>> > > >> >> a
> > > > > > > > > > >> >>> > > >> >> > > > little weird to have this feature
> if
> > > our
> > > > > own
> > > > > > > > > clients
> > > > > > > > > > >> don't
> > > > > > > > > > >> >>> > use
> > > > > > > > > > >> >>> > > it.
> > > > > > > > > > >> >>> > > >> >> > > >
> > > > > > > > > > >> >>> > > >> >> > > KIP-35 only aims on adding support
> for
> > > > > getting
> > > > > > > the
> > > > > > > > > > >> version
> > > > > > > > > > >> >>> info
> > > > > > > > > > >> >>> > > >> from a
> > > > > > > > > > >> >>> > > >> >> > > broker. This definitely can be
> > utilized
> > > by
> > > > > our
> > > > > > > > > > clients.
> > > > > > > > > > >> >>> > However,
> > > > > > > > > > >> >>> > > >> that
> > > > > > > > > > >> >>> > > >> >> can
> > > > > > > > > > >> >>> > > >> >> > > follow KIP-35 changes. Does this
> sound
> > > > > > > reasonable
> > > > > > > > to
> > > > > > > > > > you?
> > > > > > > > > > >> >>> > > >> >> > >
> > > > > > > > > > >> >>> > > >> >> > > >
> > > > > > > > > > >> >>> > > >> >> > > > -Jason
> > > > > > > > > > >> >>> > > >> >> > > >
> > > > > > > > > > >> >>> > > >> >> > > > On Mon, Mar 14, 2016 at 3:34 PM,
> > > Ashish
> > > > > > Singh
> > > > > > > <
> > > > > > > > > > >> >>> > > >> asi...@cloudera.com <javascript:;>>
> > > > > > > > > > >> >>> > > >> >> > > wrote:
> > > > > > > > > > >> >>> > > >> >> > > >
> > > > > > > > > > >> >>> > > >> >> > > > > On Mon, Mar 14, 2016 at 2:12 PM,
> > > > Ismael
> > > > > > > Juma <
> > > > > > > > > > >> >>> > > ism...@juma.me.uk <javascript:;>
> > > > > > > > > > >> >>> > > >> >
> > > > > > > > > > >> >>> > > >> >> > > wrote:
> > > > > > > > > > >> >>> > > >> >> > > > >
> > > > > > > > > > >> >>> > > >> >> > > > > > On Mon, Mar 14, 2016 at 8:45
> PM,
> > > > Gwen
> > > > > > > > Shapira
> > > > > > > > > <
> > > > > > > > > > >> >>> > > >> g...@confluent.io <javascript:;>
> > > > > > > > > > >> >>> > > >> >> >
> > > > > > > > > > >> >>> > > >> >> > > > wrote:
> > > > > > > > > > >> >>> > > >> >> > > > > > >
> > > > > > > > > > >> >>> > > >> >> > > > > > > > I don't see how it helps.
> If
> > > the
> > > > > > > client
> > > > > > > > is
> > > > > > > > > > >> >>> > > communicating
> > > > > > > > > > >> >>> > > >> >> with a
> > > > > > > > > > >> >>> > > >> >> > > > > broker
> > > > > > > > > > >> >>> > > >> >> > > > > > > that
> > > > > > > > > > >> >>> > > >> >> > > > > > > > does not support KIP-35,
> > that
> > > > > broker
> > > > > > > > will
> > > > > > > > > > >> simply
> > > > > > > > > > >> >>> > close
> > > > > > > > > > >> >>> > > the
> > > > > > > > > > >> >>> > > >> >> > > > > connection.
> > > > > > > > > > >> >>> > > >> >> > > > > > If
> > > > > > > > > > >> >>> > > >> >> > > > > > > > the broker supports
> KIP-35,
> > > then
> > > > > it
> > > > > > > will
> > > > > > > > > > >> provide
> > > > > > > > > > >> >>> the
> > > > > > > > > > >> >>> > > >> broker
> > > > > > > > > > >> >>> > > >> >> > > > version.
> > > > > > > > > > >> >>> > > >> >> > > > > I
> > > > > > > > > > >> >>> > > >> >> > > > > > > > don't envisage a scenario
> > > where
> > > > a
> > > > > > > broker
> > > > > > > > > > does
> > > > > > > > > > >> not
> > > > > > > > > > >> >>> > > support
> > > > > > > > > > >> >>> > > >> >> > KIP-35,
> > > > > > > > > > >> >>> > > >> >> > > > but
> > > > > > > > > > >> >>> > > >> >> > > > > > > > implements the new
> behaviour
> > > of
> > > > > > > sending
> > > > > > > > an
> > > > > > > > > > >> empty
> > > > > > > > > > >> >>> > > >> response. Do
> > > > > > > > > > >> >>> > > >> >> > > you?
> > > > > > > > > > >> >>> > > >> >> > > > > > > >
> > > > > > > > > > >> >>> > > >> >> > > > > > > > Are you sure about that?
> Per
> > > > > KIP-35,
> > > > > > > the
> > > > > > > > > > broker
> > > > > > > > > > >> >>> > > supplies
> > > > > > > > > > >> >>> > > >> the
> > > > > > > > > > >> >>> > > >> >> > > > version
> > > > > > > > > > >> >>> > > >> >> > > > > in
> > > > > > > > > > >> >>> > > >> >> > > > > > > response to Metadata
> request,
> > > not
> > > > in
> > > > > > > > > response
> > > > > > > > > > to
> > > > > > > > > > >> >>> > anything
> > > > > > > > > > >> >>> > > >> else.
> > > > > > > > > > >> >>> > > >> >> > > > > > > If the client sends producer
> > > > request
> > > > > > > > version
> > > > > > > > > > 42
> > > > > > > > > > >> >>> > > >> (accidentally
> > > > > > > > > > >> >>> > > >> >> or
> > > > > > > > > > >> >>> > > >> >> > > due
> > > > > > > > > > >> >>> > > >> >> > > > to
> > > > > > > > > > >> >>> > > >> >> > > > > > > premature upgrade) to
> > > > > > KIP-35-compactible
> > > > > > > > > > broker
> > > > > > > > > > >> - we
> > > > > > > > > > >> >>> > > want to
> > > > > > > > > > >> >>> > > >> >> see
> > > > > > > > > > >> >>> > > >> >> > an
> > > > > > > > > > >> >>> > > >> >> > > > > empty
> > > > > > > > > > >> >>> > > >> >> > > > > > > packet and not a connection
> > > close.
> > > > > > > > > > >> >>> > > >> >> > > > > > > Sending a broker version was
> > > > deemed
> > > > > > > > > > impractical
> > > > > > > > > > >> >>> IIRC.
> > > > > > > > > > >> >>> > > >> >> > > > > > >
> > > > > > > > > > >> >>> > > >> >> > > > > >
> > > > > > > > > > >> >>> > > >> >> > > > > > OK, so this is a different
> case
> > > than
> > > > > the
> > > > > > > one
> > > > > > > > > > Ashish
> > > > > > > > > > >> >>> > > described
> > > > > > > > > > >> >>> > > >> >> > > ("client
> > > > > > > > > > >> >>> > > >> >> > > > > that
> > > > > > > > > > >> >>> > > >> >> > > > > > wants to support broker
> versions
> > > > that
> > > > > do
> > > > > > > not
> > > > > > > > > > >> provide
> > > > > > > > > > >> >>> > broker
> > > > > > > > > > >> >>> > > >> >> version
> > > > > > > > > > >> >>> > > >> >> > > in
> > > > > > > > > > >> >>> > > >> >> > > > > > metadata and broker versions
> > that
> > > > > > provides
> > > > > > > > > > version
> > > > > > > > > > >> >>> info
> > > > > > > > > > >> >>> > in
> > > > > > > > > > >> >>> > > >> >> > > metadata").
> > > > > > > > > > >> >>> > > >> >> > > > > So,
> > > > > > > > > > >> >>> > > >> >> > > > > > you are suggesting that if a
> > > client
> > > > is
> > > > > > > > > > >> communicating
> > > > > > > > > > >> >>> > with a
> > > > > > > > > > >> >>> > > >> >> broker
> > > > > > > > > > >> >>> > > >> >> > > that
> > > > > > > > > > >> >>> > > >> >> > > > > > implements KIP-35 and it
> > receives
> > > an
> > > > > > empty
> > > > > > > > > > >> response,
> > > > > > > > > > >> >>> it
> > > > > > > > > > >> >>> > > will
> > > > > > > > > > >> >>> > > >> >> assume
> > > > > > > > > > >> >>> > > >> >> > > > that
> > > > > > > > > > >> >>> > > >> >> > > > > > the broker doesn't support the
> > > > request
> > > > > > > > version
> > > > > > > > > > and
> > > > > > > > > > >> it
> > > > > > > > > > >> >>> > won't
> > > > > > > > > > >> >>> > > >> try
> > > > > > > > > > >> >>> > > >> >> to
> > > > > > > > > > >> >>> > > >> >> > > > parse
> > > > > > > > > > >> >>> > > >> >> > > > > > the response? I think it would
> > be
> > > > good
> > > > > > to
> > > > > > > > > > explain
> > > > > > > > > > >> this
> > > > > > > > > > >> >>> > > kind of
> > > > > > > > > > >> >>> > > >> >> > thing
> > > > > > > > > > >> >>> > > >> >> > > in
> > > > > > > > > > >> >>> > > >> >> > > > > > detail in the KIP.
> > > > > > > > > > >> >>> > > >> >> > > > > >
> > > > > > > > > > >> >>> > > >> >> > > > > Actually even in this case and
> the
> > > > case
> > > > > I
> > > > > > > > > > mentioned,
> > > > > > > > > > >> >>> > closing
> > > > > > > > > > >> >>> > > >> >> > connection
> > > > > > > > > > >> >>> > > >> >> > > > > should be fine. Lets think about
> > > > > possible
> > > > > > > > > reasons
> > > > > > > > > > >> that
> > > > > > > > > > >> >>> > could
> > > > > > > > > > >> >>> > > >> lead
> > > > > > > > > > >> >>> > > >> >> to
> > > > > > > > > > >> >>> > > >> >> > > this
> > > > > > > > > > >> >>> > > >> >> > > > > issue.
> > > > > > > > > > >> >>> > > >> >> > > > >
> > > > > > > > > > >> >>> > > >> >> > > > > 1. Client has incorrect mapping
> of
> > > > > > supported
> > > > > > > > > > >> protocols
> > > > > > > > > > >> >>> for
> > > > > > > > > > >> >>> > a
> > > > > > > > > > >> >>> > > >> broker
> > > > > > > > > > >> >>> > > >> >> > > > > version.
> > > > > > > > > > >> >>> > > >> >> > > > > 2. Client misread broker version
> > > from
> > > > > > > metadata
> > > > > > > > > > >> response.
> > > > > > > > > > >> >>> > > >> >> > > > > 3. Client constructed
> unsupported
> > > > > protocol
> > > > > > > > > > version by
> > > > > > > > > > >> >>> > > mistake.
> > > > > > > > > > >> >>> > > >> >> > > > >
> > > > > > > > > > >> >>> > > >> >> > > > > In all the above cases
> > irrespective
> > > of
> > > > > > what
> > > > > > > > > broker
> > > > > > > > > > >> does,
> > > > > > > > > > >> >>> > > client
> > > > > > > > > > >> >>> > > >> >> will
> > > > > > > > > > >> >>> > > >> >> > > keep
> > > > > > > > > > >> >>> > > >> >> > > > > sending wrong request version.
> > > > > > > > > > >> >>> > > >> >> > > > >
> > > > > > > > > > >> >>> > > >> >> > > > > At this point, I think sending
> an
> > > > empty
> > > > > > > packet
> > > > > > > > > > >> instead
> > > > > > > > > > >> >>> of
> > > > > > > > > > >> >>> > > >> closing
> > > > > > > > > > >> >>> > > >> >> > > > > connection is a nice to have and
> > not
> > > > > > > mandatory
> > > > > > > > > > >> >>> requirement.
> > > > > > > > > > >> >>> > > >> Like in
> > > > > > > > > > >> >>> > > >> >> > the
> > > > > > > > > > >> >>> > > >> >> > > > > above case, a client can catch
> > > parsing
> > > > > > error
> > > > > > > > and
> > > > > > > > > > be
> > > > > > > > > > >> sure
> > > > > > > > > > >> >>> > that
> > > > > > > > > > >> >>> > > >> there
> > > > > > > > > > >> >>> > > >> >> > is
> > > > > > > > > > >> >>> > > >> >> > > > > something wrong in the protocol
> > > > version
> > > > > it
> > > > > > > is
> > > > > > > > > > >> sending.
> > > > > > > > > > >> >>> > > However,
> > > > > > > > > > >> >>> > > >> a
> > > > > > > > > > >> >>> > > >> >> > > generic
> > > > > > > > > > >> >>> > > >> >> > > > > connection close does not really
> > > > provide
> > > > > > any
> > > > > > > > > > >> >>> information on
> > > > > > > > > > >> >>> > > >> >> probable
> > > > > > > > > > >> >>> > > >> >> > > > cause.
> > > > > > > > > > >> >>> > > >> >> > > > >
> > > > > > > > > > >> >>> > > >> >> > > > > What do you guys suggest?
> > > > > > > > > > >> >>> > > >> >> > > > >
> > > > > > > > > > >> >>> > > >> >> > > > > >
> > > > > > > > > > >> >>> > > >> >> > > > > > Ismael
> > > > > > > > > > >> >>> > > >> >> > > > > >
> > > > > > > > > > >> >>> > > >> >> > > > >
> > > > > > > > > > >> >>> > > >> >> > > > >
> > > > > > > > > > >> >>> > > >> >> > > > >
> > > > > > > > > > >> >>> > > >> >> > > > > --
> > > > > > > > > > >> >>> > > >> >> > > > >
> > > > > > > > > > >> >>> > > >> >> > > > > Regards,
> > > > > > > > > > >> >>> > > >> >> > > > > Ashish
> > > > > > > > > > >> >>> > > >> >> > > > >
> > > > > > > > > > >> >>> > > >> >> > > >
> > > > > > > > > > >> >>> > > >> >> > >
> > > > > > > > > > >> >>> > > >> >> > >
> > > > > > > > > > >> >>> > > >> >> > >
> > > > > > > > > > >> >>> > > >> >> > > --
> > > > > > > > > > >> >>> > > >> >> > >
> > > > > > > > > > >> >>> > > >> >> > > Regards,
> > > > > > > > > > >> >>> > > >> >> > > Ashish
> > > > > > > > > > >> >>> > > >> >> > >
> > > > > > > > > > >> >>> > > >> >> >
> > > > > > > > > > >> >>> > > >> >>
> > > > > > > > > > >> >>> > > >>
> > > > > > > > > > >> >>> > >
> > > > > > > > > > >> >>> >
> > > > > > > > > > >> >>>
> > > > > > > > > > >> >>>
> > > > > > > > > > >> >>>
> > > > > > > > > > >> >>> --
> > > > > > > > > > >> >>> Thanks,
> > > > > > > > > > >> >>> Ewen
> > > > > > > > > > >> >>>
> > > > > > > > > > >> >>
> > > > > > > > > > >> >>
> > > > > > > > > > >> >>
> > > > > > > > > > >> >> --
> > > > > > > > > > >> >>
> > > > > > > > > > >> >> Regards,
> > > > > > > > > > >> >> Ashish
> > > > > > > > > > >> >>
> > > > > > > > > > >> >
> > > > > > > > > > >> >
> > > > > > > > > > >> >
> > > > > > > > > > >> > --
> > > > > > > > > > >> >
> > > > > > > > > > >> > Regards,
> > > > > > > > > > >> > Ashish
> > > > > > > > > > >>
> > > > > > > > > >
> > > > > > > > >
> > > > > > > > >
> > > > > > > > > --
> > > > > > > > > Ashish 🎤h
> > > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > > > --
> > > > > > > >
> > > > > > > > Regards,
> > > > > > > > Ashish
> > > > > > > >
> > > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > > > > --
> > > > > > Thanks,
> > > > > > Ewen
> > > > > >
> > > > >
> > > >
> > >
> >
>

Reply via email to