Note: I'm also treating ZkUtils as if it was a public API (i.e. converting
objects that are returned into o.a.k.common equivalents but not changing
ZkUtils itself).
I know its not public, but I suspect I'm not the only developer here who
has tons of external code that uses it.

Gwen

On Wed, Mar 18, 2015 at 5:48 PM, Gwen Shapira <gshap...@cloudera.com> wrote:

> 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
> >> >> >> >>
> >> >> >>
> >> >>
> >>
>

Reply via email to