Thanks Jay. max.block.ms looks good. I will update the wiki page. Jiangjie (Becket) Qin
On 6/2/15, 11:26 AM, "Jay Kreps" <jay.kr...@gmail.com> wrote: >Quick follow-up on the discussion on KIP-19. For partitionsFor() I think >the question was whether to use max.enqueue.block.ms or request.timeout.ms >to control the timeout. The proposed plan was to use request.timeout.ms. >Alternately we could change the config max.enqueue.block.ms to >max.block.ms >and use that instead. The argument for this is that in both cases you are >configuring the time the client will block. > >I think this is sort of a corner case so I am +1 either way. > >-Jay > >On Tue, Jun 2, 2015 at 10:07 AM, Ewen Cheslack-Postava <e...@confluent.io> >wrote: > >> Option 3 seems a lot better than previous options, especially from the >> user's perspective. I think it gives reasonable balance between control >>and >> fewer options, and the only implementation details it's exposing are >>that >> there is a buffer and there is a network request. Making the request >> timeout only start after enqueuing still allows you to compute a maximum >> timeout for a request by adding the two values, but doesn't have >>annoying >> artifacts like sometimes issuing a network request when there's only a >> fraction of a millisecond left for it to complete. >> >> REQUEST_TIMEOUT_DOC could probably add something about the retries, e.g. >> something like "This timeout is per retry, so the maximum time spent >> waiting for a request to complete will be (retries+1) * >> network.request.timeout.ms". >> >> There's also one other use of the metadata fetch timeout in >>partitionsFor. >> Are we converting that to use MAX_ENQUEUE_TIMEOUT_MS_CONFIG? The naming >>is >> a bit awkward, but we need to use something there. >> >> Finally, just a nit, but the naming conventions for variables are >>getting >> inconsistent. Some have _MS in them, some don't, and some of the _DOC >>names >> are inconsistent with the _CONFIG names. >> >> -Ewen >> >> >> On Mon, Jun 1, 2015 at 9:44 PM, Jiangjie Qin <j...@linkedin.com.invalid> >> wrote: >> >> > Bump up this thread. >> > >> > After several discussions in LinkedIn, we came up with three options. >>I >> > have updated the KIP-19 wiki page to summarize the three options and >> > stated our preference. We can discuss on them in tomorrow’s KIP >>hangout. >> > Please let us know what do you think. >> > >> > Thanks, >> > >> > Jiangjie (Becket) Qin >> > >> > On 5/21/15, 5:54 PM, "Jiangjie Qin" <j...@linkedin.com> wrote: >> > >> > >Based on the discussion we have, I just updated the KIP with the >> following >> > >proposal and want to see if there is further comments. >> > > >> > >The proposal is to have the following four timeout as end state. >> > > >> > >1. max.buffer.full.block.ms - To replace block.on.buffer.full. The >> max >> > >time to block when buffer is full. >> > >2. metadata.fetch.timeout.ms - reuse metadata timeout as >> > batch.timeout.ms >> > >because it is essentially metadata not available. >> > >3. replication.timeout.ms - It defines how long a server will >>wait >> > for >> > >the records to be replicated to followers. >> > >4. network.request.timeout.ms - This timeout is used when producer >> sends >> > >request to brokers through TCP connections. It specifies how long the >> > >producer should wait for the response. >> > > >> > >With the above approach, we can achieve the following. >> > >* We can have bounded blocking time for send() = (1) + (2). >> > >* The time after send() until response got received is generally >>bounded >> > >by linger.ms + (2) + (4), not taking retries into consideration. >> > > >> > >So from user’s perspective. Send() depends on metadata of a topic and >> > >buffer space. I am not sure if user would really care about how long >>it >> > >takes to receive the response because it is async anyway and we have >>so >> > >many things to consider (retries, linger.ms, retry backoff time, >> request >> > >timeout, etc). >> > > >> > >I think these configurations are clear enough to let user understand >>at >> > >the first glance. Please let me know what do you think. >> > > >> > >Thanks. >> > > >> > >Jiangjie (Becket) Qin >> > > >> > > >> > > >> > >On 5/20/15, 9:55 AM, "Joel Koshy" <jjkosh...@gmail.com> wrote: >> > > >> > >>> The fact that I understand the producer internals and am still >> > >>>struggling >> > >>> to understand the implications of the different settings, how I >>would >> > >>>set >> > >>> them, and how they potentially interact such that I could set >>invalid >> > >>> combinations seems like a red flag to me... Being able to say "I >>want >> > >>> produce requests to timeout in 5s" shouldn't require adjusting 3 >>or 4 >> > >>> configs if the defaults would normally timeout out in something >>like >> > >>>30s. >> > >>> >> > >>> Setting aside compatibility issues and focusing on the best set of >> > >>>configs, >> > >>> I agree with Jay that there are two things I actually want out of >>the >> > >>>API. >> > >>> The key thing is a per-request timeout, which should be enforced >> client >> > >>> side. I would just expect this to follow the request through any >> > >>>internals >> > >>> so it can be enforced no matter where in the pipeline the request >>is. >> > >>> Within each component in the pipeline we might have to compute how >> much >> > >>> time we have left for the request in order to create a timeout >>within >> > >>>that >> > >>> setting. The second setting is to bound the amount of time spent >> > >>>blocking >> > >>> on send(). This is really an implementation detail, but one that >> people >> > >>>are >> > >>> complaining about enough that it seems worthwhile to provide >>control >> > >>>over >> > >>> it (and fixing it would just make that setting superfluous, not >>break >> > >>> anything). >> > >>> >> > >>> Exposing a lot more settings also exposes a lot about the >> > >>>implementation >> > >>> and makes it harder to improve the implementation in the future, >>but >> I >> > >>> don't think we have listed good use cases for setting each of them >> > >>> individually. Why would the user specifically care about how much >> time >> > >>>the >> > >>> request spends in the accumulator vs. some other component >>(assuming >> > >>>they >> > >>> have the overall timeout)? Same for requests in flight, as long >>as I >> > >>>have >> > >>> that client side timeout? And if they care about what component is >> the >> > >>> bottleneck, could that be better exposed by the exceptions that >>are >> > >>> returned rather than a ton of different settings? >> > >> >> > >>Agreed with the above. I'm also extremely wary of configs that are >> > >>inherently unintuitive, or can interact to yield unintuitive >>behavior. >> > >>OTOH I think it is okay if a config is categorized as "advanced" or >>if >> > >>it requires deeper knowledge of the internals of the producer (or >>the >> > >>configured system in general). i.e., as long as we think long and >>hard >> > >>and agree on necessity (driven by clear use cases) before adding >>such >> > >>configs. We should also consider how we can simplify or even >>eliminate >> > >>existing configs. >> > >> >> > >>Re: requests in flight may be a good example: Becket had given a >>valid >> > >>use-case i.e., support strict ordering. Maybe we can replace it >>with a >> > >>"enable.strict.ordering" config which is clearer in intent and would >> > >>internally ensure only one in-flight request per partition and >>default >> > >>to a fixed in-flight requests (say, five or 10) if set to false. If >>we >> > >>implement idempotence then we won't even need that. >> > >> >> > >>> On Tue, May 19, 2015 at 7:13 PM, Jiangjie Qin >> > >>><j...@linkedin.com.invalid> >> > >>> wrote: >> > >>> >> > >>> > Hi Jay, >> > >>> > >> > >>> > I updated what I think int KIP wiki. Just a short summary here. >> > >>>Because we >> > >>> > need timeout for: >> > >>> > 1. Send() >> > >>> > 2. Batches in accumulator >> > >>> > 3. Requests in flight. >> > >>> > That means we need to have at least three configurations if we >>do >> not >> > >>> > reuse configurations. >> > >>> > >> > >>> > I think we probably want to also separate the configurations for >> > >>>exception >> > >>> > handling and SLA purposes as well. >> > >>> > My understanding of the configurations we are discussing here is >> they >> > >>>are >> > >>> > for exception handling but not for SLA purposes. It looks to me >> that >> > >>> > exception handling is more component oriented while SLA is more >>of >> > >>> > systematic tuning. What you suggested sounds more like to set >> > >>> > configurations to meet a user defined SLA. I am not sure if >>this is >> > >>>the >> > >>> > things we want to do here. >> > >>> > >> > >>> > Thanks. >> > >>> > >> > >>> > Jiangjie (Becket) Qin >> > >>> > >> > >>> > On 5/19/15, 5:42 PM, "Jay Kreps" <jay.kr...@gmail.com> wrote: >> > >>> > >> > >>> > >Yeah I think linger.ms remains separate, setting that is a >> > >>>performance >> > >>> > >optimization rather than failure handling thing. We should >>ideally >> > >>>sanity >> > >>> > >check this, though, in my proposal, since if they set >>linger.ms > >> > >>> > >request.timeout then that won't work. >> > >>> > > >> > >>> > >It's true that in my proposal that the actual replication >>timeout >> we >> > >>>set >> > >>> > >on >> > >>> > >the request would be non-deterministic. However the flip side >>of >> > >>>that >> > >>> > >argument is that in the existing proposal the actual time >>until an >> > >>> > >acknowledgement is non-deterministic, right? So I think the >> argument >> > >>>I am >> > >>> > >trying to construct is that the two things the user cares about >> are >> > >>>the >> > >>> > >time to block and the time to ack and any other timeout we use >> > >>>internally >> > >>> > >is basically an implementation detail of ensuring this. >> > >>> > > >> > >>> > >Your point about the difference between batches and requests >>is a >> > >>>good >> > >>> > >one. >> > >>> > >I hadn't thought of that. So to make my proposal work we would >> need >> > >>>to do >> > >>> > >something like base the request time off the oldest batch. Let >>me >> > >>>think >> > >>> > >about the implications of that, it's definitely a problem. >> > >>> > > >> > >>> > >-Jay >> > >>> > > >> > >>> > >On Tue, May 19, 2015 at 12:42 PM, Jiangjie Qin >> > >>><j...@linkedin.com.invalid >> > >>> > > >> > >>> > >wrote: >> > >>> > > >> > >>> > >> Hey Jay, >> > >>> > >> >> > >>> > >> That is also a viable solution. >> > >>> > >> >> > >>> > >> I think the main purpose is to let user know how long they >>can >> > >>>block, >> > >>> > >> which is important. >> > >>> > >> >> > >>> > >> I have some question over the proposal, though. Will user >>still >> > >>>need to >> > >>> > >> send linger.ms? Will request timeout cover linger.ms as well? >> > >>> > >> My concern of letting request timeout also cover the time >>spent >> in >> > >>> > >> accumulator is that this will result in the actually request >> > >>>timeout >> > >>> > >> indeterministic. >> > >>> > >> Also, implementation wise, a request can have multiple >>batches, >> > >>>the time >> > >>> > >> spent in the accumulator could vary a lot. If one of the >>batch >> > >>>times >> > >>> > >>out, >> > >>> > >> what should we do the the rest of the batches? >> > >>> > >> I think we probably want to separate batch timeout and >>request >> > >>>timeout. >> > >>> > >> >> > >>> > >> Maybe we can do this: >> > >>> > >> Max.send.block.ms >> > >>> > >> Request.timeout >> > >>> > >> Batch.timeout >> > >>> > >> Replication.timeout >> > >>> > >> >> > >>> > >> So in send() we use max.send.block.ms only. In accumulator, >>we >> > use >> > >>> > >> batch.timeout, in NetWorkClient, we use request.timeout. >> > >>>Replication >> > >>> > >> timeout is needed anyway. >> > >>> > >> >> > >>> > >> This looks more understandable from what I can see. >> > >>> > >> >> > >>> > >> What do you think? >> > >>> > >> >> > >>> > >> Jiangjie (Becket) Qin >> > >>> > >> >> > >>> > >> On 5/19/15, 11:48 AM, "Jay Kreps" <jay.kr...@gmail.com> >>wrote: >> > >>> > >> >> > >>> > >> >So the alternative to consider would be to instead have >> > >>> > >> > max.block.ms (or something) >> > >>> > >> > request.timeout >> > >>> > >> > replication.timeout >> > >>> > >> > >> > >>> > >> >I think this better captures what the user cares about. >>Here is >> > >>>how it >> > >>> > >> >would work. >> > >>> > >> > >> > >>> > >> >*max.send.block.ms <http://max.send.block.ms>* is the bound >>on >> > >>>the >> > >>> > >> maximum >> > >>> > >> >time the producer.send() call can block. >> > >>> > >> >This subsumes the existing metadata timeout use case but not >> the >> > >>> > >>proposed >> > >>> > >> >use for the time in the accumulator. It *also* acts as a >>bound >> on >> > >>>the >> > >>> > >>time >> > >>> > >> >you can block on BufferPool allocation (we'd have to add >>this >> but >> > >>>that >> > >>> > >> >should be easy). >> > >>> > >> > >> > >>> > >> >*request.timeout* is the bound on the time after send() >> complete >> > >>>until >> > >>> > >>you >> > >>> > >> >get an acknowledgement. This covers the connection timeout, >>and >> > >>>the >> > >>> > >>time >> > >>> > >> >in >> > >>> > >> >the accumulator. So to implement this, the time we set in >>the >> > >>>request >> > >>> > >>sent >> > >>> > >> >via NetworkClient would have already subtracted off the time >> > >>>spent in >> > >>> > >>the >> > >>> > >> >accumulator, and if the request retried we would include >>both >> the >> > >>>time >> > >>> > >>in >> > >>> > >> >the accumulator an the time taken for the first request, >>etc. >> In >> > >>>other >> > >>> > >> >words this is the upper bound on the time to the Future >>being >> > >>> > >>satisfied. >> > >>> > >> > >> > >>> > >> >*replication.timeout* will default to something reasonable >>but >> > >>>maybe >> > >>> > >>you >> > >>> > >> >can override it if you want? >> > >>> > >> > >> > >>> > >> >Thoughts? >> > >>> > >> > >> > >>> > >> >-Jay >> > >>> > >> > >> > >>> > >> >On Tue, May 19, 2015 at 11:34 AM, Mayuresh Gharat < >> > >>> > >> >gharatmayures...@gmail.com> wrote: >> > >>> > >> > >> > >>> > >> >> So what I understand is that, we would have 3 time outs : >> > >>> > >> >> 1) replication timeout >> > >>> > >> >> 2) request timeout >> > >>> > >> >> 3) metadata timeout (existing) >> > >>> > >> >> >> > >>> > >> >> The request timeout has to be greater than the replication >> > >>>timeout. >> > >>> > >> >> request timeout is for messages already sent to kafka and >>the >> > >>> > >>producer >> > >>> > >> >>is >> > >>> > >> >> waiting for them. >> > >>> > >> >> >> > >>> > >> >> Thanks, >> > >>> > >> >> >> > >>> > >> >> Mayuresh >> > >>> > >> >> >> > >>> > >> >> On Tue, May 19, 2015 at 11:12 AM, Jay Kreps >> > >>><jay.kr...@gmail.com> >> > >>> > >> wrote: >> > >>> > >> >> >> > >>> > >> >> > I think this looks good. What I think is missing is an >> > >>>overview of >> > >>> > >>the >> > >>> > >> >> > timeouts from the user's perspective. >> > >>> > >> >> > >> > >>> > >> >> > My worry is that it is quite complicated to reason about >> the >> > >>> > >>current >> > >>> > >> >>set >> > >>> > >> >> of >> > >>> > >> >> > timeouts. Currently we have >> > >>> > >> >> > timeout.ms >> > >>> > >> >> > metadata.fetch.timeout.ms >> > >>> > >> >> > >> > >>> > >> >> > The proposed settings I think are: >> > >>> > >> >> > batch.expiration.ms >> > >>> > >> >> > request.timeout.ms >> > >>> > >> >> > replication.timeout.ms >> > >>> > >> >> > >> > >>> > >> >> > I think maybe we can skip the batch.expiration.ms. >>Instead >> > >>>maybe >> > >>> > we >> > >>> > >> >>can >> > >>> > >> >> > somehow combine these into a single request timeout so >>that >> > >>>we >> > >>> > >> >>subtract >> > >>> > >> >> the >> > >>> > >> >> > time you spent waiting from the request timeout and/or >> > >>>replication >> > >>> > >> >> timeout >> > >>> > >> >> > somehow? I don't have an explicit proposal but my >>suspicion >> > >>>is that >> > >>> > >> >>from >> > >>> > >> >> > the user's point of view there is just one timeout >>related >> to >> > >>>the >> > >>> > >> >>request >> > >>> > >> >> > after which they don't care, and we can split that up >> between >> > >>>the >> > >>> > >> >>batch >> > >>> > >> >> > time and the request time. Thoughts? >> > >>> > >> >> > >> > >>> > >> >> > How are we handling connection timeouts? If a machine >>hard >> > >>>fails in >> > >>> > >> >>the >> > >>> > >> >> > middle of connection establishment there will be no >> > >>>outstanding >> > >>> > >> >> requests. I >> > >>> > >> >> > think this may be okay because connections are >>established >> > >>>when we >> > >>> > >> >>want >> > >>> > >> >> to >> > >>> > >> >> > send a request and presumably we will begin the timer >>then? >> > >>> > >> >> > >> > >>> > >> >> > To that end I suggest we do two things: >> > >>> > >> >> > 1. Include KAKFA-1788. I know that technically these two >> > >>>things are >> > >>> > >> >> > different but from the user's point of view they aren't. >> > >>> > >> >> > 2. Include in the KIP the explanation to the user of the >> full >> > >>>set >> > >>> > >>of >> > >>> > >> >> > timeouts, what they mean, how we will default them, and >> when >> > >>>to >> > >>> > >> >>override >> > >>> > >> >> > which. >> > >>> > >> >> > >> > >>> > >> >> > I know this is a hassle but I think the end experience >>will >> > >>>be a >> > >>> > >>lot >> > >>> > >> >> better >> > >>> > >> >> > if we go through this thought process. >> > >>> > >> >> > >> > >>> > >> >> > -Jay >> > >>> > >> >> > >> > >>> > >> >> > On Fri, May 15, 2015 at 2:14 PM, Jiangjie Qin >> > >>> > >> >><j...@linkedin.com.invalid >> > >>> > >> >> > >> > >>> > >> >> > wrote: >> > >>> > >> >> > >> > >>> > >> >> > > I modified the WIKI page to incorporate the feedbacks >> from >> > >>> > >>mailing >> > >>> > >> >>list >> > >>> > >> >> > > and KIP hangout. >> > >>> > >> >> > > >> > >>> > >> >> > > - Added the deprecation plan for TIMEOUT_CONFIG >> > >>> > >> >> > > - Added the actions to take after request timeout >> > >>> > >> >> > > >> > >>> > >> >> > > I finally chose to create a new connection if requests >> > >>>timeout. >> > >>> > >>The >> > >>> > >> >> > reason >> > >>> > >> >> > > is: >> > >>> > >> >> > > 1. In most cases, if a broker is just slow, as long >>as we >> > >>>set >> > >>> > >> >>request >> > >>> > >> >> > > timeout to be a reasonable value, we should not see >>many >> > >>>new >> > >>> > >> >> connections >> > >>> > >> >> > > get created. >> > >>> > >> >> > > 2. If a broker is down, hopefully metadata refresh >>will >> > >>>find the >> > >>> > >>new >> > >>> > >> >> > > broker and we will not try to reconnect to the broker >> > >>>anymore. >> > >>> > >> >> > > >> > >>> > >> >> > > Comments are welcome! >> > >>> > >> >> > > >> > >>> > >> >> > > Thanks. >> > >>> > >> >> > > >> > >>> > >> >> > > Jiangjie (Becket) Qin >> > >>> > >> >> > > >> > >>> > >> >> > > On 5/12/15, 2:59 PM, "Mayuresh Gharat" >> > >>> > >><gharatmayures...@gmail.com> >> > >>> > >> >> > wrote: >> > >>> > >> >> > > >> > >>> > >> >> > > >+1 Becket. That would give enough time for clients to >> > >>>move. We >> > >>> > >> >>should >> > >>> > >> >> > make >> > >>> > >> >> > > >this change very clear. >> > >>> > >> >> > > > >> > >>> > >> >> > > >Thanks, >> > >>> > >> >> > > > >> > >>> > >> >> > > >Mayuresh >> > >>> > >> >> > > > >> > >>> > >> >> > > >On Tue, May 12, 2015 at 1:45 PM, Jiangjie Qin >> > >>> > >> >> <j...@linkedin.com.invalid >> > >>> > >> >> > > >> > >>> > >> >> > > >wrote: >> > >>> > >> >> > > > >> > >>> > >> >> > > >> Hey Ewen, >> > >>> > >> >> > > >> >> > >>> > >> >> > > >> Very good summary about the compatibility. What you >> > >>>proposed >> > >>> > >> >>makes >> > >>> > >> >> > > >>sense. >> > >>> > >> >> > > >> So basically we can do the following: >> > >>> > >> >> > > >> >> > >>> > >> >> > > >> In next release, i.e. 0.8.3: >> > >>> > >> >> > > >> 1. Add REPLICATION_TIMEOUT_CONFIG >> > >>>(“replication.timeout.ms”) >> > >>> > >> >> > > >> 2. Mark TIMEOUT_CONFIG as deprecated >> > >>> > >> >> > > >> 3. Override REPLICATION_TIMEOUT_CONFIG with >> > >>>TIMEOUT_CONFIG if >> > >>> > >>it >> > >>> > >> >>is >> > >>> > >> >> > > >> defined and give a warning about deprecation. >> > >>> > >> >> > > >> In the release after 0.8.3, we remove >>TIMEOUT_CONFIG. >> > >>> > >> >> > > >> >> > >>> > >> >> > > >> This should give enough buffer for this change. >> > >>> > >> >> > > >> >> > >>> > >> >> > > >> Request timeout is a complete new thing we add to >>fix >> a >> > >>>bug, >> > >>> > >>I’m >> > >>> > >> >> with >> > >>> > >> >> > > >>you >> > >>> > >> >> > > >> it does not make sense to have it maintain the old >> buggy >> > >>> > >> >>behavior. >> > >>> > >> >> So >> > >>> > >> >> > we >> > >>> > >> >> > > >> can set it to a reasonable value instead of >>infinite. >> > >>> > >> >> > > >> >> > >>> > >> >> > > >> Jiangjie (Becket) Qin >> > >>> > >> >> > > >> >> > >>> > >> >> > > >> On 5/12/15, 12:03 PM, "Ewen Cheslack-Postava" >> > >>> > >><e...@confluent.io >> > >>> > >> > >> > >>> > >> >> > > wrote: >> > >>> > >> >> > > >> >> > >>> > >> >> > > >> >I think my confusion is coming from this: >> > >>> > >> >> > > >> > >> > >>> > >> >> > > >> >> So in this KIP, we only address (3). The only >> public >> > >>> > >>interface >> > >>> > >> >> > change >> > >>> > >> >> > > >> >>is a >> > >>> > >> >> > > >> >> new configuration of request timeout (and maybe >> > >>>change the >> > >>> > >> >> > > >>configuration >> > >>> > >> >> > > >> >> name of TIMEOUT_CONFIG to >> > >>>REPLICATION_TIMEOUT_CONFIG). >> > >>> > >> >> > > >> > >> > >>> > >> >> > > >> >There are 3 possible compatibility issues I see >>here: >> > >>> > >> >> > > >> > >> > >>> > >> >> > > >> >* I assumed this meant the constants also change, >>so >> > >>> > >> >>"timeout.ms" >> > >>> > >> >> > > >>becomes >> > >>> > >> >> > > >> >" >> > >>> > >> >> > > >> >replication.timeout.ms". This breaks config files >> that >> > >>> > worked >> > >>> > >> on >> > >>> > >> >> the >> > >>> > >> >> > > >> >previous version and the only warning would be in >> > >>>release >> > >>> > >> >>notes. We >> > >>> > >> >> > do >> > >>> > >> >> > > >> >warn >> > >>> > >> >> > > >> >about unused configs so they might notice the >> problem. >> > >>> > >> >> > > >> > >> > >>> > >> >> > > >> >* Binary and source compatibility if someone >> configures >> > >>>their >> > >>> > >> >> client >> > >>> > >> >> > in >> > >>> > >> >> > > >> >code and uses the TIMEOUT_CONFIG variable. >>Renaming >> it >> > >>>will >> > >>> > >> >>cause >> > >>> > >> >> > > >>existing >> > >>> > >> >> > > >> >jars to break if you try to run against an updated >> > >>>client >> > >>> > >>(which >> > >>> > >> >> > seems >> > >>> > >> >> > > >>not >> > >>> > >> >> > > >> >very significant since I doubt people upgrade >>these >> > >>>without >> > >>> > >> >> > recompiling >> > >>> > >> >> > > >> >but >> > >>> > >> >> > > >> >maybe I'm wrong about that). And it breaks builds >> > >>>without >> > >>> > >>have >> > >>> > >> >> > > >>deprecated >> > >>> > >> >> > > >> >that field first, which again, is probably not the >> > >>>biggest >> > >>> > >>issue >> > >>> > >> >> but >> > >>> > >> >> > is >> > >>> > >> >> > > >> >annoying for users and when we accidentally >>changed >> the >> > >>>API >> > >>> > >>we >> > >>> > >> >> > > >>received a >> > >>> > >> >> > > >> >complaint about breaking builds. >> > >>> > >> >> > > >> > >> > >>> > >> >> > > >> >* Behavior compatibility as Jay mentioned on the >>call >> > >>>-- >> > >>> > >>setting >> > >>> > >> >> the >> > >>> > >> >> > > >> >config >> > >>> > >> >> > > >> >(even if the name changed) doesn't have the same >> effect >> > >>>it >> > >>> > >>used >> > >>> > >> >>to. >> > >>> > >> >> > > >> > >> > >>> > >> >> > > >> >One solution, which admittedly is more painful to >> > >>>implement >> > >>> > >>and >> > >>> > >> >> > > >>maintain, >> > >>> > >> >> > > >> >would be to maintain the timeout.ms config, have >>it >> > >>>override >> > >>> > >> the >> > >>> > >> >> > > others >> > >>> > >> >> > > >> if >> > >>> > >> >> > > >> >it is specified (including an infinite request >> timeout >> > >>>I >> > >>> > >> >>guess?), >> > >>> > >> >> and >> > >>> > >> >> > > >>if >> > >>> > >> >> > > >> >it >> > >>> > >> >> > > >> >isn't specified, we can just use the new config >> > >>>variables. >> > >>> > >> >>Given a >> > >>> > >> >> > real >> > >>> > >> >> > > >> >deprecation schedule, users would have better >>warning >> > >>>of >> > >>> > >>changes >> > >>> > >> >> and >> > >>> > >> >> > a >> > >>> > >> >> > > >> >window to make the changes. >> > >>> > >> >> > > >> > >> > >>> > >> >> > > >> >I actually think it might not be necessary to >> maintain >> > >>>the >> > >>> > >>old >> > >>> > >> >> > behavior >> > >>> > >> >> > > >> >precisely, although maybe for some code it is an >> issue >> > >>>if >> > >>> > >>they >> > >>> > >> >> start >> > >>> > >> >> > > >> >seeing >> > >>> > >> >> > > >> >timeout exceptions that they wouldn't have seen >> before? >> > >>> > >> >> > > >> > >> > >>> > >> >> > > >> >-Ewen >> > >>> > >> >> > > >> > >> > >>> > >> >> > > >> >On Wed, May 6, 2015 at 6:06 PM, Jun Rao >> > >>><j...@confluent.io> >> > >>> > >> >>wrote: >> > >>> > >> >> > > >> > >> > >>> > >> >> > > >> >> Jiangjie, >> > >>> > >> >> > > >> >> >> > >>> > >> >> > > >> >> Yes, I think using metadata timeout to expire >> batches >> > >>>in >> > >>> > >>the >> > >>> > >> >> record >> > >>> > >> >> > > >> >> accumulator makes sense. >> > >>> > >> >> > > >> >> >> > >>> > >> >> > > >> >> Thanks, >> > >>> > >> >> > > >> >> >> > >>> > >> >> > > >> >> Jun >> > >>> > >> >> > > >> >> >> > >>> > >> >> > > >> >> On Mon, May 4, 2015 at 10:32 AM, Jiangjie Qin >> > >>> > >> >> > > >> >><j...@linkedin.com.invalid> >> > >>> > >> >> > > >> >> wrote: >> > >>> > >> >> > > >> >> >> > >>> > >> >> > > >> >> > I incorporated Ewen and Guozhang’s comments in >> the >> > >>>KIP >> > >>> > >>page. >> > >>> > >> >> Want >> > >>> > >> >> > > >>to >> > >>> > >> >> > > >> >> speed >> > >>> > >> >> > > >> >> > up on this KIP because currently we experience >> > >>> > >>mirror-maker >> > >>> > >> >> hung >> > >>> > >> >> > > >>very >> > >>> > >> >> > > >> >> > likely when a broker is down. >> > >>> > >> >> > > >> >> > >> > >>> > >> >> > > >> >> > I also took a shot to solve KAFKA-1788 in >> > >>>KAFKA-2142. I >> > >>> > >>used >> > >>> > >> >> > > >>metadata >> > >>> > >> >> > > >> >> > timeout to expire the batches which are >>sitting >> in >> > >>> > >> >>accumulator >> > >>> > >> >> > > >>without >> > >>> > >> >> > > >> >> > leader info. I did that because the situation >> there >> > >>>is >> > >>> > >> >> > essentially >> > >>> > >> >> > > >> >> missing >> > >>> > >> >> > > >> >> > metadata. >> > >>> > >> >> > > >> >> > >> > >>> > >> >> > > >> >> > As a summary of what I am thinking about the >> > >>>timeout in >> > >>> > >>new >> > >>> > >> >> > > >>Producer: >> > >>> > >> >> > > >> >> > >> > >>> > >> >> > > >> >> > 1. Metadata timeout: >> > >>> > >> >> > > >> >> > - used in send(), blocking >> > >>> > >> >> > > >> >> > - used in accumulator to expire batches with >> > >>>timeout >> > >>> > >> >> exception. >> > >>> > >> >> > > >> >> > 2. Linger.ms >> > >>> > >> >> > > >> >> > - Used in accumulator to ready the batch for >> > >>>drain >> > >>> > >> >> > > >> >> > 3. Request timeout >> > >>> > >> >> > > >> >> > - Used in NetworkClient to expire a batch >>and >> > >>>retry if >> > >>> > >>no >> > >>> > >> >> > > >>response >> > >>> > >> >> > > >> >>is >> > >>> > >> >> > > >> >> > received for a request before timeout. >> > >>> > >> >> > > >> >> > >> > >>> > >> >> > > >> >> > So in this KIP, we only address (3). The only >> > >>>public >> > >>> > >> >>interface >> > >>> > >> >> > > >>change >> > >>> > >> >> > > >> >>is >> > >>> > >> >> > > >> >> a >> > >>> > >> >> > > >> >> > new configuration of request timeout (and >>maybe >> > >>>change >> > >>> > >>the >> > >>> > >> >> > > >> >>configuration >> > >>> > >> >> > > >> >> > name of TIMEOUT_CONFIG to >> > >>>REPLICATION_TIMEOUT_CONFIG). >> > >>> > >> >> > > >> >> > >> > >>> > >> >> > > >> >> > Would like to see what people think of above >> > >>>approach? >> > >>> > >> >> > > >> >> > >> > >>> > >> >> > > >> >> > Jiangjie (Becket) Qin >> > >>> > >> >> > > >> >> > >> > >>> > >> >> > > >> >> > On 4/20/15, 6:02 PM, "Jiangjie Qin" >> > >>><j...@linkedin.com> >> > >>> > >> >>wrote: >> > >>> > >> >> > > >> >> > >> > >>> > >> >> > > >> >> > >Jun, >> > >>> > >> >> > > >> >> > > >> > >>> > >> >> > > >> >> > >I thought a little bit differently on this. >> > >>> > >> >> > > >> >> > >Intuitively, I am thinking that if a >>partition >> is >> > >>> > >>offline, >> > >>> > >> >>the >> > >>> > >> >> > > >> >>metadata >> > >>> > >> >> > > >> >> > >for that partition should be considered not >> ready >> > >>> > >>because >> > >>> > >> >>we >> > >>> > >> >> > don’t >> > >>> > >> >> > > >> >>know >> > >>> > >> >> > > >> >> > >which broker we should send the message to. >>So >> > >>>those >> > >>> > >>sends >> > >>> > >> >> need >> > >>> > >> >> > > >>to be >> > >>> > >> >> > > >> >> > >blocked on metadata timeout. >> > >>> > >> >> > > >> >> > >Another thing I’m wondering is in which >>scenario >> > >>>an >> > >>> > >>offline >> > >>> > >> >> > > >>partition >> > >>> > >> >> > > >> >> will >> > >>> > >> >> > > >> >> > >become online again in a short period of time >> and >> > >>>how >> > >>> > >> >>likely >> > >>> > >> >> it >> > >>> > >> >> > > >>will >> > >>> > >> >> > > >> >> > >occur. My understanding is that the batch >> timeout >> > >>>for >> > >>> > >> >>batches >> > >>> > >> >> > > >> >>sitting in >> > >>> > >> >> > > >> >> > >accumulator should be larger than linger.ms >>but >> > >>>should >> > >>> > >>not >> > >>> > >> >>be >> > >>> > >> >> > too >> > >>> > >> >> > > >> >>long >> > >>> > >> >> > > >> >> > >(e.g. less than 60 seconds). Otherwise it >>will >> > >>>exhaust >> > >>> > >>the >> > >>> > >> >> > shared >> > >>> > >> >> > > >> >>buffer >> > >>> > >> >> > > >> >> > >with batches to be aborted. >> > >>> > >> >> > > >> >> > > >> > >>> > >> >> > > >> >> > >That said, I do agree it is reasonable to >>buffer >> > >>>the >> > >>> > >> >>message >> > >>> > >> >> for >> > >>> > >> >> > > >>some >> > >>> > >> >> > > >> >> time >> > >>> > >> >> > > >> >> > >so messages to other partitions can still get >> > >>>sent. But >> > >>> > >> >>adding >> > >>> > >> >> > > >> >>another >> > >>> > >> >> > > >> >> > >expiration in addition to linger.ms - which >>is >> > >>> > >>essentially >> > >>> > >> >>a >> > >>> > >> >> > > >>timeout >> > >>> > >> >> > > >> >>- >> > >>> > >> >> > > >> >> > >sounds a little bit confusing. Maybe we can >>do >> > >>>this, let >> > >>> > >> >>the >> > >>> > >> >> > batch >> > >>> > >> >> > > >> >>sit >> > >>> > >> >> > > >> >> in >> > >>> > >> >> > > >> >> > >accumulator up to linger.ms, then fail it if >> > >>>necessary. >> > >>> > >> >> > > >> >> > > >> > >>> > >> >> > > >> >> > >What do you think? >> > >>> > >> >> > > >> >> > > >> > >>> > >> >> > > >> >> > >Thanks, >> > >>> > >> >> > > >> >> > > >> > >>> > >> >> > > >> >> > >Jiangjie (Becket) Qin >> > >>> > >> >> > > >> >> > > >> > >>> > >> >> > > >> >> > >On 4/20/15, 1:11 PM, "Jun Rao" < >> j...@confluent.io> >> > >>> > wrote: >> > >>> > >> >> > > >> >> > > >> > >>> > >> >> > > >> >> > >>Jiangjie, >> > >>> > >> >> > > >> >> > >> >> > >>> > >> >> > > >> >> > >>Allowing messages to be accumulated in an >> offline >> > >>> > >> >>partition >> > >>> > >> >> > > >>could be >> > >>> > >> >> > > >> >> > >>useful >> > >>> > >> >> > > >> >> > >>since the partition may become available >>before >> > >>>the >> > >>> > >> >>request >> > >>> > >> >> > > >>timeout >> > >>> > >> >> > > >> >>or >> > >>> > >> >> > > >> >> > >>linger time is reached. Now that we are >> planning >> > >>>to >> > >>> > >>add a >> > >>> > >> >>new >> > >>> > >> >> > > >> >>timeout, >> > >>> > >> >> > > >> >> it >> > >>> > >> >> > > >> >> > >>would be useful to think through whether/how >> that >> > >>> > >>applies >> > >>> > >> >>to >> > >>> > >> >> > > >> >>messages >> > >>> > >> >> > > >> >> in >> > >>> > >> >> > > >> >> > >>the accumulator too. >> > >>> > >> >> > > >> >> > >> >> > >>> > >> >> > > >> >> > >>Thanks, >> > >>> > >> >> > > >> >> > >> >> > >>> > >> >> > > >> >> > >>Jun >> > >>> > >> >> > > >> >> > >> >> > >>> > >> >> > > >> >> > >> >> > >>> > >> >> > > >> >> > >>On Thu, Apr 16, 2015 at 1:02 PM, Jiangjie >>Qin >> > >>> > >> >> > > >> >> <j...@linkedin.com.invalid >> > >>> > >> >> > > >> >> > > >> > >>> > >> >> > > >> >> > >>wrote: >> > >>> > >> >> > > >> >> > >> >> > >>> > >> >> > > >> >> > >>> Hi Harsha, >> > >>> > >> >> > > >> >> > >>> >> > >>> > >> >> > > >> >> > >>> Took a quick look at the patch. I think >>it is >> > >>>still a >> > >>> > >> >> little >> > >>> > >> >> > > >>bit >> > >>> > >> >> > > >> >> > >>> different. KAFKA-1788 only handles the >>case >> > >>>where a >> > >>> > >> >>batch >> > >>> > >> >> > > >>sitting >> > >>> > >> >> > > >> >>in >> > >>> > >> >> > > >> >> > >>> accumulator for too long. The KIP is >>trying >> to >> > >>>solve >> > >>> > >>the >> > >>> > >> >> > issue >> > >>> > >> >> > > >> >>where >> > >>> > >> >> > > >> >> a >> > >>> > >> >> > > >> >> > >>> batch has already been drained from >> accumulator >> > >>>and >> > >>> > >> >>sent to >> > >>> > >> >> > > >> >>broker. >> > >>> > >> >> > > >> >> > >>> We might be able to apply timeout on batch >> > >>>level to >> > >>> > >> >>merge >> > >>> > >> >> > those >> > >>> > >> >> > > >> >>two >> > >>> > >> >> > > >> >> > >>>cases >> > >>> > >> >> > > >> >> > >>> as Ewen suggested. But I’m not sure if it >>is >> a >> > >>>good >> > >>> > >> >>idea to >> > >>> > >> >> > > >>allow >> > >>> > >> >> > > >> >> > >>>messages >> > >>> > >> >> > > >> >> > >>> whose target partition is offline to sit >>in >> > >>> > >>accumulator >> > >>> > >> >>in >> > >>> > >> >> > the >> > >>> > >> >> > > >> >>first >> > >>> > >> >> > > >> >> > >>>place. >> > >>> > >> >> > > >> >> > >>> >> > >>> > >> >> > > >> >> > >>> Jiangjie (Becket) Qin >> > >>> > >> >> > > >> >> > >>> >> > >>> > >> >> > > >> >> > >>> On 4/16/15, 10:19 AM, "Sriharsha >> Chintalapani" >> > >>> > >> >> > > >><ka...@harsha.io> >> > >>> > >> >> > > >> >> > wrote: >> > >>> > >> >> > > >> >> > >>> >> > >>> > >> >> > > >> >> > >>> >Guozhang and Jiangjie, >> > >>> > >> >> > > >> >> > >>> > Isn’t this work being >> covered >> > >>>in >> > >>> > >> >> > > >> >> > >>> >> > >>>>https://issues.apache.org/jira/browse/KAFKA-1788 . >> > >>> > >>Can >> > >>> > >> >> you >> > >>> > >> >> > > >> please >> > >>> > >> >> > > >> >> the >> > >>> > >> >> > > >> >> > >>> >review the patch there. >> > >>> > >> >> > > >> >> > >>> >Thanks, >> > >>> > >> >> > > >> >> > >>> >Harsha >> > >>> > >> >> > > >> >> > >>> > >> > >>> > >> >> > > >> >> > >>> > >> > >>> > >> >> > > >> >> > >>> >On April 15, 2015 at 10:39:40 PM, >>Guozhang >> > >>>Wang >> > >>> > >> >> > > >> >>(wangg...@gmail.com >> > >>> > >> >> > > >> >> ) >> > >>> > >> >> > > >> >> > >>> >wrote: >> > >>> > >> >> > > >> >> > >>> > >> > >>> > >> >> > > >> >> > >>> >Thanks for the update Jiangjie, >> > >>> > >> >> > > >> >> > >>> > >> > >>> > >> >> > > >> >> > >>> >I think it is actually NOT expected that >> > >>>hardware >> > >>> > >> >> > > >>disconnection >> > >>> > >> >> > > >> >>will >> > >>> > >> >> > > >> >> > >>>be >> > >>> > >> >> > > >> >> > >>> >detected by the selector, but rather will >> only >> > >>>be >> > >>> > >> >>revealed >> > >>> > >> >> > > >>upon >> > >>> > >> >> > > >> >>TCP >> > >>> > >> >> > > >> >> > >>> >timeout, which could be hours. >> > >>> > >> >> > > >> >> > >>> > >> > >>> > >> >> > > >> >> > >>> >A couple of comments on the wiki: >> > >>> > >> >> > > >> >> > >>> > >> > >>> > >> >> > > >> >> > >>> >1. "For KafkaProducer.close() and >> > >>> > >> >>KafkaProducer.flush() we >> > >>> > >> >> > > >>need >> > >>> > >> >> > > >> >>the >> > >>> > >> >> > > >> >> > >>> >request >> > >>> > >> >> > > >> >> > >>> >timeout as implict timeout." I am not >>very >> > >>>clear >> > >>> > >>what >> > >>> > >> >>does >> > >>> > >> >> > > >>this >> > >>> > >> >> > > >> >> mean? >> > >>> > >> >> > > >> >> > >>> > >> > >>> > >> >> > > >> >> > >>> >2. Currently the producer already has a >> > >>> > >> >>"TIMEOUT_CONFIG" >> > >>> > >> >> > which >> > >>> > >> >> > > >> >> should >> > >>> > >> >> > > >> >> > >>> >really be "REPLICATION_TIMEOUT_CONFIG". >>So >> if >> > >>>we >> > >>> > >> >>decide to >> > >>> > >> >> > > >>add " >> > >>> > >> >> > > >> >> > >>> >REQUEST_TIMEOUT_CONFIG", I suggest we >>also >> > >>>make this >> > >>> > >> >> > renaming: >> > >>> > >> >> > > >> >> > >>>admittedly >> > >>> > >> >> > > >> >> > >>> > >> > >>> > >> >> > > >> >> > >>> >it will change the config names but will >> > >>>reduce >> > >>> > >> >>confusions >> > >>> > >> >> > > >>moving >> > >>> > >> >> > > >> >> > >>> >forward. >> > >>> > >> >> > > >> >> > >>> > >> > >>> > >> >> > > >> >> > >>> > >> > >>> > >> >> > > >> >> > >>> >Guozhang >> > >>> > >> >> > > >> >> > >>> > >> > >>> > >> >> > > >> >> > >>> > >> > >>> > >> >> > > >> >> > >>> >On Wed, Apr 15, 2015 at 6:48 PM, Jiangjie >> Qin >> > >>> > >> >> > > >> >> > >>><j...@linkedin.com.invalid> >> > >>> > >> >> > > >> >> > >>> > >> > >>> > >> >> > > >> >> > >>> >wrote: >> > >>> > >> >> > > >> >> > >>> > >> > >>> > >> >> > > >> >> > >>> >> Checked the code again. It seems that >>the >> > >>> > >> >>disconnected >> > >>> > >> >> > > >>channel >> > >>> > >> >> > > >> >>is >> > >>> > >> >> > > >> >> > >>>not >> > >>> > >> >> > > >> >> > >>> >> detected by selector as expected. >> > >>> > >> >> > > >> >> > >>> >> >> > >>> > >> >> > > >> >> > >>> >> Currently we are depending on the >> > >>> > >> >> > > >> >> > >>> >> >>o.a.k.common.network.Selector.disconnected >> > >>>set to >> > >>> > >> >>see if >> > >>> > >> >> > we >> > >>> > >> >> > > >> >>need >> > >>> > >> >> > > >> >> to >> > >>> > >> >> > > >> >> > >>>do >> > >>> > >> >> > > >> >> > >>> >> something for a disconnected channel. >> > >>> > >> >> > > >> >> > >>> >> However Selector.disconnected set is >>only >> > >>>updated >> > >>> > >> >>when: >> > >>> > >> >> > > >> >> > >>> >> 1. A write/read/connect to channel >>failed. >> > >>> > >> >> > > >> >> > >>> >> 2. A Key is canceled >> > >>> > >> >> > > >> >> > >>> >> However when a broker is down before it >> > >>>sends back >> > >>> > >> >>the >> > >>> > >> >> > > >> >>response, >> > >>> > >> >> > > >> >> the >> > >>> > >> >> > > >> >> > >>> >> client seems not be able to detect this >> > >>>failure. >> > >>> > >> >> > > >> >> > >>> >> >> > >>> > >> >> > > >> >> > >>> >> I did a simple test below: >> > >>> > >> >> > > >> >> > >>> >> 1. Run a selector on one machine and an >> echo >> > >>> > >>server >> > >>> > >> >>on >> > >>> > >> >> > > >>another >> > >>> > >> >> > > >> >> > >>>machine. >> > >>> > >> >> > > >> >> > >>> >> >> > >>> > >> >> > > >> >> > >>> >> Connect a selector to an echo server >> > >>> > >> >> > > >> >> > >>> >> 2. Send a message to echo server using >> > >>>selector, >> > >>> > >>then >> > >>> > >> >> let >> > >>> > >> >> > > >>the >> > >>> > >> >> > > >> >> > >>>selector >> > >>> > >> >> > > >> >> > >>> >> poll() every 10 seconds. >> > >>> > >> >> > > >> >> > >>> >> 3. After the sever received the >>message, >> > >>>unplug >> > >>> > >> >>cable on >> > >>> > >> >> > the >> > >>> > >> >> > > >> >>echo >> > >>> > >> >> > > >> >> > >>> >>server. >> > >>> > >> >> > > >> >> > >>> >> 4. After waiting for 45 min. The >>selector >> > >>>still >> > >>> > >>did >> > >>> > >> >>not >> > >>> > >> >> > > >> >>detected >> > >>> > >> >> > > >> >> the >> > >>> > >> >> > > >> >> > >>> >> network failure. >> > >>> > >> >> > > >> >> > >>> >> Lsof on selector machine shows that the >> TCP >> > >>> > >> >>connection >> > >>> > >> >> is >> > >>> > >> >> > > >>still >> > >>> > >> >> > > >> >> > >>> >>considered >> > >>> > >> >> > > >> >> > >>> >> ESTABLISHED. >> > >>> > >> >> > > >> >> > >>> >> >> > >>> > >> >> > > >> >> > >>> >> I’m not sure in this case what should >>we >> > >>>expect >> > >>> > >>from >> > >>> > >> >>the >> > >>> > >> >> > > >> >> > >>> >> java.nio.channels.Selector. According >>to >> the >> > >>> > >> >>document, >> > >>> > >> >> the >> > >>> > >> >> > > >> >> selector >> > >>> > >> >> > > >> >> > >>> >>does >> > >>> > >> >> > > >> >> > >>> >> not verify the status of the associated >> > >>>channel. >> > >>> > >>In >> > >>> > >> >>my >> > >>> > >> >> > test >> > >>> > >> >> > > >> >>case >> > >>> > >> >> > > >> >> it >> > >>> > >> >> > > >> >> > >>> >>looks >> > >>> > >> >> > > >> >> > >>> >> even worse that OS did not think of the >> > >>>socket has >> > >>> > >> >>been >> > >>> > >> >> > > >> >> > >>>disconnected. >> > >>> > >> >> > > >> >> > >>> >> >> > >>> > >> >> > > >> >> > >>> >> Anyway. It seems adding the client side >> > >>>request >> > >>> > >> >>timeout >> > >>> > >> >> is >> > >>> > >> >> > > >> >> > >>>necessary. >> > >>> > >> >> > > >> >> > >>> >>I’ve >> > >>> > >> >> > > >> >> > >>> >> updated the KIP page to clarify the >> problem >> > >>>we >> > >>> > >>want >> > >>> > >> >>to >> > >>> > >> >> > solve >> > >>> > >> >> > > >> >> > >>>according >> > >>> > >> >> > > >> >> > >>> >>to >> > >>> > >> >> > > >> >> > >>> >> Ewen’s comments. >> > >>> > >> >> > > >> >> > >>> >> >> > >>> > >> >> > > >> >> > >>> >> Thanks. >> > >>> > >> >> > > >> >> > >>> >> >> > >>> > >> >> > > >> >> > >>> >> Jiangjie (Becket) Qin >> > >>> > >> >> > > >> >> > >>> >> >> > >>> > >> >> > > >> >> > >>> >> On 4/14/15, 3:38 PM, "Ewen >> Cheslack-Postava" >> > >>> > >> >> > > >> >><e...@confluent.io> >> > >>> > >> >> > > >> >> > >>>wrote: >> > >>> > >> >> > > >> >> > >>> >> >> > >>> > >> >> > > >> >> > >>> >> >> > >>> > >> >> > > >> >> > >>> >> >On Tue, Apr 14, 2015 at 1:57 PM, >>Jiangjie >> > >>>Qin >> > >>> > >> >> > > >> >> > >>> >><j...@linkedin.com.invalid> >> > >>> > >> >> > > >> >> > >>> >> >wrote: >> > >>> > >> >> > > >> >> > >>> >> > >> > >>> > >> >> > > >> >> > >>> >> >> Hi Ewen, thanks for the comments. >>Very >> > >>>good >> > >>> > >> >>points! >> > >>> > >> >> > > >>Please >> > >>> > >> >> > > >> >>see >> > >>> > >> >> > > >> >> > >>> >>replies >> > >>> > >> >> > > >> >> > >>> >> >> inline. >> > >>> > >> >> > > >> >> > >>> >> >> >> > >>> > >> >> > > >> >> > >>> >> >> >> > >>> > >> >> > > >> >> > >>> >> >> On 4/13/15, 11:19 PM, "Ewen >> > >>>Cheslack-Postava" < >> > >>> > >> >> > > >> >> e...@confluent.io >> > >>> > >> >> > > >> >> > > >> > >>> > >> >> > > >> >> > >>> >> wrote: >> > >>> > >> >> > > >> >> > >>> >> >> >> > >>> > >> >> > > >> >> > >>> >> >> >Jiangjie, >> > >>> > >> >> > > >> >> > >>> >> >> > >> > >>> > >> >> > > >> >> > >>> >> >> >Great start. I have a couple of >> > >>>comments. >> > >>> > >> >> > > >> >> > >>> >> >> > >> > >>> > >> >> > > >> >> > >>> >> >> >Under the motivation section, is it >> > >>>really >> > >>> > >>true >> > >>> > >> >>that >> > >>> > >> >> > the >> > >>> > >> >> > > >> >> request >> > >>> > >> >> > > >> >> > >>> >>will >> > >>> > >> >> > > >> >> > >>> >> >> >never >> > >>> > >> >> > > >> >> > >>> >> >> >be completed? Presumably if the >>broker >> > >>>goes >> > >>> > >>down >> > >>> > >> >>the >> > >>> > >> >> > > >> >> connection >> > >>> > >> >> > > >> >> > >>> >>will be >> > >>> > >> >> > > >> >> > >>> >> >> >severed, at worst by a TCP timeout, >> > >>>which >> > >>> > >>should >> > >>> > >> >> clean >> > >>> > >> >> > > >>up >> > >>> > >> >> > > >> >>the >> > >>> > >> >> > > >> >> > >>> >> >>connection >> > >>> > >> >> > > >> >> > >>> >> >> >and any outstanding requests, >>right? I >> > >>>think >> > >>> > >>the >> > >>> > >> >> real >> > >>> > >> >> > > >> >>reason >> > >>> > >> >> > > >> >> we >> > >>> > >> >> > > >> >> > >>> >>need a >> > >>> > >> >> > > >> >> > >>> >> >> >different timeout is that the >>default >> > >>>TCP >> > >>> > >> >>timeouts >> > >>> > >> >> are >> > >>> > >> >> > > >> >> > >>>ridiculously >> > >>> > >> >> > > >> >> > >>> >> >> > >>> > >> >> > > >> >> > >>> >> >>long >> > >>> > >> >> > > >> >> > >>> >> >> >in >> > >>> > >> >> > > >> >> > >>> >> >> >this context. >> > >>> > >> >> > > >> >> > >>> >> >> Yes, when broker is completely down >>the >> > >>>request >> > >>> > >> >> should >> > >>> > >> >> > be >> > >>> > >> >> > > >> >> cleared >> > >>> > >> >> > > >> >> > >>>as >> > >>> > >> >> > > >> >> > >>> >>you >> > >>> > >> >> > > >> >> > >>> >> >> said. The case we encountered looks >> like >> > >>>the >> > >>> > >> >>broker >> > >>> > >> >> was >> > >>> > >> >> > > >>just >> > >>> > >> >> > > >> >> not >> > >>> > >> >> > > >> >> > >>> >> >> responding but TCP connection was >>still >> > >>>alive >> > >>> > >> >>though. >> > >>> > >> >> > > >> >> > >>> >> >> >> > >>> > >> >> > > >> >> > >>> >> > >> > >>> > >> >> > > >> >> > >>> >> >Ok, that makes sense. >> > >>> > >> >> > > >> >> > >>> >> > >> > >>> > >> >> > > >> >> > >>> >> > >> > >>> > >> >> > > >> >> > >>> >> >> >> > >>> > >> >> > > >> >> > >>> >> >> > >> > >>> > >> >> > > >> >> > >>> >> >> >My second question is about whether >> > >>>this >> > >>>is >> > >>> > >>the >> > >>> > >> >> right >> > >>> > >> >> > > >> >>level to >> > >>> > >> >> > > >> >> > >>> >>tackle >> > >>> > >> >> > > >> >> > >>> >> >>the >> > >>> > >> >> > > >> >> > >>> >> >> >issue/what user-facing changes >>need to >> > >>>be >> > >>> > >>made. A >> > >>> > >> >> > > >>related >> > >>> > >> >> > > >> >> > >>>problem >> > >>> > >> >> > > >> >> > >>> >>came >> > >>> > >> >> > > >> >> > >>> >> >>up >> > >>> > >> >> > > >> >> > >>> >> >> >in >> > >>> > >> >>https://issues.apache.org/jira/browse/KAFKA-1788 >> > >>> > >> >> > > >>where >> > >>> > >> >> > > >> >> > >>>producer >> > >>> > >> >> > > >> >> > >>> >> >> records >> > >>> > >> >> > > >> >> > >>> >> >> >get stuck indefinitely because >>there's >> > >>>no >> > >>> > >> >> client-side >> > >>> > >> >> > > >> >>timeout. >> > >>> > >> >> > > >> >> > >>>This >> > >>> > >> >> > > >> >> > >>> >>KIP >> > >>> > >> >> > > >> >> > >>> >> >> >wouldn't fix that problem or any >> > >>>problems >> > >>> > >>caused >> > >>> > >> >>by >> > >>> > >> >> > > >>lack of >> > >>> > >> >> > > >> >> > >>> >> >>connectivity >> > >>> > >> >> > > >> >> > >>> >> >> >since this would only apply to in >> flight >> > >>> > >> >>requests, >> > >>> > >> >> > > >>which by >> > >>> > >> >> > > >> >> > >>> >>definition >> > >>> > >> >> > > >> >> > >>> >> >> >must >> > >>> > >> >> > > >> >> > >>> >> >> >have been sent on an active >> connection. >> > >>> > >> >> > > >> >> > >>> >> >> > >> > >>> > >> >> > > >> >> > >>> >> >> >I suspect both types of problems >> > >>>probably need >> > >>> > >> >>to be >> > >>> > >> >> > > >> >>addressed >> > >>> > >> >> > > >> >> > >>> >> >>separately >> > >>> > >> >> > > >> >> > >>> >> >> >by introducing explicit timeouts. >> > >>>However, >> > >>> > >> >>because >> > >>> > >> >> the >> > >>> > >> >> > > >> >> settings >> > >>> > >> >> > > >> >> > >>> >> >>introduced >> > >>> > >> >> > > >> >> > >>> >> >> >here are very much about the >>internal >> > >>> > >> >> implementations >> > >>> > >> >> > of >> > >>> > >> >> > > >> >>the >> > >>> > >> >> > > >> >> > >>> >>clients, >> > >>> > >> >> > > >> >> > >>> >> >>I'm >> > >>> > >> >> > > >> >> > >>> >> >> >wondering if this even needs to be >>a >> > >>> > >>user-facing >> > >>> > >> >> > > >>setting, >> > >>> > >> >> > > >> >> > >>> >>especially >> > >>> > >> >> > > >> >> > >>> >> >>if we >> > >>> > >> >> > > >> >> > >>> >> >> >have to add other timeouts anyway. >>For >> > >>> > >>example, >> > >>> > >> >> would >> > >>> > >> >> > a >> > >>> > >> >> > > >> >>fixed, >> > >>> > >> >> > > >> >> > >>> >>generous >> > >>> > >> >> > > >> >> > >>> >> >> >value that's still much shorter >>than a >> > >>>TCP >> > >>> > >> >>timeout, >> > >>> > >> >> > say >> > >>> > >> >> > > >> >>15s, >> > >>> > >> >> > > >> >> be >> > >>> > >> >> > > >> >> > >>> >>good >> > >>> > >> >> > > >> >> > >>> >> >> >enough? If other timeouts would >>allow, >> > >>>for >> > >>> > >> >>example, >> > >>> > >> >> > the >> > >>> > >> >> > > >> >> clients >> > >>> > >> >> > > >> >> > >>>to >> > >>> > >> >> > > >> >> > >>> >> >> >properly >> > >>> > >> >> > > >> >> > >>> >> >> >exit even if requests have not hit >> their >> > >>> > >>timeout, >> > >>> > >> >> then >> > >>> > >> >> > > >> >>what's >> > >>> > >> >> > > >> >> > >>>the >> > >>> > >> >> > > >> >> > >>> >> >>benefit >> > >>> > >> >> > > >> >> > >>> >> >> >of being able to configure the >> > >>>request-level >> > >>> > >> >> timeout? >> > >>> > >> >> > > >> >> > >>> >> >> That is a very good point. We have >> three >> > >>>places >> > >>> > >> >>that >> > >>> > >> >> we >> > >>> > >> >> > > >> >>might >> > >>> > >> >> > > >> >> be >> > >>> > >> >> > > >> >> > >>> >>able to >> > >>> > >> >> > > >> >> > >>> >> >> enforce timeout for a message send: >> > >>> > >> >> > > >> >> > >>> >> >> 1. Before append to accumulator - >> > >>>handled >> > >>>by >> > >>> > >> >>metadata >> > >>> > >> >> > > >> >>timeout >> > >>> > >> >> > > >> >> on >> > >>> > >> >> > > >> >> > >>>per >> > >>> > >> >> > > >> >> > >>> >> >> > >>> > >> >> > > >> >> > >>> >> >> message level. >> > >>> > >> >> > > >> >> > >>> >> >> 2. Batch of messages inside >>accumulator >> > >>>- >> > >>>no >> > >>> > >> >>timeout >> > >>> > >> >> > > >> >>mechanism >> > >>> > >> >> > > >> >> > >>>now. >> > >>> > >> >> > > >> >> > >>> >> >> 3. Request of batches after messages >> > >>>leave the >> > >>> > >> >> > > >>accumulator >> > >>> > >> >> > > >> >>- we >> > >>> > >> >> > > >> >> > >>>have >> > >>> > >> >> > > >> >> > >>> >>a >> > >>> > >> >> > > >> >> > >>> >> >> broker side timeout but no client >>side >> > >>>timeout >> > >>> > >>for >> > >>> > >> >> now. >> > >>> > >> >> > > >> >> > >>> >> >> My current proposal only address (3) >> but >> > >>>not >> > >>> > >>(2). >> > >>> > >> >> > > >> >> > >>> >> >> Honestly I do not have a very clear >> idea >> > >>>about >> > >>> > >> >>what >> > >>> > >> >> > > >>should >> > >>> > >> >> > > >> >>we >> > >>> > >> >> > > >> >> do >> > >>> > >> >> > > >> >> > >>> >>with >> > >>> > >> >> > > >> >> > >>> >> >>(2) >> > >>> > >> >> > > >> >> > >>> >> >> right now. But I am with you that we >> > >>>should not >> > >>> > >> >> expose >> > >>> > >> >> > > >>too >> > >>> > >> >> > > >> >>many >> > >>> > >> >> > > >> >> > >>> >> >> configurations to users. What I am >> > >>>thinking >> > >>> > >>now to >> > >>> > >> >> > handle >> > >>> > >> >> > > >> >>(2) >> > >>> > >> >> > > >> >> is >> > >>> > >> >> > > >> >> > >>> >>when >> > >>> > >> >> > > >> >> > >>> >> >>user >> > >>> > >> >> > > >> >> > >>> >> >> call send, if we know that a >>partition >> is >> > >>> > >> >>offline, we >> > >>> > >> >> > > >>should >> > >>> > >> >> > > >> >> > >>>throw >> > >>> > >> >> > > >> >> > >>> >> >> exception immediately instead of >> putting >> > >>>it >> > >>> > >>into >> > >>> > >> >> > > >> >>accumulator. >> > >>> > >> >> > > >> >> > >>>This >> > >>> > >> >> > > >> >> > >>> >>would >> > >>> > >> >> > > >> >> > >>> >> >> protect further memory consumption. >>We >> > >>>might >> > >>> > >>also >> > >>> > >> >> want >> > >>> > >> >> > to >> > >>> > >> >> > > >> >>fail >> > >>> > >> >> > > >> >> > >>>all >> > >>> > >> >> > > >> >> > >>> >>the >> > >>> > >> >> > > >> >> > >>> >> >> batches in the dequeue once we >>found a >> > >>> > >>partition >> > >>> > >> >>is >> > >>> > >> >> > > >>offline. >> > >>> > >> >> > > >> >> That >> > >>> > >> >> > > >> >> > >>> >> >>said, I >> > >>> > >> >> > > >> >> > >>> >> >> feel timeout might not be quite >> > >>>applicable to >> > >>> > >>(2). >> > >>> > >> >> > > >> >> > >>> >> >> Do you have any suggestion on this? >> > >>> > >> >> > > >> >> > >>> >> >> >> > >>> > >> >> > > >> >> > >>> >> > >> > >>> > >> >> > > >> >> > >>> >> >Right, I didn't actually mean to >>solve 2 >> > >>>here, >> > >>> > >>but >> > >>> > >> >>was >> > >>> > >> >> > > >>trying >> > >>> > >> >> > > >> >>to >> > >>> > >> >> > > >> >> > >>> >>figure >> > >>> > >> >> > > >> >> > >>> >> >out >> > >>> > >> >> > > >> >> > >>> >> >if a solution to 2 would reduce what >>we >> > >>>needed to >> > >>> > >> >>do to >> > >>> > >> >> > > >> >>address >> > >>> > >> >> > > >> >> 3. >> > >>> > >> >> > > >> >> > >>> >>(And >> > >>> > >> >> > > >> >> > >>> >> >depending on how they are implemented, >> > >>>fixing 1 >> > >>> > >> >>might >> > >>> > >> >> > also >> > >>> > >> >> > > >> >> address >> > >>> > >> >> > > >> >> > >>>2). >> > >>> > >> >> > > >> >> > >>> >>It >> > >>> > >> >> > > >> >> > >>> >> >sounds like you hit hang that I wasn't >> > >>>really >> > >>> > >> >> expecting. >> > >>> > >> >> > > >>This >> > >>> > >> >> > > >> >> > >>>probably >> > >>> > >> >> > > >> >> > >>> >> >> > >>> > >> >> > > >> >> > >>> >> >just >> > >>> > >> >> > > >> >> > >>> >> >means the KIP motivation needs to be a >> bit >> > >>> > >>clearer >> > >>> > >> >> about >> > >>> > >> >> > > >>what >> > >>> > >> >> > > >> >> type >> > >>> > >> >> > > >> >> > >>>of >> > >>> > >> >> > > >> >> > >>> >> >situation this addresses. The cause of >> the >> > >>>hang >> > >>> > >>may >> > >>> > >> >> also >> > >>> > >> >> > be >> > >>> > >> >> > > >> >> > >>>relevant >> > >>> > >> >> > > >> >> > >>> >>-- if >> > >>> > >> >> > > >> >> > >>> >> >it was something like a deadlock then >> > >>>that's >> > >>> > >> >>something >> > >>> > >> >> > that >> > >>> > >> >> > > >> >> should >> > >>> > >> >> > > >> >> > >>> >>just be >> > >>> > >> >> > > >> >> > >>> >> >fixed, but if it's something outside >>our >> > >>>control >> > >>> > >> >>then a >> > >>> > >> >> > > >> >>timeout >> > >>> > >> >> > > >> >> > >>>makes >> > >>> > >> >> > > >> >> > >>> >>a >> > >>> > >> >> > > >> >> > >>> >> >lot >> > >>> > >> >> > > >> >> > >>> >> >more sense. >> > >>> > >> >> > > >> >> > >>> >> > >> > >>> > >> >> > > >> >> > >>> >> > >> > >>> > >> >> > > >> >> > >>> >> >> > >> > >>> > >> >> > > >> >> > >>> >> >> >I know we have a similar setting, >> > >>> > >> >> > > >> >> > >>> >> >>>>max.in.flights.requests.per.connection, >> > >>> > >> >> > > >> >> > >>> >> >> >exposed publicly (which I just >> > >>>discovered is >> > >>> > >> >>missing >> > >>> > >> >> > > >>from >> > >>> > >> >> > > >> >>the >> > >>> > >> >> > > >> >> > >>>new >> > >>> > >> >> > > >> >> > >>> >> >>producer >> > >>> > >> >> > > >> >> > >>> >> >> >configs documentation). But it >>looks >> > >>>like the >> > >>> > >>new >> > >>> > >> >> > > >>consumer >> > >>> > >> >> > > >> >>is >> > >>> > >> >> > > >> >> > >>>not >> > >>> > >> >> > > >> >> > >>> >> >>exposing >> > >>> > >> >> > > >> >> > >>> >> >> >that option, using a fixed value >> > >>>instead. I >> > >>> > >> >>think we >> > >>> > >> >> > > >>should >> > >>> > >> >> > > >> >> > >>>default >> > >>> > >> >> > > >> >> > >>> >>to >> > >>> > >> >> > > >> >> > >>> >> >> >hiding these implementation values >> > >>>unless >> > >>> > >> >>there's a >> > >>> > >> >> > > >>strong >> > >>> > >> >> > > >> >> case >> > >>> > >> >> > > >> >> > >>>for >> > >>> > >> >> > > >> >> > >>> >>a >> > >>> > >> >> > > >> >> > >>> >> >> >scenario that requires >>customization. >> > >>> > >> >> > > >> >> > >>> >> >> For producer, >> > >>> > >> >>max.in.flight.requests.per.connection >> > >>> > >> >> > > >>really >> > >>> > >> >> > > >> >> > >>>matters. >> > >>> > >> >> > > >> >> > >>> >>If >> > >>> > >> >> > > >> >> > >>> >> >> people do not want to have reorder >>of >> > >>>messages, >> > >>> > >> >>they >> > >>> > >> >> > > >>have to >> > >>> > >> >> > > >> >> use >> > >>> > >> >> > > >> >> > >>> >> >> >> max.in.flight.requests.per.connection=1. >> > >>>On the >> > >>> > >> >>other >> > >>> > >> >> > > >>hand, >> > >>> > >> >> > > >> >>if >> > >>> > >> >> > > >> >> > >>> >> >>throughput >> > >>> > >> >> > > >> >> > >>> >> >> is more of a concern, it could be >>set >> to >> > >>> > >>higher. >> > >>> > >> >>For >> > >>> > >> >> > the >> > >>> > >> >> > > >>new >> > >>> > >> >> > > >> >> > >>> >>consumer, I >> > >>> > >> >> > > >> >> > >>> >> >> checked the value and I am not sure >>if >> > >>>the hard >> > >>> > >> >>coded >> > >>> > >> >> > > >> >> > >>> >> >> >> > >>>max.in.flight.requests.per.connection=100 >> > >>>is >> > >>> > >>the >> > >>> > >> >> right >> > >>> > >> >> > > >> >>value. >> > >>> > >> >> > > >> >> > >>> >>Without >> > >>> > >> >> > > >> >> > >>> >> >>the >> > >>> > >> >> > > >> >> > >>> >> >> response to the previous request, >>what >> > >>>offsets >> > >>> > >> >>should >> > >>> > >> >> > be >> > >>> > >> >> > > >>put >> > >>> > >> >> > > >> >> into >> > >>> > >> >> > > >> >> > >>> >>the >> > >>> > >> >> > > >> >> > >>> >> >>next >> > >>> > >> >> > > >> >> > >>> >> >> fetch request? It seems to me the >>value >> > >>>will be >> > >>> > >> >>one >> > >>> > >> >> > > >>natively >> > >>> > >> >> > > >> >> > >>> >>regardless >> > >>> > >> >> > > >> >> > >>> >> >>of >> > >>> > >> >> > > >> >> > >>> >> >> the setting unless we are sending >>fetch >> > >>> > >>request to >> > >>> > >> >> > > >>different >> > >>> > >> >> > > >> >> > >>> >>partitions, >> > >>> > >> >> > > >> >> > >>> >> >> which does not look like the case. >> > >>> > >> >> > > >> >> > >>> >> >> Anyway, it looks to be a separate >>issue >> > >>> > >> >>orthogonal to >> > >>> > >> >> > the >> > >>> > >> >> > > >> >> request >> > >>> > >> >> > > >> >> > >>> >> >>timeout. >> > >>> > >> >> > > >> >> > >>> >> >> >> > >>> > >> >> > > >> >> > >>> >> > >> > >>> > >> >> > > >> >> > >>> >> > >> > >>> > >> >> > > >> >> > >>> >> >> >> > >>> > >> >> > > >> >> > >>> >> >> >In other words, since the only >> > >>>user-facing >> > >>> > >>change >> > >>> > >> >> was >> > >>> > >> >> > > >>the >> > >>> > >> >> > > >> >> > >>>addition >> > >>> > >> >> > > >> >> > >>> >>of >> > >>> > >> >> > > >> >> > >>> >> >>the >> > >>> > >> >> > > >> >> > >>> >> >> >setting, I'm wondering if we can >>avoid >> > >>>the KIP >> > >>> > >> >> > > >>altogether >> > >>> > >> >> > > >> >>by >> > >>> > >> >> > > >> >> > >>>just >> > >>> > >> >> > > >> >> > >>> >> >>choosing >> > >>> > >> >> > > >> >> > >>> >> >> >a good default value for the >>timeout. >> > >>> > >> >> > > >> >> > >>> >> >> The problem is that we have a server >> side >> > >>> > >>request >> > >>> > >> >> > timeout >> > >>> > >> >> > > >> >> exposed >> > >>> > >> >> > > >> >> > >>>as >> > >>> > >> >> > > >> >> > >>> >>a >> > >>> > >> >> > > >> >> > >>> >> >> public configuration. We cannot set >>the >> > >>>client >> > >>> > >> >> timeout >> > >>> > >> >> > > >> >>smaller >> > >>> > >> >> > > >> >> > >>>than >> > >>> > >> >> > > >> >> > >>> >>that >> > >>> > >> >> > > >> >> > >>> >> >> value, so a hard coded value >>probably >> > >>>won¹t >> > >>> > >>work >> > >>> > >> >> here. >> > >>> > >> >> > > >> >> > >>> >> >> >> > >>> > >> >> > > >> >> > >>> >> > >> > >>> > >> >> > > >> >> > >>> >> >That makes sense, although it's worth >> > >>>keeping in >> > >>> > >> >>mind >> > >>> > >> >> > that >> > >>> > >> >> > > >> >>even >> > >>> > >> >> > > >> >> if >> > >>> > >> >> > > >> >> > >>>you >> > >>> > >> >> > > >> >> > >>> >>use >> > >>> > >> >> > > >> >> > >>> >> >"correct" values, they could still be >> > >>>violated >> > >>> > >>due >> > >>> > >> >>to, >> > >>> > >> >> > > >>e.g., >> > >>> > >> >> > > >> >>a GC >> > >>> > >> >> > > >> >> > >>> >>pause >> > >>> > >> >> > > >> >> > >>> >> >that causes the broker to process a >> > >>>request >> > >>>after >> > >>> > >> >>it is >> > >>> > >> >> > > >> >>supposed >> > >>> > >> >> > > >> >> to >> > >>> > >> >> > > >> >> > >>> >>have >> > >>> > >> >> > > >> >> > >>> >> >expired. >> > >>> > >> >> > > >> >> > >>> >> > >> > >>> > >> >> > > >> >> > >>> >> >-Ewen >> > >>> > >> >> > > >> >> > >>> >> > >> > >>> > >> >> > > >> >> > >>> >> > >> > >>> > >> >> > > >> >> > >>> >> > >> > >>> > >> >> > > >> >> > >>> >> >> > >> > >>> > >> >> > > >> >> > >>> >> >> >-Ewen >> > >>> > >> >> > > >> >> > >>> >> >> > >> > >>> > >> >> > > >> >> > >>> >> >> >On Mon, Apr 13, 2015 at 2:35 PM, >> > >>>Jiangjie Qin >> > >>> > >> >> > > >> >> > >>> >> >><j...@linkedin.com.invalid> >> > >>> > >> >> > > >> >> > >>> >> >> >wrote: >> > >>> > >> >> > > >> >> > >>> >> >> > >> > >>> > >> >> > > >> >> > >>> >> >> >> Hi, >> > >>> > >> >> > > >> >> > >>> >> >> >> >> > >>> > >> >> > > >> >> > >>> >> >> >> I just created a KIP to add a >> request >> > >>> > >>timeout >> > >>> > >> >>to >> > >>> > >> >> > > >> >> NetworkClient >> > >>> > >> >> > > >> >> > >>> >>for >> > >>> > >> >> > > >> >> > >>> >> >>new >> > >>> > >> >> > > >> >> > >>> >> >> >> Kafka clients. >> > >>> > >> >> > > >> >> > >>> >> >> >> >> > >>> > >> >> > > >> >> > >>> >> >> >> >> > >>> > >> >> > > >> >> > >>> >> >> >> >> > >>> > >> >> > > >> >> > >>> >> >> >> > >>> > >> >> > > >> >> > >>> >> >> >> > >>> > >> >> > > >> >> > >>> >> >> > >>> > >> >> > > >> >> > >>> >> >> > >>> > >> >> > > >> >> > >>> >> > >>> > >> >> > > >> >> > >>> >> > >>> > >> >> > > >> >> > >> > >>> > >> >> > > >> >> > >>> > >> >> > > >>>> >> > >>> > >> >> > > >> > >>> > >> >> >> > >>> > >> > >>>>> >> > https://cwiki.apache.org/confluence/display/KAFKA/KIP-19+-+Add+a+reque >> > >>>>>s >> > >>> > >> >> > > >>>>t >> > >>> > >> >> > > >> >> > >>>+ >> > >>> > >> >> > > >> >> > >>> >> >> > >>> > >> >> > > >> >> > >>> >> >> >>timeout+to+NetworkClient >> > >>> > >> >> > > >> >> > >>> >> >> >> >> > >>> > >> >> > > >> >> > >>> >> >> >> Comments and suggestions are >> welcome! >> > >>> > >> >> > > >> >> > >>> >> >> >> >> > >>> > >> >> > > >> >> > >>> >> >> >> Thanks. >> > >>> > >> >> > > >> >> > >>> >> >> >> >> > >>> > >> >> > > >> >> > >>> >> >> >> Jiangjie (Becket) Qin >> > >>> > >> >> > > >> >> > >>> >> >> >> >> > >>> > >> >> > > >> >> > >>> >> >> >> >> > >>> > >> >> > > >> >> > >>> >> >> > >> > >>> > >> >> > > >> >> > >>> >> >> > >> > >>> > >> >> > > >> >> > >>> >> >> >-- >> > >>> > >> >> > > >> >> > >>> >> >> >Thanks, >> > >>> > >> >> > > >> >> > >>> >> >> >Ewen >> > >>> > >> >> > > >> >> > >>> >> >> >> > >>> > >> >> > > >> >> > >>> >> >> >> > >>> > >> >> > > >> >> > >>> >> > >> > >>> > >> >> > > >> >> > >>> >> > >> > >>> > >> >> > > >> >> > >>> >> >-- >> > >>> > >> >> > > >> >> > >>> >> >Thanks, >> > >>> > >> >> > > >> >> > >>> >> >Ewen >> > >>> > >> >> > > >> >> > >>> >> >> > >>> > >> >> > > >> >> > >>> >> >> > >>> > >> >> > > >> >> > >>> > >> > >>> > >> >> > > >> >> > >>> > >> > >>> > >> >> > > >> >> > >>> >-- >> > >>> > >> >> > > >> >> > >>> >-- Guozhang >> > >>> > >> >> > > >> >> > >>> >> > >>> > >> >> > > >> >> > >>> >> > >>> > >> >> > > >> >> > > >> > >>> > >> >> > > >> >> > >> > >>> > >> >> > > >> >> > >> > >>> > >> >> > > >> >> >> > >>> > >> >> > > >> > >> > >>> > >> >> > > >> > >> > >>> > >> >> > > >> > >> > >>> > >> >> > > >> >-- >> > >>> > >> >> > > >> >Thanks, >> > >>> > >> >> > > >> >Ewen >> > >>> > >> >> > > >> >> > >>> > >> >> > > >> >> > >>> > >> >> > > > >> > >>> > >> >> > > > >> > >>> > >> >> > > >-- >> > >>> > >> >> > > >-Regards, >> > >>> > >> >> > > >Mayuresh R. Gharat >> > >>> > >> >> > > >(862) 250-7125 >> > >>> > >> >> > > >> > >>> > >> >> > > >> > >>> > >> >> > >> > >>> > >> >> >> > >>> > >> >> >> > >>> > >> >> >> > >>> > >> >> -- >> > >>> > >> >> -Regards, >> > >>> > >> >> Mayuresh R. Gharat >> > >>> > >> >> (862) 250-7125 >> > >>> > >> >> >> > >>> > >> >> > >>> > >> >> > >>> > >> > >>> > >> > >>> >> > >>> >> > >>> -- >> > >>> Thanks, >> > >>> Ewen >> > >> >> > >>-- >> > >>Joel >> > >> >> > > >> > >> > >> >> >> -- >> Thanks, >> Ewen >>