@Magnus, Does the latest suggestion sound OK to you. I am planning to update PR based on latest suggestion.
On Mon, Mar 7, 2016 at 10:58 AM, Ashish Singh <asi...@cloudera.com> wrote: > > > On Fri, Mar 4, 2016 at 5:46 PM, Jay Kreps <j...@confluent.io> wrote: > >> Hey Ashish, >> >> Both good points. >> >> I think the issue with the general metadata request is the same as the >> issue with a version-specific metadata request from the other >> proposal--basically it's a chicken and egg problem, to find out anything >> about the cluster you have to be able to communicate something in a format >> the server can understand without knowing a priori what version it's on. I >> guess the question is how can you continue to evolve the metadata request >> (whether it is the existing metadata or a protocol-version specific >> metadata request) given that you need this information to bootstrap you >> have to be more careful in how that request evolves. >> > You are correct. It's just that protocol version request would be very > specific to retrieve the protocol versions. Changes to protocol version > request itself should be very rare, if at all. However, the general > metadata request carries a lot more information and its format is more > probable to evolve. This boils down to higher probability of change vs a > definite network round-trip for each re/connect. It does sound like, it is > better to avoid a definite penalty than to avoid a probable rare issue. > >> >> I think deprecation/removal may be okay. Ultimately clients will always >> use >> the highest possible version of the protocol the server supports so if >> we've already deprecated and removed your highest version then you are >> screwed and you're going to get an error no matter what, right? Basically >> there is nothing dynamic you can do in that case. >> > Sure, this should be expected. Just wanted to make sure deprecation is > still on the table. > >> >> -Jay >> >> On Fri, Mar 4, 2016 at 4:05 PM, Ashish Singh <asi...@cloudera.com> wrote: >> >> > Hello Jay, >> > >> > The overall approach sounds good. I do realize that this discussion has >> > gotten too lengthy and is starting to shoot tangents. Maybe a KIP call >> will >> > help us getting to a decision faster. I do have a few questions though. >> > >> > On Fri, Mar 4, 2016 at 9:52 AM, Jay Kreps <j...@confluent.io> wrote: >> > >> > > Yeah here is my summary of my take: >> > > >> > > 1. Negotiating a per-connection protocol actually does add a lot of >> > > complexity to clients (many more failure states to get right). >> > > >> > > 2. Having the client configure the protocol version manually is doable >> > now >> > > but probably a worse state. I suspect this will lead to more not less >> > > confusion. >> > > >> > > 3. I don't think the current state is actually that bad. Integrators >> > pick a >> > > conservative version and build against that. There is a tradeoff >> between >> > > getting the new features and being compatible with old Kafka versions. >> > But >> > > a large part of this tradeoff is essential since new features aren't >> > going >> > > to magically appear on old servers, so even if you upgrade your client >> > you >> > > likely aren't going to get the new stuff (since we will end up >> > dynamically >> > > turning it off). Having client features that are there but don't work >> > > because you're on an old cluster may actually be a worse experience if >> > not >> > > handled very carefully.. >> > > >> > > 4. The problems Dana brought up are totally orthogonal to the problem >> of >> > > having per-api versions or overall versions. The problem was that we >> > > changed behavior subtly without changing the version. This will be an >> > issue >> > > regardless of whether the version is global or not. >> > > >> > > 5. Using the broker release as the version is strictly worse than >> using a >> > > global protocol version (0, 1, 2, ...) that increments any time any >> api >> > > changes but doesn't increment just because non-protocol code is >> changed. >> > > The problem with using the broker release version is we want to be >> able >> > to >> > > keep Kafka releasable from any commit which means there isn't as >> clear a >> > > sequencing of releases as you would think. >> > > >> > > 6. We need to consider the case of mixed version clusters during the >> time >> > > period when you are upgrading Kafka. >> > > >> > > So overall I think this is not a critical thing to do right now, but >> if >> > we >> > > are going to do it we should do it in a way that actually improves >> > things. >> > > >> > > Here would be one proposal for that: >> > > a. Add a global protocol version that increments with any api version >> > > update. Move the documentation so that the docs are by version. This >> is >> > > basically just a short-hand for a complete set of supported api >> versions. >> > > b. Include a field in the metadata response for each broker that adds >> the >> > > protocol version. >> > > >> > There might be an issue here where the metadata request version sent by >> > client is not supported by broker, an older broker. However, if we are >> > clearly stating that a client is not guaranteed to work with an older >> > broker then this becomes expected. This will potentially limit us in >> terms >> > of supporting downgrades though, if we ever want to. >> > >> > > c. To maintain the protocol version this information will have to get >> > > propagated with the rest of the broker metadata like host, port, id, >> etc. >> > > >> > > The instructions to clients would be: >> > > - By default you build against a single conservative Kafka protocol >> > version >> > > and we carry that support forward, as today >> > > >> > If I am getting this correct, this will mean we will never >> deprecate/remove >> > any protocol version in future. Having some way to deprecate/remove >> older >> > protocol versions will probably be a good idea. It is possible with the >> > global protocol version approach, it could be as simple as marking a >> > protocol deprecated in protocol doc before removing it. Just want to >> make >> > sure deprecation is still on the table. >> > >> > > - If you want to get fancy you can use the protocol version field in >> the >> > > metadata request to more dynamically chose what features are available >> > and >> > > select api versions appropriately. This is purely optional. >> > > >> > > -Jay >> > > >> > > On Thu, Mar 3, 2016 at 9:38 PM, Jason Gustafson <ja...@confluent.io> >> > > wrote: >> > > >> > > > I talked with Jay about this KIP briefly this morning, so let me >> try to >> > > > summarize the discussion (I'm sure he'll jump in if I get anything >> > > wrong). >> > > > Apologies in advance for the length. >> > > > >> > > > I think we both share some skepticism that a request with all the >> > > supported >> > > > versions of all the request APIs is going to be a useful primitive >> to >> > try >> > > > and build client compatibility around. In practice I think people >> would >> > > end >> > > > up checking for particular request versions in order to determine if >> > the >> > > > broker is 0.8 or 0.9 or whatever, and then change behavior >> accordingly. >> > > I'm >> > > > wondering if there's a reasonable way to handle the version >> responses >> > > that >> > > > doesn't amount to that. 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. >> > > > >> > > > The alternative is to use a single API version. It could be the >> Kafka >> > > > release version, but then you need to figure out how to handle users >> > who >> > > > are running off of trunk since multiple API versions will typically >> > > change >> > > > between releases. Perhaps it makes more sense to keep a separate API >> > > > version number which is incremented every time any one of the API >> > > versions >> > > > increases? This also decouples the protocol from the Kafka >> > distribution. >> > > > >> > > > As far as whether there should be a separate request or not, I get >> > > Becket's >> > > > point that you would only need to do the version check once when a >> > > > connection is established, but another round trip still complicates >> the >> > > > picture quite a bit. Before you just need to send a metadata >> request to >> > > > bootstrap yourself to the cluster, but now you need to do version >> > > > negotiation before you can even do that, and then you need to try >> adapt >> > > to >> > > > the versions reported. Jay brought up the point that you probably >> > > wouldn't >> > > > design a protocol from scratch to work this way. Using the metadata >> > > request >> > > > would be better if it's possible, but you need a way to handle the >> fact >> > > > that a broker's version might be stale by the time you connect to >> it. >> > And >> > > > even then you're going to have to deal internally with the >> complexity >> > > > involved in trying to upgrade/downgrade dynamically, which sounds >> to me >> > > > like it would have a ton of edge cases. >> > > > >> > > > Taking a bit of a step back, any solution is probably going to be >> > painful >> > > > since the Kafka protocol was not designed for this use case. >> Currently >> > > what >> > > > that means for clients that /want/ to support compatibility across >> > broker >> > > > versions is that they need to have the user tell them the broker >> > version >> > > > through configuration (e.g. librdkafka has a "protocol.version" >> field >> > for >> > > > this purpose). The only real problem with this in my mind is that we >> > > don't >> > > > have a graceful way to detect request incompatibility, which is why >> > there >> > > > are so many questions on the user list which basically amount to the >> > > client >> > > > hanging because the broker refuses to respond to a request it >> doesn't >> > > > understand. If you solve this problem, then depending on >> configuration >> > > > seems totally reasonable and we can skip trying to implement request >> > > > version negotiation. Magnus's solution in this KIP may seem a little >> > > hacky, >> > > > but it also seems like the only way to do it without changing the >> > header. >> > > > >> > > > The Spark problem mentioned above is interesting and I agree that it >> > > sucks >> > > > for frameworks that need to ship the kafka client library since they >> > have >> > > > to figure out how to bundle multiple versions. Ultimately if we >> want to >> > > > solve this problem, then it sounds like we need to commit to >> > maintaining >> > > > compatibility with older versions of Kafka in the client going >> forward. >> > > > That's a lot bigger decision and it matters less whether the broker >> > > version >> > > > is found through configuration, topic metadata, or a new request >> type. >> > > > >> > > > -Jason >> > > > >> > > > >> > > > On Thu, Mar 3, 2016 at 3:59 PM, Becket Qin <becket....@gmail.com> >> > wrote: >> > > > >> > > > > Hi Ashish, >> > > > > >> > > > > In approach (1), the clients will still be able to talked to >> multiple >> > > > > versions of Kafka brokers as long as the clients version is not >> > higher >> > > > than >> > > > > the broker version, right? >> > > > > >> > > > > From Spark's point of view, it seems the difference is whether >> Spark >> > > can >> > > > > independently update their Kafka clients dependency or not. More >> > > > > specifically, consider the following three scenarios: >> > > > > A. Spark has some new features that do not rely on clients or >> brokers >> > > in >> > > > a >> > > > > new Kafka release. >> > > > > B. Spark has some new features that only rely on the clients in a >> new >> > > > Kafka >> > > > > release, but not rely on the brokers in a new Kafka release. e.g. >> New >> > > > > client provides a listTopic() method. >> > > > > C. Spark has some new features that rely on both the clients and >> > > brokers >> > > > in >> > > > > a new Kafka release. e.g timestamp field. >> > > > > >> > > > > For A, Spark does not need to update the Kafka dependency because >> > there >> > > > is >> > > > > no need and the old clients can talk to both new and old Kafka >> > brokers. >> > > > > For C, Spark has to wait for broker upgrade anyways. >> > > > > So in the above two scenarios, there is not much difference >> between >> > > > > approach (1) and (2). >> > > > > >> > > > > B is a tricky scenario. Because it is possible that we introduce >> both >> > > > > listTopic() and the timestamp field in the same Kafka release, >> and we >> > > > don't >> > > > > know if Spark needs both or only uses listTopic(). >> > > > > This indicates the client should work fine if a method is >> supported >> > and >> > > > > should throw exception when a method is not supported. I think we >> can >> > > do >> > > > > the following: >> > > > > 0. Clients always use its highest request version. The clients >> keeps >> > a >> > > > > static final map recording the minimum required ApiVersion for >> each >> > > > > request. >> > > > > 1. When connect to a broker, the clients always send an >> > > ApiVersionRequest >> > > > > to the broker. >> > > > > 2. The broker replies with the its highest supported ApiVersion. >> > > > > 3. Before sending a request, the clients checks the minimum >> required >> > > > > ApiVersion for that request. If the broker returned ApiVersion is >> > > higher >> > > > > than this minimum required ApiVersion, then we can proceed. >> Otherwise >> > > we >> > > > > throw something like NotSupportedOperationException. >> > > > > >> > > > > With this approach, scenario B will also work unless Spark calls >> some >> > > > > function that is not supported by the Kafka broker, which makes it >> > > become >> > > > > scenario C. >> > > > > >> > > > > Thoughts? >> > > > > >> > > > > Thanks, >> > > > > >> > > > > Jiangjie (Becket) Qin >> > > > > >> > > > > On Thu, Mar 3, 2016 at 11:24 AM, Ashish Singh < >> asi...@cloudera.com> >> > > > wrote: >> > > > > >> > > > > > On Wed, Mar 2, 2016 at 8:29 PM, Becket Qin < >> becket....@gmail.com> >> > > > wrote: >> > > > > > >> > > > > > > Hi Jason, >> > > > > > > >> > > > > > > I was thinking that every time when we connect to a broker, we >> > > first >> > > > > send >> > > > > > > the version check request. (The version check request itself >> > should >> > > > be >> > > > > > very >> > > > > > > simple and never changes across all server releases.) This >> does >> > add >> > > > an >> > > > > > > additional round trip, but given reconnect is rare, it is >> > probably >> > > > > fine. >> > > > > > On >> > > > > > > the client side, the client will always send request using the >> > > lowest >> > > > > > > supported version across all brokers. That means if a Kafka >> > cluster >> > > > is >> > > > > > > downgrading, we will use the downgraded protocol as soon as >> the >> > > > client >> > > > > > > connected to an older broker. >> > > > > > > >> > > > > > This sounds interesting and very similar to current suggestion. >> > > > However, >> > > > > > just to make sure I am getting it right, you are suggesting >> send a >> > > > > separate >> > > > > > request only for release version? >> > > > > > >> > > > > > > >> > > > > > > @Ashish, >> > > > > > > Can you help me understand the pain points from other open >> source >> > > > > > projects >> > > > > > > that you mentioned a little more? There are two different >> levels >> > of >> > > > > > > requirements: >> > > > > > > 1. User wants to know if the client is compatible with the >> broker >> > > or >> > > > > not. >> > > > > > > 2. User wants the client and the broker to negotiate the >> protocol >> > > on >> > > > > > their >> > > > > > > own. >> > > > > > > >> > > > > > Not sure which category it falls in, but below is the excerpt >> from >> > > > Mark, >> > > > > a >> > > > > > spark dev, who has been trying to upgrade spark kafka >> integration >> > to >> > > > use >> > > > > > 0.9 clients. >> > > > > > >> > > > > > Based on what I understand, users of Kafka need to upgrade their >> > > > brokers >> > > > > to >> > > > > > Kafka 0.9.x first, before they upgrade their clients to Kafka >> > 0.9.x. >> > > > > > >> > > > > > > However, that presents a problem to other projects that >> integrate >> > > > with >> > > > > > Kafka (Spark, Flume, Storm, etc.). From here on, I will speak >> for >> > > > Spark + >> > > > > > Kafka, since that's the one I am most familiar with. >> > > > > > In the light of compatibility (or the lack thereof) between >> 0.8.x >> > and >> > > > > > 0.9.x, Spark is faced with a problem of what version(s) of >> Kafka to >> > > be >> > > > > > compatible with, and has 2 options (discussed in this PR >> > > > > > <https://github.com/apache/spark/pull/11143>): >> > > > > > 1. We either upgrade to Kafka 0.9, dropping support for 0.8. >> Storm >> > > and >> > > > > > Flume are already on this path. >> > > > > > 2. We introduce complexity in our code to support both 0.8 and >> 0.9 >> > > for >> > > > > the >> > > > > > entire duration of our next major release (Apache Spark 2.x). >> > > > > > I'd love to hear your thoughts on which option, you recommend. >> > > > > > Long term, I'd really appreciate if Kafka could do something >> that >> > > > doesn't >> > > > > > make Spark having to support two, or even more versions of >> Kafka. >> > > And, >> > > > if >> > > > > > there is something that I, personally, and Spark project can do >> in >> > > your >> > > > > > next release candidate phase to make things easier, please do >> let >> > us >> > > > > know. >> > > > > > >> > > > > > This issue has made other projects worry about how they are >> going >> > to >> > > > keep >> > > > > > up with Kafka releases. Last I heard, take this with a pinch of >> > salt, >> > > > > Spark >> > > > > > folks are discussing about using Maven profiles to build against >> > > > multiple >> > > > > > Kafka versions at compile time, etc. Also, there are clients who >> > are >> > > > > > relying on class-loading tricks with custom implementation of >> OSGi >> > to >> > > > > solve >> > > > > > such issues. Don't quote me on the stuff I just mentioned, as >> this >> > is >> > > > > what >> > > > > > I have heard during casual discussions. The point I am trying to >> > make >> > > > is >> > > > > > that Kafka clients are worried about being able to support >> multiple >> > > > Kafka >> > > > > > broker versions. I am sure we all agree on that. >> > > > > > >> > > > > > I think the second requirement makes more sense from a client >> > > > > perspective. >> > > > > > First req will just tell them that there is a problem, but no >> way >> > to >> > > > work >> > > > > > around it. >> > > > > > >> > > > > > > >> > > > > > > Currently in Kafka the principle we are following is to let >> > clients >> > > > > stick >> > > > > > > to a certain version and server will adapt to the clients >> > > > accordingly. >> > > > > > > If this KIP doesn't want to break this rule, it seems we >> should >> > > > simply >> > > > > > let >> > > > > > > the clients send the ApiVersion it is using to the brokers and >> > the >> > > > > > brokers >> > > > > > > will decide whether to accept or reject the clients. This >> means >> > > user >> > > > > have >> > > > > > > to upgrade broker before they upgrade clients. This satisfies >> (1) >> > > so >> > > > > > that a >> > > > > > > newer client will know it does not compatible with an older >> > server >> > > > > > > immediately. >> > > > > > > If this KIP will change that to let the newer clients adapt to >> > the >> > > > > older >> > > > > > > brokers, compatibility wise it is a good thing to have. With >> > this >> > > > now >> > > > > > > users are able to upgrade clients before they upgrade Kafka >> > > brokers. >> > > > > This >> > > > > > > means user can upgrade clients even before upgrade servers. >> This >> > > > > > satisfies >> > > > > > > (2) as the newer clients can also talk to the older servers. >> > > > > > > >> > > > > > More importantly, this will allow a client to talk to multiple >> > > versions >> > > > > of >> > > > > > Kafka. >> > > > > >> > > > > >> > > > > > > >> > > > > > > If we decide to go with (2). The benefit is that a newer >> client >> > > won't >> > > > > > break >> > > > > > > when talking to an older broker. But functionality wise, it >> might >> > > be >> > > > > the >> > > > > > > same as an older clients. >> > > > > > > In the downgrading case, we probably still have to notify all >> the >> > > > > users. >> > > > > > > For example, if application is sending messages with timestamp >> > and >> > > > the >> > > > > > > broker got downgraded to an older version that does not >> support >> > > > > > timestamp. >> > > > > > > The clients will suddenly start to throw away timestamps. This >> > > might >> > > > > > affect >> > > > > > > the application logic. In this case even if we have clients >> > > > > automatically >> > > > > > > adapted to a lower version broker, the applications might >> still >> > > > break. >> > > > > > > Hence we still need to notify the users about the case when >> the >> > > > clients >> > > > > > is >> > > > > > > newer than the brokers. This is the same for both (1) and (2). >> > > > > > > Supporting (2) will introduce more complication on the client >> > side. >> > > > And >> > > > > > we >> > > > > > > may also have to communicate with users about what function is >> > > > > supported >> > > > > > in >> > > > > > > the new clients and what is not supported after the protocol >> > > > > negotiation >> > > > > > > finishes. >> > > > > > > >> > > > > > Totally agreed, however only if clients want to support multiple >> > > broker >> > > > > > versions. If they want to, then I am sure they are willing to >> add >> > > some >> > > > > > logic on their end. >> > > > > > >> > > > > > > >> > > > > > > Thanks, >> > > > > > > >> > > > > > > Jiangjie (Becket) Qin >> > > > > > > >> > > > > > > >> > > > > > > >> > > > > > > >> > > > > > > On Wed, Mar 2, 2016 at 5:58 PM, Dana Powers < >> > dana.pow...@gmail.com >> > > > >> > > > > > wrote: >> > > > > > > >> > > > > > > > In kafka-python we've been doing something like: >> > > > > > > > >> > > > > > > > if version >= (0, 9): >> > > > > > > > Do cool new stuff >> > > > > > > > elif version >= (0, 8, 2): >> > > > > > > > Do some older stuff >> > > > > > > > .... >> > > > > > > > else: >> > > > > > > > raise UnsupportedVersionError >> > > > > > > > >> > > > > > > > This will break if / when the new 0.9 apis are completely >> > removed >> > > > > from >> > > > > > > some >> > > > > > > > future release, but should handle intermediate broker >> upgrades. >> > > > > Because >> > > > > > > we >> > > > > > > > can't add support for future apis a priori, I think the >> best we >> > > > could >> > > > > > do >> > > > > > > > here is throw an error that request protocol version X is >> not >> > > > > > supported. >> > > > > > > > For now that comes through as a broken socket connection, so >> > > there >> > > > is >> > > > > > an >> > > > > > > > error - just not a super helpful one. >> > > > > > > > >> > > > > > > > For that reason I'm also in favor of a generic error >> response >> > > when >> > > > a >> > > > > > > > protocol req is not recognized. >> > > > > > > > >> > > > > > > > -Dana >> > > > > > > > On Mar 2, 2016 5:38 PM, "Jay Kreps" <j...@confluent.io> >> wrote: >> > > > > > > > >> > > > > > > > > But won't it be the case that what clients end up doing >> would >> > > be >> > > > > > > > something >> > > > > > > > > like >> > > > > > > > > if(version != 0.8.1) >> > > > > > > > > throw new UnsupportedVersionException() >> > > > > > > > > which then means the client is broken as soon as we >> release a >> > > new >> > > > > > > server >> > > > > > > > > version even though the protocol didn't change. I'm >> actually >> > > not >> > > > > sure >> > > > > > > how >> > > > > > > > > you could use that information in a forward compatible way >> > > since >> > > > > you >> > > > > > > > can't >> > > > > > > > > know a priori if you will work with the next release until >> > you >> > > > know >> > > > > > if >> > > > > > > > the >> > > > > > > > > protocol changed. >> > > > > > > > > >> > > > > > > > > -Jay >> > > > > > > > > >> > > > > > > > > On Wed, Mar 2, 2016 at 5:28 PM, Jason Gustafson < >> > > > > ja...@confluent.io> >> > > > > > > > > wrote: >> > > > > > > > > >> > > > > > > > > > Hey Jay, >> > > > > > > > > > >> > > > > > > > > > Yeah, I wasn't suggesting that we eliminate request API >> > > > versions. >> > > > > > > > They're >> > > > > > > > > > definitely needed on the broker to support >> compatibility. I >> > > was >> > > > > > just >> > > > > > > > > saying >> > > > > > > > > > that if a client wants to support multiple broker >> versions >> > > > (e.g. >> > > > > > 0.8 >> > > > > > > > and >> > > > > > > > > > 0.9), then it makes more sense to me to make the kafka >> > > release >> > > > > > > version >> > > > > > > > > > available in order to determine which version of the >> > request >> > > > API >> > > > > > > should >> > > > > > > > > be >> > > > > > > > > > used rather than adding a new request type which exposes >> > all >> > > of >> > > > > the >> > > > > > > > > > different supported versions for all of the request >> types. >> > > > > Request >> > > > > > > API >> > > > > > > > > > versions all change in lockstep with Kafka releases >> anyway. >> > > > > > > > > > >> > > > > > > > > > -Jason >> > > > > > > > > > >> > > > > > > > > > On Wed, Mar 2, 2016 at 5:15 PM, Becket Qin < >> > > > becket....@gmail.com >> > > > > > >> > > > > > > > wrote: >> > > > > > > > > > >> > > > > > > > > > > I think using Kafka release version makes sense. More >> > > > > > particularly, >> > > > > > > > we >> > > > > > > > > > can >> > > > > > > > > > > use the ApiVersion and this will cover all the >> interval >> > > > version >> > > > > > as >> > > > > > > > > well. >> > > > > > > > > > In >> > > > > > > > > > > KAFKA-3025, we added the ApiVersion to message format >> > > version >> > > > > > > > mapping, >> > > > > > > > > We >> > > > > > > > > > > can add the ApiKey to version mapping to ApiVersion as >> > > well. >> > > > We >> > > > > > can >> > > > > > > > > move >> > > > > > > > > > > ApiVersion class to o.a.k.c package and use it for >> both >> > > > server >> > > > > > and >> > > > > > > > > > clients. >> > > > > > > > > > > >> > > > > > > > > > > @Jason, if we cache the release info in metadata and >> not >> > > > > > > re-validate >> > > > > > > > > the >> > > > > > > > > > > release on reconnect, would it still work if we do a >> > > rolling >> > > > > > > > downgrade? >> > > > > > > > > > > >> > > > > > > > > > > On Wed, Mar 2, 2016 at 3:16 PM, Jason Gustafson < >> > > > > > > ja...@confluent.io> >> > > > > > > > > > > wrote: >> > > > > > > > > > > >> > > > > > > > > > > > I think Dana's suggestion to include the Kafka >> release >> > > > > version >> > > > > > > > makes >> > > > > > > > > a >> > > > > > > > > > > lot >> > > > > > > > > > > > of sense. I'm actually wondering why you would need >> the >> > > > > > > individual >> > > > > > > > > API >> > > > > > > > > > > > versions if you have that? It sounds like keeping >> track >> > > of >> > > > > all >> > > > > > > the >> > > > > > > > > api >> > > > > > > > > > > > version information would add a lot of complexity to >> > > > clients >> > > > > > > since >> > > > > > > > > > > they'll >> > > > > > > > > > > > have to try to handle different version permutations >> > > which >> > > > > are >> > > > > > > not >> > > > > > > > > > > actually >> > > > > > > > > > > > possible in practice. Wouldn't it be simpler to know >> > that >> > > > > > you're >> > > > > > > > > > talking >> > > > > > > > > > > to >> > > > > > > > > > > > an 0.9 broker than that you're talking to a broker >> > which >> > > > > > supports >> > > > > > > > > > > version 2 >> > > > > > > > > > > > of the group coordinator request, version 1 of fetch >> > > > request, >> > > > > > > etc? >> > > > > > > > > > Also, >> > > > > > > > > > > > the release version could be included in the broker >> > > > > information >> > > > > > > in >> > > > > > > > > the >> > > > > > > > > > > > topic metadata request which would save the need for >> > the >> > > > > > > additional >> > > > > > > > > > round >> > > > > > > > > > > > trip on every reconnect. >> > > > > > > > > > > > >> > > > > > > > > > > > -Jason >> > > > > > > > > > > > >> > > > > > > > > > > > On Tue, Mar 1, 2016 at 7:59 PM, Ashish Singh < >> > > > > > > asi...@cloudera.com> >> > > > > > > > > > > wrote: >> > > > > > > > > > > > >> > > > > > > > > > > > > On Tue, Mar 1, 2016 at 6:30 PM, Gwen Shapira < >> > > > > > > g...@confluent.io> >> > > > > > > > > > > wrote: >> > > > > > > > > > > > > >> > > > > > > > > > > > > > One more thing, the KIP actually had 3 parts: >> > > > > > > > > > > > > > 1. The version protocol >> > > > > > > > > > > > > > 2. New response on messages of wrong API key or >> > wrong >> > > > > > version >> > > > > > > > > > > > > > 3. Protocol documentation >> > > > > > > > > > > > > > >> > > > > > > > > > > > > There is a WIP patch for adding protocol docs, >> > > > > > > > > > > > > https://github.com/apache/kafka/pull/970 . By >> > protocol >> > > > > > > > > > documentation, >> > > > > > > > > > > > you >> > > > > > > > > > > > > mean updating this, right? >> > > > > > > > > > > > > >> > > > > > > > > > > > > > >> > > > > > > > > > > > > > I understand that you are offering to only >> > implement >> > > > part >> > > > > > 1? >> > > > > > > > > > > > > > But the KIP discussion and vote should still >> cover >> > > all >> > > > > > three >> > > > > > > > > parts, >> > > > > > > > > > > > > > they will just be implemented in separate JIRA? >> > > > > > > > > > > > > > >> > > > > > > > > > > > > The patch for KAFKA-3307, >> > > > > > > > https://github.com/apache/kafka/pull/986 >> > > > > > > > > , >> > > > > > > > > > > > covers >> > > > > > > > > > > > > 1 and 2. KAFKA-3309 tracks documentation part. >> Yes, >> > we >> > > > > should >> > > > > > > > > include >> > > > > > > > > > > all >> > > > > > > > > > > > > the three points you mentioned while discussing or >> > > voting >> > > > > for >> > > > > > > > > KIP-35. >> > > > > > > > > > > > > >> > > > > > > > > > > > > > >> > > > > > > > > > > > > > On Tue, Mar 1, 2016 at 5:25 PM, Ashish Singh < >> > > > > > > > > asi...@cloudera.com> >> > > > > > > > > > > > > wrote: >> > > > > > > > > > > > > > > On Tue, Mar 1, 2016 at 5:11 PM, Gwen Shapira < >> > > > > > > > > g...@confluent.io> >> > > > > > > > > > > > > wrote: >> > > > > > > > > > > > > > > >> > > > > > > > > > > > > > >> I don't see a use for the name - clients >> should >> > be >> > > > > able >> > > > > > to >> > > > > > > > > > > translate >> > > > > > > > > > > > > > >> ApiKey to name for any API they support, and >> I'm >> > > not >> > > > > > sure >> > > > > > > > why >> > > > > > > > > > > would >> > > > > > > > > > > > a >> > > > > > > > > > > > > > >> client need to log anything about APIs it >> does >> > not >> > > > > > > support. >> > > > > > > > > Am I >> > > > > > > > > > > > > > >> missing something? >> > > > > > > > > > > > > > >> >> > > > > > > > > > > > > > > Yea, it is a fair assumption that client would >> > know >> > > > > about >> > > > > > > > APIs >> > > > > > > > > it >> > > > > > > > > > > > > > supports. >> > > > > > > > > > > > > > > It could have been helpful for client users to >> > see >> > > > new >> > > > > > APIs >> > > > > > > > > > though, >> > > > > > > > > > > > > > however >> > > > > > > > > > > > > > > users can always refer to protocol doc of new >> > > version >> > > > > to >> > > > > > > find >> > > > > > > > > > > > > > corresponding >> > > > > > > > > > > > > > > names of the new APIs. >> > > > > > > > > > > > > > > >> > > > > > > > > > > > > > >> >> > > > > > > > > > > > > > >> On a related note, Magnus is currently on >> > > vacation, >> > > > > but >> > > > > > he >> > > > > > > > > > should >> > > > > > > > > > > be >> > > > > > > > > > > > > > >> back at the end of next week. I'd like to >> hold >> > off >> > > > on >> > > > > > the >> > > > > > > > vote >> > > > > > > > > > > until >> > > > > > > > > > > > > > >> he gets back since his experience in >> > implementing >> > > > > > clients >> > > > > > > > and >> > > > > > > > > > his >> > > > > > > > > > > > > > >> opinions will be very valuable for this >> > > discussion. >> > > > > > > > > > > > > > >> >> > > > > > > > > > > > > > > That is great. It will be valuable to have his >> > > > > feedback. >> > > > > > I >> > > > > > > > will >> > > > > > > > > > > hold >> > > > > > > > > > > > > off >> > > > > > > > > > > > > > on >> > > > > > > > > > > > > > > removing "api_name" and >> "api_deprecated_versions" >> > > or >> > > > > > adding >> > > > > > > > > > release >> > > > > > > > > > > > > > version. >> > > > > > > > > > > > > > > >> > > > > > > > > > > > > > >> >> > > > > > > > > > > > > > >> Gwen >> > > > > > > > > > > > > > >> >> > > > > > > > > > > > > > >> On Tue, Mar 1, 2016 at 4:24 PM, Ashish Singh >> < >> > > > > > > > > > asi...@cloudera.com >> > > > > > > > > > > > >> > > > > > > > > > > > > > wrote: >> > > > > > > > > > > > > > >> > Works with me. I will update PR to remove >> > this. >> > > > > > > > > > > > > > >> > >> > > > > > > > > > > > > > >> > Also, "api_name" have been pointed out as a >> > > > concern. >> > > > > > > > > However, >> > > > > > > > > > it >> > > > > > > > > > > > can >> > > > > > > > > > > > > > be >> > > > > > > > > > > > > > >> > handy for logging and similar purposes. Any >> > take >> > > > on >> > > > > > > that? >> > > > > > > > > > > > > > >> > >> > > > > > > > > > > > > > >> > On Tue, Mar 1, 2016 at 3:46 PM, Gwen >> Shapira < >> > > > > > > > > > g...@confluent.io >> > > > > > > > > > > > >> > > > > > > > > > > > > > wrote: >> > > > > > > > > > > > > > >> > >> > > > > > > > > > > > > > >> >> Jay also mentioned: >> > > > > > > > > > > > > > >> >> "Or, alternately, since deprecation has no >> > > > > functional >> > > > > > > > > impact >> > > > > > > > > > > and >> > > > > > > > > > > > is >> > > > > > > > > > > > > > >> >> just a message >> > > > > > > > > > > > > > >> >> to developers, we could just leave it out >> of >> > > the >> > > > > > > protocol >> > > > > > > > > and >> > > > > > > > > > > > just >> > > > > > > > > > > > > > have >> > > > > > > > > > > > > > >> it >> > > > > > > > > > > > > > >> >> in release notes etc." >> > > > > > > > > > > > > > >> >> >> > > > > > > > > > > > > > >> >> I'm in favor of leaving it out of the >> > > protocol. I >> > > > > > can't >> > > > > > > > > > really >> > > > > > > > > > > > see >> > > > > > > > > > > > > a >> > > > > > > > > > > > > > >> >> use-case. >> > > > > > > > > > > > > > >> >> >> > > > > > > > > > > > > > >> >> Gwen >> > > > > > > > > > > > > > >> >> >> > > > > > > > > > > > > > >> >> On Mon, Feb 29, 2016 at 3:55 PM, Ashish >> > Singh < >> > > > > > > > > > > > asi...@cloudera.com >> > > > > > > > > > > > > > >> > > > > > > > > > > > > > >> wrote: >> > > > > > > > > > > > > > >> >> >> > > > > > > > > > > > > > >> >> > I hope it is OK for me to make some >> > progress >> > > > > here. >> > > > > > I >> > > > > > > > have >> > > > > > > > > > > made >> > > > > > > > > > > > > the >> > > > > > > > > > > > > > >> >> > following changes. >> > > > > > > > > > > > > > >> >> > >> > > > > > > > > > > > > > >> >> > 1. Updated KIP-35, to adopt Jay's >> > suggestion >> > > on >> > > > > > > > > maintaining >> > > > > > > > > > > > > > separate >> > > > > > > > > > > > > > >> list >> > > > > > > > > > > > > > >> >> > of deprecated versions, instead of >> using a >> > > > > version >> > > > > > of >> > > > > > > > -1. >> > > > > > > > > > > > > > >> >> > 2. Added information on required >> > permissions, >> > > > > > > Describe >> > > > > > > > > > action >> > > > > > > > > > > > on >> > > > > > > > > > > > > > >> Cluster >> > > > > > > > > > > > > > >> >> > resource, to be able to retrieve >> protocol >> > > > > versions >> > > > > > > > from a >> > > > > > > > > > > auth >> > > > > > > > > > > > > > enabled >> > > > > > > > > > > > > > >> >> > Kafka cluster. >> > > > > > > > > > > > > > >> >> > >> > > > > > > > > > > > > > >> >> > Created >> > > > > > > > https://issues.apache.org/jira/browse/KAFKA-3304 >> > > > > > > > > . >> > > > > > > > > > > > > Primary >> > > > > > > > > > > > > > >> patch >> > > > > > > > > > > > > > >> >> is >> > > > > > > > > > > > > > >> >> > available to review, >> > > > > > > > > > > https://github.com/apache/kafka/pull/986 >> > > > > > > > > > > > > > >> >> > >> > > > > > > > > > > > > > >> >> > On Thu, Feb 25, 2016 at 1:27 PM, Ashish >> > > Singh < >> > > > > > > > > > > > > asi...@cloudera.com >> > > > > > > > > > > > > > > >> > > > > > > > > > > > > > >> >> wrote: >> > > > > > > > > > > > > > >> >> > >> > > > > > > > > > > > > > >> >> > > Kafka clients in Hadoop ecosystem, >> Flume, >> > > > > Spark, >> > > > > > > etc, >> > > > > > > > > > have >> > > > > > > > > > > > > found >> > > > > > > > > > > > > > it >> > > > > > > > > > > > > > >> >> > really >> > > > > > > > > > > > > > >> >> > > difficult to cope up with Kafka >> releases >> > as >> > > > > they >> > > > > > > want >> > > > > > > > > to >> > > > > > > > > > > > > support >> > > > > > > > > > > > > > >> users >> > > > > > > > > > > > > > >> >> on >> > > > > > > > > > > > > > >> >> > > different Kafka versions. Capability >> to >> > > > > retrieve >> > > > > > > > > protocol >> > > > > > > > > > > > > version >> > > > > > > > > > > > > > >> will >> > > > > > > > > > > > > > >> >> > go a >> > > > > > > > > > > > > > >> >> > > long way to ease out those pain >> points. I >> > > > will >> > > > > be >> > > > > > > > happy >> > > > > > > > > > to >> > > > > > > > > > > > help >> > > > > > > > > > > > > > out >> > > > > > > > > > > > > > >> >> with >> > > > > > > > > > > > > > >> >> > > the work on this KIP. @Magnus, thanks >> for >> > > > > driving >> > > > > > > > this, >> > > > > > > > > > is >> > > > > > > > > > > it >> > > > > > > > > > > > > OK >> > > > > > > > > > > > > > if >> > > > > > > > > > > > > > >> I >> > > > > > > > > > > > > > >> >> > carry >> > > > > > > > > > > > > > >> >> > > forward the work from here. It will be >> > > ideal >> > > > to >> > > > > > > have >> > > > > > > > > this >> > > > > > > > > > > in >> > > > > > > > > > > > > > >> 0.10.0.0. >> > > > > > > > > > > > > > >> >> > > >> > > > > > > > > > > > > > >> >> > > On Mon, Oct 12, 2015 at 9:29 PM, Jay >> > Kreps >> > > < >> > > > > > > > > > > j...@confluent.io >> > > > > > > > > > > > > >> > > > > > > > > > > > > > >> wrote: >> > > > > > > > > > > > > > >> >> > > >> > > > > > > > > > > > > > >> >> > >> I wonder if we need to solve the >> error >> > > > > problem? >> > > > > > I >> > > > > > > > > think >> > > > > > > > > > > this >> > > > > > > > > > > > > KIP >> > > > > > > > > > > > > > >> >> gives a >> > > > > > > > > > > > > > >> >> > >> descent work around. >> > > > > > > > > > > > > > >> >> > >> >> > > > > > > > > > > > > > >> >> > >> Probably we should have included an >> > error >> > > in >> > > > > the >> > > > > > > > > > response >> > > > > > > > > > > > > > header, >> > > > > > > > > > > > > > >> but >> > > > > > > > > > > > > > >> >> we >> > > > > > > > > > > > > > >> >> > >> debated it at the time decided not to >> > and >> > > > now >> > > > > it >> > > > > > > is >> > > > > > > > > > pretty >> > > > > > > > > > > > > hard >> > > > > > > > > > > > > > to >> > > > > > > > > > > > > > >> add >> > > > > > > > > > > > > > >> >> > >> because the headers aren't versioned >> > > (d'oh). >> > > > > > > > > > > > > > >> >> > >> >> > > > > > > > > > > > > > >> >> > >> It seems like any other solution is >> > going >> > > to >> > > > > be >> > > > > > > kind >> > > > > > > > > of >> > > > > > > > > > a >> > > > > > > > > > > > > hack, >> > > > > > > > > > > > > > >> right? >> > > > > > > > > > > > > > >> >> > >> Sending malformed responses back >> seems >> > > like >> > > > > not >> > > > > > a >> > > > > > > > > clean >> > > > > > > > > > > > > > solution... >> > > > > > > > > > > > > > >> >> > >> >> > > > > > > > > > > > > > >> >> > >> (Not sure if I was pro- having a >> > top-level >> > > > > error >> > > > > > > or >> > > > > > > > > not, >> > > > > > > > > > > but >> > > > > > > > > > > > > in >> > > > > > > > > > > > > > any >> > > > > > > > > > > > > > >> >> case >> > > > > > > > > > > > > > >> >> > >> the rationale for the decision was >> that >> > so >> > > > > many >> > > > > > of >> > > > > > > > the >> > > > > > > > > > > > > requests >> > > > > > > > > > > > > > >> were >> > > > > > > > > > > > > > >> >> > >> per-partition or per-topic or >> whatever >> > and >> > > > > hence >> > > > > > > > fail >> > > > > > > > > or >> > > > > > > > > > > > > > succeed at >> > > > > > > > > > > > > > >> >> that >> > > > > > > > > > > > > > >> >> > >> level and this makes it hard to know >> > what >> > > > the >> > > > > > > right >> > > > > > > > > > > > top-level >> > > > > > > > > > > > > > error >> > > > > > > > > > > > > > >> >> code >> > > > > > > > > > > > > > >> >> > >> is >> > > > > > > > > > > > > > >> >> > >> and hard for the client to figure out >> > what >> > > > to >> > > > > do >> > > > > > > > with >> > > > > > > > > > the >> > > > > > > > > > > > top >> > > > > > > > > > > > > > level >> > > > > > > > > > > > > > >> >> > error >> > > > > > > > > > > > > > >> >> > >> if some of the partitions succeed but >> > > there >> > > > > is a >> > > > > > > > > > top-level >> > > > > > > > > > > > > > error). >> > > > > > > > > > > > > > >> >> > >> >> > > > > > > > > > > > > > >> >> > >> I think actually this new API >> actually >> > > > gives a >> > > > > > way >> > > > > > > > to >> > > > > > > > > > > handle >> > > > > > > > > > > > > > this >> > > > > > > > > > > > > > >> >> > >> gracefully on the client side by just >> > > having >> > > > > > > clients >> > > > > > > > > > that >> > > > > > > > > > > > want >> > > > > > > > > > > > > > to >> > > > > > > > > > > > > > >> be >> > > > > > > > > > > > > > >> >> > >> graceful check for support for their >> > > > version. >> > > > > > > > Clients >> > > > > > > > > > that >> > > > > > > > > > > > do >> > > > > > > > > > > > > > that >> > > > > > > > > > > > > > >> >> will >> > > > > > > > > > > > > > >> >> > >> have a graceful message. >> > > > > > > > > > > > > > >> >> > >> >> > > > > > > > > > > > > > >> >> > >> At some point if we're ever reworking >> > the >> > > > > > headers >> > > > > > > we >> > > > > > > > > > > should >> > > > > > > > > > > > > > really >> > > > > > > > > > > > > > >> >> > >> consider >> > > > > > > > > > > > > > >> >> > >> (a) versioning them and (b) adding a >> > > > top-level >> > > > > > > error >> > > > > > > > > > code >> > > > > > > > > > > in >> > > > > > > > > > > > > the >> > > > > > > > > > > > > > >> >> > response. >> > > > > > > > > > > > > > >> >> > >> But given this would be a big >> breaking >> > > > change >> > > > > > and >> > > > > > > > this >> > > > > > > > > > is >> > > > > > > > > > > > > really >> > > > > > > > > > > > > > >> just >> > > > > > > > > > > > > > >> >> to >> > > > > > > > > > > > > > >> >> > >> give a nicer error message seems >> like it >> > > > > > probably >> > > > > > > > > isn't >> > > > > > > > > > > > worth >> > > > > > > > > > > > > > it to >> > > > > > > > > > > > > > >> >> try >> > > > > > > > > > > > > > >> >> > to >> > > > > > > > > > > > > > >> >> > >> do something now. >> > > > > > > > > > > > > > >> >> > >> >> > > > > > > > > > > > > > >> >> > >> -Jay >> > > > > > > > > > > > > > >> >> > >> >> > > > > > > > > > > > > > >> >> > >> >> > > > > > > > > > > > > > >> >> > >> >> > > > > > > > > > > > > > >> >> > >> On Mon, Oct 12, 2015 at 8:11 PM, >> > Jiangjie >> > > > Qin >> > > > > > > > > > > > > > >> >> <j...@linkedin.com.invalid >> > > > > > > > > > > > > > >> >> > > >> > > > > > > > > > > > > > >> >> > >> wrote: >> > > > > > > > > > > > > > >> >> > >> >> > > > > > > > > > > > > > >> >> > >> > I am thinking instead of returning >> an >> > > > empty >> > > > > > > > > response, >> > > > > > > > > > it >> > > > > > > > > > > > > > would be >> > > > > > > > > > > > > > >> >> > >> better to >> > > > > > > > > > > > > > >> >> > >> > return an explicit >> > > > > UnsupportedVersionException >> > > > > > > > code. >> > > > > > > > > > > > > > >> >> > >> > >> > > > > > > > > > > > > > >> >> > >> > Today KafkaApis handles the error >> in >> > the >> > > > > > > following >> > > > > > > > > > way: >> > > > > > > > > > > > > > >> >> > >> > 1. For requests/responses using old >> > > Scala >> > > > > > > classes, >> > > > > > > > > > > > KafkaApis >> > > > > > > > > > > > > > uses >> > > > > > > > > > > > > > >> >> > >> > RequestOrResponse.handleError() to >> > > return >> > > > an >> > > > > > > error >> > > > > > > > > > > > response. >> > > > > > > > > > > > > > >> >> > >> > 2. For requests/response using Java >> > > > classes >> > > > > > > (only >> > > > > > > > > > > > > > >> JoinGroupRequest >> > > > > > > > > > > > > > >> >> and >> > > > > > > > > > > > > > >> >> > >> > Heartbeat now), KafkaApis calls >> > > > > > > > > > > > > > >> AbstractRequest.getErrorResponse() >> > > > > > > > > > > > > > >> >> to >> > > > > > > > > > > > > > >> >> > >> > return an error response. >> > > > > > > > > > > > > > >> >> > >> > >> > > > > > > > > > > > > > >> >> > >> > In KAFKA-2512, I am returning an >> > > > > > > > > > > > UnsupportedVersionException >> > > > > > > > > > > > > > for >> > > > > > > > > > > > > > >> >> case >> > > > > > > > > > > > > > >> >> > >> [1] >> > > > > > > > > > > > > > >> >> > >> > when see an unsupported version. >> This >> > > will >> > > > > put >> > > > > > > the >> > > > > > > > > > error >> > > > > > > > > > > > > code >> > > > > > > > > > > > > > per >> > > > > > > > > > > > > > >> >> > topic >> > > > > > > > > > > > > > >> >> > >> or >> > > > > > > > > > > > > > >> >> > >> > partition for most of the requests, >> > but >> > > > > might >> > > > > > > not >> > > > > > > > > work >> > > > > > > > > > > all >> > > > > > > > > > > > > the >> > > > > > > > > > > > > > >> time. >> > > > > > > > > > > > > > >> >> > >> e.g. >> > > > > > > > > > > > > > >> >> > >> > TopicMetadataRequest with an empty >> > topic >> > > > > set. >> > > > > > > > > > > > > > >> >> > >> > >> > > > > > > > > > > > > > >> >> > >> > Case [2] does not quite work for >> > > > unsupported >> > > > > > > > > version, >> > > > > > > > > > > > > because >> > > > > > > > > > > > > > we >> > > > > > > > > > > > > > >> >> will >> > > > > > > > > > > > > > >> >> > >> > thrown an uncaught exception when >> > > version >> > > > is >> > > > > > not >> > > > > > > > > > > > recognized >> > > > > > > > > > > > > > (BTW >> > > > > > > > > > > > > > >> >> this >> > > > > > > > > > > > > > >> >> > >> is a >> > > > > > > > > > > > > > >> >> > >> > bug). Part of the reason is that >> for >> > > some >> > > > > > > response >> > > > > > > > > > > types, >> > > > > > > > > > > > > > error >> > > > > > > > > > > > > > >> code >> > > > > > > > > > > > > > >> >> > is >> > > > > > > > > > > > > > >> >> > >> not >> > > > > > > > > > > > > > >> >> > >> > part of the response level field. >> > > > > > > > > > > > > > >> >> > >> > >> > > > > > > > > > > > > > >> >> > >> > Maybe it worth checking how each >> > > response >> > > > is >> > > > > > > > dealing >> > > > > > > > > > > with >> > > > > > > > > > > > > > error >> > > > > > > > > > > > > > >> code >> > > > > > > > > > > > > > >> >> > >> today. >> > > > > > > > > > > > > > >> >> > >> > A scan of the response formats >> gives >> > the >> > > > > > > following >> > > > > > > > > > > result: >> > > > > > > > > > > > > > >> >> > >> > 1. TopicMetadataResponse - per >> topic >> > > error >> > > > > > code, >> > > > > > > > > does >> > > > > > > > > > > not >> > > > > > > > > > > > > work >> > > > > > > > > > > > > > >> when >> > > > > > > > > > > > > > >> >> > the >> > > > > > > > > > > > > > >> >> > >> > topic set is empty in the request. >> > > > > > > > > > > > > > >> >> > >> > 2. ProduceResonse - per partition >> > error >> > > > > code. >> > > > > > > > > > > > > > >> >> > >> > 3. OffsetCommitResponse - per >> > partition. >> > > > > > > > > > > > > > >> >> > >> > 4. OffsetFetchResponse - per >> > partition. >> > > > > > > > > > > > > > >> >> > >> > 5. OffsetResponse - per partition. >> > > > > > > > > > > > > > >> >> > >> > 6. FetchResponse - per partition >> > > > > > > > > > > > > > >> >> > >> > 7. ConsumerMetadataResponse - >> response >> > > > level >> > > > > > > > > > > > > > >> >> > >> > 8. ControlledShutdownResponse - >> > response >> > > > > level >> > > > > > > > > > > > > > >> >> > >> > 9. JoinGroupResponse - response >> level >> > > > > > > > > > > > > > >> >> > >> > 10. HearbeatResponse - response >> level >> > > > > > > > > > > > > > >> >> > >> > 11. LeaderAndIsrResponse - response >> > > level >> > > > > > > > > > > > > > >> >> > >> > 12. StopReplicaResponse - response >> > level >> > > > > > > > > > > > > > >> >> > >> > 13. UpdateMetadataResponse - >> response >> > > > level >> > > > > > > > > > > > > > >> >> > >> > >> > > > > > > > > > > > > > >> >> > >> > So from the list above it looks for >> > each >> > > > > > > response >> > > > > > > > we >> > > > > > > > > > are >> > > > > > > > > > > > > > actually >> > > > > > > > > > > > > > >> >> able >> > > > > > > > > > > > > > >> >> > >> to >> > > > > > > > > > > > > > >> >> > >> > return an error code, as long as we >> > make >> > > > > sure >> > > > > > > the >> > > > > > > > > > topic >> > > > > > > > > > > or >> > > > > > > > > > > > > > >> partition >> > > > > > > > > > > > > > >> >> > >> won't >> > > > > > > > > > > > > > >> >> > >> > be empty when the error code is at >> > topic >> > > > or >> > > > > > > > > partition >> > > > > > > > > > > > level. >> > > > > > > > > > > > > > >> Luckily >> > > > > > > > > > > > > > >> >> > in >> > > > > > > > > > > > > > >> >> > >> the >> > > > > > > > > > > > > > >> >> > >> > above list we only need to worry >> about >> > > > > > > > > > > > > TopicMetadataResponse. >> > > > > > > > > > > > > > >> >> > >> > >> > > > > > > > > > > > > > >> >> > >> > Maybe error handling is out of the >> > scope >> > > > of >> > > > > > this >> > > > > > > > > KIP, >> > > > > > > > > > > but >> > > > > > > > > > > > I >> > > > > > > > > > > > > > >> prefer >> > > > > > > > > > > > > > >> >> we >> > > > > > > > > > > > > > >> >> > >> think >> > > > > > > > > > > > > > >> >> > >> > through how to deal with error code >> > for >> > > > the >> > > > > > > > > requests, >> > > > > > > > > > > > > because >> > > > > > > > > > > > > > >> there >> > > > > > > > > > > > > > >> >> > are >> > > > > > > > > > > > > > >> >> > >> > more request types to be added in >> > > > KAFKA-2464 >> > > > > > and >> > > > > > > > > > future >> > > > > > > > > > > > > > patches. >> > > > > > > > > > > > > > >> >> > >> > >> > > > > > > > > > > > > > >> >> > >> > Thanks, >> > > > > > > > > > > > > > >> >> > >> > >> > > > > > > > > > > > > > >> >> > >> > Jiangjie (Becket) Qin >> > > > > > > > > > > > > > >> >> > >> > >> > > > > > > > > > > > > > >> >> > >> > On Mon, Oct 12, 2015 at 6:04 PM, >> Jay >> > > > Kreps < >> > > > > > > > > > > > > j...@confluent.io> >> > > > > > > > > > > > > > >> >> wrote: >> > > > > > > > > > > > > > >> >> > >> > >> > > > > > > > > > > > > > >> >> > >> > > Two quick pieces of feedback: >> > > > > > > > > > > > > > >> >> > >> > > 1. The use of a version of -1 as >> > > magical >> > > > > > entry >> > > > > > > > > > > dividing >> > > > > > > > > > > > > > between >> > > > > > > > > > > > > > >> >> > >> > deprecated >> > > > > > > > > > > > > > >> >> > >> > > versions is a bit hacky. What >> about >> > > > > instead >> > > > > > > > having >> > > > > > > > > > an >> > > > > > > > > > > > > array >> > > > > > > > > > > > > > of >> > > > > > > > > > > > > > >> >> > >> supported >> > > > > > > > > > > > > > >> >> > >> > > versions and a separate array of >> > > > > deprecated >> > > > > > > > > > versions. >> > > > > > > > > > > > The >> > > > > > > > > > > > > > >> >> deprecated >> > > > > > > > > > > > > > >> >> > >> > > versions would always be a >> subset of >> > > the >> > > > > > > > supported >> > > > > > > > > > > > > versions. >> > > > > > > > > > > > > > >> Or, >> > > > > > > > > > > > > > >> >> > >> > > alternately, since deprecation >> has >> > no >> > > > > > > functional >> > > > > > > > > > > impact >> > > > > > > > > > > > > and >> > > > > > > > > > > > > > is >> > > > > > > > > > > > > > >> >> just >> > > > > > > > > > > > > > >> >> > a >> > > > > > > > > > > > > > >> >> > >> > > message to developers, we could >> just >> > > > leave >> > > > > > it >> > > > > > > > out >> > > > > > > > > of >> > > > > > > > > > > the >> > > > > > > > > > > > > > >> protocol >> > > > > > > > > > > > > > >> >> > and >> > > > > > > > > > > > > > >> >> > >> > just >> > > > > > > > > > > > > > >> >> > >> > > have it in release notes etc. >> > > > > > > > > > > > > > >> >> > >> > > 2. I think including the api name >> > may >> > > > > cause >> > > > > > > some >> > > > > > > > > > > > problems. >> > > > > > > > > > > > > > >> >> Currently >> > > > > > > > > > > > > > >> >> > >> the >> > > > > > > > > > > > > > >> >> > >> > > api key is the primary key that >> we >> > > keep >> > > > > > > > consistent >> > > > > > > > > > but >> > > > > > > > > > > > we >> > > > > > > > > > > > > > have >> > > > > > > > > > > > > > >> >> > >> actually >> > > > > > > > > > > > > > >> >> > >> > > evolved the english description >> of >> > the >> > > > > apis >> > > > > > as >> > > > > > > > > they >> > > > > > > > > > > have >> > > > > > > > > > > > > > >> changed. >> > > > > > > > > > > > > > >> >> > The >> > > > > > > > > > > > > > >> >> > >> > only >> > > > > > > > > > > > > > >> >> > >> > > use I can think of for the name >> > would >> > > be >> > > > > if >> > > > > > > > people >> > > > > > > > > > > used >> > > > > > > > > > > > > the >> > > > > > > > > > > > > > >> >> logical >> > > > > > > > > > > > > > >> >> > >> name >> > > > > > > > > > > > > > >> >> > >> > > and tried to resolve the api key, >> > but >> > > > that >> > > > > > > would >> > > > > > > > > be >> > > > > > > > > > > > wrong. >> > > > > > > > > > > > > > Not >> > > > > > > > > > > > > > >> >> sure >> > > > > > > > > > > > > > >> >> > >> if we >> > > > > > > > > > > > > > >> >> > >> > > actually need the english name, >> if >> > > there >> > > > > is >> > > > > > a >> > > > > > > > use >> > > > > > > > > > > case I >> > > > > > > > > > > > > > guess >> > > > > > > > > > > > > > >> >> we'll >> > > > > > > > > > > > > > >> >> > >> just >> > > > > > > > > > > > > > >> >> > >> > > have to be very clear that the >> name >> > is >> > > > > just >> > > > > > > > > > > > documentation >> > > > > > > > > > > > > > and >> > > > > > > > > > > > > > >> can >> > > > > > > > > > > > > > >> >> > >> change >> > > > > > > > > > > > > > >> >> > >> > > any time. >> > > > > > > > > > > > > > >> >> > >> > > >> > > > > > > > > > > > > > >> >> > >> > > -Jay >> > > > > > > > > > > > > > >> >> > >> > > >> > > > > > > > > > > > > > >> >> > >> > > On Fri, Sep 25, 2015 at 2:53 PM, >> > > Magnus >> > > > > > > > Edenhill < >> > > > > > > > > > > > > > >> >> > mag...@edenhill.se> >> > > > > > > > > > > > > > >> >> > >> > > wrote: >> > > > > > > > > > > > > > >> >> > >> > > >> > > > > > > > > > > > > > >> >> > >> > > > Good evening, >> > > > > > > > > > > > > > >> >> > >> > > > >> > > > > > > > > > > > > > >> >> > >> > > > KIP-35 was created to address >> > > current >> > > > > and >> > > > > > > > future >> > > > > > > > > > > > > > >> broker-client >> > > > > > > > > > > > > > >> >> > >> > > > compatibility. >> > > > > > > > > > > > > > >> >> > >> > > > >> > > > > > > > > > > > > > >> >> > >> > > > >> > > > > > > > > > > > > > >> >> > >> > > > >> > > > > > > > > > > > > > >> >> > >> > > >> > > > > > > > > > > > > > >> >> > >> > >> > > > > > > > > > > > > > >> >> > >> >> > > > > > > > > > > > > > >> >> > >> > > > > > > > > > > > > > >> >> >> > > > > > > > > > > > > > >> >> > > > > > > > > > > > > > >> > > > > > > > > > > > > >> > > > > > > > > > > > >> > > > > > > > > > > >> > > > > > > > > > >> > > > > > > > > >> > > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > >> > > >> > >> https://cwiki.apache.org/confluence/display/KAFKA/KIP-35+-+Retrieving+protocol+version >> > > > > > > > > > > > > > >> >> > >> > > > >> > > > > > > > > > > > > > >> >> > >> > > > Summary: >> > > > > > > > > > > > > > >> >> > >> > > > * allow clients to retrieve >> the >> > > > > broker's >> > > > > > > > > protocol >> > > > > > > > > > > > > version >> > > > > > > > > > > > > > >> >> > >> > > > * make broker handle unknown >> > > protocol >> > > > > > > > requests >> > > > > > > > > > > > > gracefully >> > > > > > > > > > > > > > >> >> > >> > > > >> > > > > > > > > > > > > > >> >> > >> > > > Feedback and comments welcome! >> > > > > > > > > > > > > > >> >> > >> > > > >> > > > > > > > > > > > > > >> >> > >> > > > Regards, >> > > > > > > > > > > > > > >> >> > >> > > > Magnus >> > > > > > > > > > > > > > >> >> > >> > > > >> > > > > > > > > > > > > > >> >> > >> > > >> > > > > > > > > > > > > > >> >> > >> > >> > > > > > > > > > > > > > >> >> > >> >> > > > > > > > > > > > > > >> >> > > >> > > > > > > > > > > > > > >> >> > > >> > > > > > > > > > > > > > >> >> > > >> > > > > > > > > > > > > > >> >> > > -- >> > > > > > > > > > > > > > >> >> > > >> > > > > > > > > > > > > > >> >> > > Regards, >> > > > > > > > > > > > > > >> >> > > Ashish >> > > > > > > > > > > > > > >> >> > > >> > > > > > > > > > > > > > >> >> > >> > > > > > > > > > > > > > >> >> > >> > > > > > > > > > > > > > >> >> > >> > > > > > > > > > > > > > >> >> > -- >> > > > > > > > > > > > > > >> >> > >> > > > > > > > > > > > > > >> >> > Regards, >> > > > > > > > > > > > > > >> >> > Ashish >> > > > > > > > > > > > > > >> >> > >> > > > > > > > > > > > > > >> >> >> > > > > > > > > > > > > > >> > >> > > > > > > > > > > > > > >> > >> > > > > > > > > > > > > > >> > >> > > > > > > > > > > > > > >> > -- >> > > > > > > > > > > > > > >> > >> > > > > > > > > > > > > > >> > Regards, >> > > > > > > > > > > > > > >> > Ashish >> > > > > > > > > > > > > > >> >> > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > -- >> > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > Regards, >> > > > > > > > > > > > > > > Ashish >> > > > > > > > > > > > > > >> > > > > > > > > > > > > >> > > > > > > > > > > > > >> > > > > > > > > > > > > >> > > > > > > > > > > > > -- >> > > > > > > > > > > > > >> > > > > > > > > > > > > Regards, >> > > > > > > > > > > > > Ashish >> > > > > > > > > > > > > >> > > > > > > > > > > > >> > > > > > > > > > > >> > > > > > > > > > >> > > > > > > > > >> > > > > > > > >> > > > > > > >> > > > > > >> > > > > > >> > > > > > >> > > > > > -- >> > > > > > >> > > > > > Regards, >> > > > > > Ashish >> > > > > > >> > > > > >> > > > >> > > >> > >> > >> > >> > -- >> > >> > Regards, >> > Ashish >> > >> > > > > -- > > Regards, > Ashish > -- Regards, Ashish