We can't rip them out completely, unfortunately - the SimpleConsumer uses them.
So we'll need conversion at some point. I'll try to make the conversion point "just before hitting a public API that we can't modify", and hopefully it won't look too arbitrary. On Wed, Mar 18, 2015 at 5:24 PM, Jay Kreps <jay.kr...@gmail.com> wrote: > I think either approach is okay in the short term. However our goal should > be to eventually get rid of that duplicate code, so if you are up for just > ripping and cutting that may get us there sooner. > > -Jay > > On Wed, Mar 18, 2015 at 5:19 PM, Gwen Shapira <gshap...@cloudera.com> wrote: > >> Thanks! >> >> Another clarification: >> The Common request/responses use slightly different infrastructure >> objects: Node instead of Broker, TopicPartition instead of >> TopicAndPartition and few more. >> >> I can write utilities to convert Node to Broker to minimize the scope >> of the change. >> Or I can start replacing Brokers with Nodes across the board. >> >> I'm currently taking the second approach - i.e, if MetadataRequest is >> now returning Node, I'm changing the entire line of dependencies to >> use Nodes instead of broker. >> >> Is this acceptable, or do we want to take a more minimal approach for >> this patch and do a larger replacement as a follow up? >> >> Gwen >> >> >> >> >> On Wed, Mar 18, 2015 at 3:32 PM, Jay Kreps <jay.kr...@gmail.com> wrote: >> > Great. >> > >> > For (3) yeah I think we should just think through the end-to-end pattern >> > for these versioned requests since it seems like we will have a number of >> > them. The serialization code used as you described gets us to the right >> > Struct which the user would then wrap in something like ProduceRequest. >> > Presumably there would just be one ProduceRequest that would internally >> > fill in things like null or otherwise adapt the struct to a usable >> object. >> > On the response side we would have the version from the request to use >> for >> > correct versioning. On question is whether this is enough or whether we >> > need to have switches in KafkaApis to do things like >> > if(produceRequest.version == 3) >> > // do something >> > else >> > // do something else >> > >> > Basically it would be good to be able to write a quick wiki that was like >> > "how to add or modify a kafka api" that explained the right way to do all >> > this. >> > >> > I don't think any of this necessarily blocks this ticket since at the >> > moment we don't have tons of versions of requests out there. >> > >> > -Jay >> > >> > On Wed, Mar 18, 2015 at 2:50 PM, Gwen Shapira <gshap...@cloudera.com> >> wrote: >> > >> >> See inline responses: >> >> >> >> On Wed, Mar 18, 2015 at 2:26 PM, Jay Kreps <jay.kr...@gmail.com> wrote: >> >> > Hey Gwen, >> >> > >> >> > This makes sense to me. >> >> > >> >> > A couple of thoughts, mostly confirming what you said I think: >> >> > >> >> > 1. Ideally we would move completely over to the new style of >> request >> >> > definition for server-side processing, even for the internal >> >> requests. This >> >> > way all requests would have the same header/body struct stuff. As >> you >> >> say >> >> > for the internal requests we can just delete the scala code. For >> the >> >> old >> >> > clients they will continue to use their old request definitions >> until >> >> we >> >> > eol them. I would propose that new changes will go only into the >> new >> >> > request/response objects and the old scala ones will be permanently >> >> stuck >> >> > on their current version until discontinued. So after this change >> >> that old >> >> > scala code could be considered frozen. >> >> >> >> SimpleConsumer is obviously stuck with the old request/response. >> >> >> >> The Producers can be converted to the common request/response without >> >> breaking compatibility. >> >> I think we should do this (even though it requires fiddling with >> >> additional network serialization code), just so we can throw the old >> >> ProduceRequest away. >> >> >> >> Does that make sense? >> >> >> >> >> >> > 2. I think it would be reasonable to keep all the requests under >> >> common, >> >> > even though as you point out there is currently no use for some of >> >> them >> >> > beyond broker-to-broker communication at the moment. >> >> >> >> Yep. >> >> >> >> > 3. We should think a little about how versioning will work. Making >> >> this >> >> > convenient on the server side is an important goal for the new >> style >> >> of >> >> > request definition. At the serialization level we now handle >> >> versioning but >> >> > the question we should discuss and work out is how this will map to >> >> the >> >> > request objects (which I assume will remain unversioned). >> >> >> >> The way I see it working (I just started on this, so I may have gaps): >> >> >> >> * Request header contains the version >> >> * When we read the request, we use ProtoUtils.requestSchema which >> >> takes version as a parameter and is responsible to give us the right >> >> Schema, which we use to read the buffer and get the correct struct. >> >> * KafkaApis handlers have the header, so they can use it to access the >> >> correct fields, build the correct response, etc. >> >> >> >> Does that sound about right? >> >> >> >> >> >> > 4. Ideally after this refactoring the network package should not be >> >> > dependent on the individual request objects. The intention is that >> >> stuff in >> >> > kafka.network is meant to be generic network infrastructure that >> >> doesn't >> >> > know about the particular fetch/produce apis we have implemented on >> >> top. >> >> >> >> I'll make a note to validate that this is the case. >> >> >> >> > >> >> > -Jay >> >> > >> >> > On Wed, Mar 18, 2015 at 11:11 AM, Gwen Shapira <gshap...@cloudera.com >> > >> >> > wrote: >> >> > >> >> >> Hi Jun, >> >> >> >> >> >> I was taking a slightly different approach. Let me know if it makes >> >> >> sense to you: >> >> >> >> >> >> 1. Get the bytes from network (kinda unavoidable...) >> >> >> 2. Modify RequestChannel.Request to contain header and body (instead >> >> >> of a single object) >> >> >> 3. Create the head and body from bytes as follow: >> >> >> val header: RequestHeader = RequestHeader.parse(buffer) >> >> >> val apiKey: Int = header.apiKey >> >> >> val body: Struct = >> >> >> >> >> >> ProtoUtils.currentRequestSchema(apiKey).read(buffer).asInstanceOf[Struct] >> >> >> 4. KafkaAPIs will continue getting RequestChannel.Request, but will >> >> >> now have access to body and header separately. >> >> >> >> >> >> I agree that I need a Request/Response objects that contain only the >> >> >> body for all requests objects. >> >> >> I'm thinking of implementing them in o.a.k.Common.Requests in Java >> for >> >> >> consistency. >> >> >> >> >> >> When we are discussing the requests/responses used in SimpleConsumer, >> >> >> we mean everything used in javaapi, right? >> >> >> >> >> >> Gwen >> >> >> >> >> >> >> >> >> >> >> >> On Wed, Mar 18, 2015 at 9:55 AM, Jun Rao <j...@confluent.io> wrote: >> >> >> > Hi, Gwen, >> >> >> > >> >> >> > I was thinking that we will be doing the following in KAFKA-1927. >> >> >> > >> >> >> > 1. Get the bytes from network. >> >> >> > 2. Use a new generic approach to convert bytes into request >> objects. >> >> >> > 2.1 Read the fixed request header (using the util in client). >> >> >> > 2.2 Based on the request id in the header, deserialize the rest of >> the >> >> >> > bytes into a request specific object (using the new java objects). >> >> >> > 3. We will then be passing a header and an AbstractRequestResponse >> to >> >> >> > KafkaApis. >> >> >> > >> >> >> > In order to do that, we will need to create similar >> request/response >> >> >> > objects for internal requests such as StopReplica, LeaderAndIsr, >> >> >> > UpdateMetadata, ControlledShutdown. Not sure whether they should be >> >> >> written >> >> >> > in java or scala, but perhaps they should be only in the core >> project. >> >> >> > >> >> >> > Also note, there are some scala requests/responses used directly in >> >> >> > SimpleConsumer. Since that's our public api, we can't remove those >> >> scala >> >> >> > objects until the old consumer is phased out. We can remove the >> rest >> >> of >> >> >> the >> >> >> > scala request objects. >> >> >> > >> >> >> > Thanks, >> >> >> > >> >> >> > Jun >> >> >> > >> >> >> > >> >> >> > On Tue, Mar 17, 2015 at 6:08 PM, Gwen Shapira < >> gshap...@cloudera.com> >> >> >> wrote: >> >> >> > >> >> >> >> Hi, >> >> >> >> >> >> >> >> I'm starting this thread for the various questions I run into >> while >> >> >> >> refactoring the server to use client requests and responses. >> >> >> >> >> >> >> >> Help is appreciated :) >> >> >> >> >> >> >> >> First question: LEADER_AND_ISR request and STOP_REPLICA request >> are >> >> >> >> unimplemented in the client. >> >> >> >> >> >> >> >> Do we want to implement them as part of this refactoring? >> >> >> >> Or should we continue using the scala implementation for those? >> >> >> >> >> >> >> >> Gwen >> >> >> >> >> >> >> >> >> >>