So in (1), if a close() or close(timeout) is called from a callback, we will just turn that into a close(0)? Implementation wise, how do we know whether a close() call is made from the sender thread or not?
Thanks, Jun On Wed, Mar 18, 2015 at 2:13 PM, Jiangjie Qin <j...@linkedin.com.invalid> wrote: > It looks we have another option and are now deciding between the following > two interfaces: > > 1. Close() + close(timeout) > - timeout could be either positive or zero. > - only close(0) can be called from sender thread > > 2. Close() + abort() + close(timeout) > - timeout can either be positive or zero > - only abort() can be called from sender thread > > - abort() is equivalent to close(0) in 1) but does not join sender > thread and does not close metrics. > - Another thread has to call close() or close(timeout) in order to make > sure the resources in producer are gone. > > The tow approach provides the same function we need, the difference is > approach 2) follows convention of close() and abort(). On the other hand, > approach 1) saves one interface compared with approach 2) but does not > follow the convention. > > When the two approaches come to user code, it is probably something like > this: > > Try { > While(!finished) > Producer.send(record, callback) > } catch (Exception e) { > Producer.close(5) > } > > Class CallbackImpl implements Callback { > onCompletion(RecordMetadata metadata Exception e) { > If (e != null) > Abort() / close() > } > } > > Because the two approach leads to almost the same user code, assuming > users are always calling producer.close() as a clean up step, personally I > prefer approach 2) as it follows convention. > > Any thoughts? > > Jiangjie (Becket) Qin > > > On 3/17/15, 10:25 AM, "Jiangjie Qin" <j...@linkedin.com> wrote: > > >Hi Jun, > > > >Yes, as Guozhang said, the main reason we set a flag is because close(0) > >is expected to be called by sender thread itself. > >If we want to maintain the semantic meaning of close(), one alternative is > >to have an abort() method does the same thing as close(0) except cleanup. > >And in close(timeout), after timeout we call abort() and join the sender > >thread. This was one of the previous proposal. We merged abort to close(0) > >because they are almost doing the same thing. But from what you mentioned, > >it might make sense to have two separate methods. > > > >Thanks. > > > >Jiangjie (Becket) Qin > > > >On 3/16/15, 10:31 PM, "Guozhang Wang" <wangg...@gmail.com> wrote: > > > >>Yeah in this sense the sender thread will not exist immediately in the > >>close(0) call, but will only terminate after the current response batch > >>has > >>been processed, as will the producer instance itself. > >> > >>There is a reason for this though: for a clean shutdown the caller thread > >>has to wait for the sender thread to join before closing the producer > >>instance, but this cannot be achieve if close(0) is called by the sender > >>thread itself (for example in KAFKA-1659, there is a proposal from Andrew > >>Stein on using thread.interrupt and thread.stop, but if it is called by > >>the > >>ioThread itself the stop call will fail). Hence we came up with the flag > >>approach to let the sender thread to close as soon as it is at the > >>barrier > >>of the run loop. > >> > >>Guozhang > >> > >>On Mon, Mar 16, 2015 at 9:41 PM, Jun Rao <j...@confluent.io> wrote: > >> > >>> Hmm, does that mean that after close(0), the sender thread is not > >>>necessary > >>> gone? Normally, after closing an entity, we expect all internal threads > >>> associated with the entity are shut down completely. > >>> > >>> Thanks, > >>> > >>> Jun > >>> > >>> On Mon, Mar 16, 2015 at 3:18 PM, Jiangjie Qin > >>><j...@linkedin.com.invalid> > >>> wrote: > >>> > >>> > Hi Jun, > >>> > > >>> > Close(0) will set two flags in sender. Running=false and a newly > >>>added > >>> > forceClose=true. It will also set accumulator.closed=true so no > >>>further > >>> > producer.send() will succeed. > >>> > The sender thread will finish executing all the callbacks in current > >>> batch > >>> > of responses, then it will see the forceClose flag. It will just fail > >>>all > >>> > the incomplete batches in the producer and exit. > >>> > So close(0) is a non-blocking call and sender thread will not try to > >>>join > >>> > itself in close(0). > >>> > > >>> > Thanks. > >>> > > >>> > Jiangjie (Becket) Qin > >>> > > >>> > On 3/16/15, 2:50 PM, "Jun Rao" <j...@confluent.io> wrote: > >>> > > >>> > >How does close(0) work if it's called from the sender thread? If > >>> close(0) > >>> > >needs to wait for the sender thread to join, wouldn't this cause a > >>> > >deadlock? > >>> > > > >>> > >Thanks, > >>> > > > >>> > >Jun > >>> > > > >>> > >On Mon, Mar 16, 2015 at 2:26 PM, Jiangjie Qin > >>><j...@linkedin.com.invalid > >>> > > >>> > >wrote: > >>> > > > >>> > >> Thanks Guozhang. It wouldn’t be as thoroughly considered without > >>> > >> discussing with you :) > >>> > >> > >>> > >> Jiangjie (Becket) Qin > >>> > >> > >>> > >> On 3/16/15, 1:07 PM, "Guozhang Wang" <wangg...@gmail.com> wrote: > >>> > >> > >>> > >> >Thanks Jiangjie, > >>> > >> > > >>> > >> >After talking to you offline on this, I have been convinced and > >>> > >>changed my > >>> > >> >preference to blocking. The immediate shutdown approach does have > >>> some > >>> > >> >unsafeness in some cases. > >>> > >> > > >>> > >> >Guozhang > >>> > >> > > >>> > >> >On Mon, Mar 16, 2015 at 11:50 AM, Jiangjie Qin > >>> > >><j...@linkedin.com.invalid > >>> > >> > > >>> > >> >wrote: > >>> > >> > > >>> > >> >> It looks that the problem we want to solve and the purpose we > >>>want > >>> to > >>> > >> >> achieve is: > >>> > >> >> If user uses close() in callback, we want to let user be aware > >>>that > >>> > >>they > >>> > >> >> should use close(0) instead of close() in the callback. > >>> > >> >> > >>> > >> >> We have agreed that we will have an error log to inform user > >>>about > >>> > >>this > >>> > >> >> mis-usage. The options differ in the way how we can force user > >>>to > >>> > >>take a > >>> > >> >> look at that error log. > >>> > >> >> There are two scenarios: > >>> > >> >> 1. User does not expect the program to exit. > >>> > >> >> 2. User expect the program to exit. > >>> > >> >> > >>> > >> >> For scenario 1), blocking will probably delay the discovery of > >>>the > >>> > >> >> problem. Calling close(0) exposes the problem quicker. In this > >>> > >>scenario > >>> > >> >> producer just encounter a send failure when running normally. > >>> > >> >> For scenario 2), blocking will expose the problem quick. > >>>Calling > >>> > >> >>close(-1) > >>> > >> >> might hide the problem. This scenario might include: a) Unit > >>>test > >>> > >>for a > >>> > >> >> send failure. b) Message sending during a close() call from a > >>>user > >>> > >> >>thread. > >>> > >> >> > >>> > >> >> So as a summary table: > >>> > >> >> > >>> > >> >> Scenario 1) Scenario > >>>2) > >>> > >> >> > >>> > >> >> Blocking Delay problem discovery Guaranteed > >>>problem > >>> > >> >>discovery > >>> > >> >> > >>> > >> >> Close(-1) Immediate problem discovery Problem might be > >>> hidden > >>> > >> >> > >>> > >> >> > >>> > >> >> Personally I prefer blocking because it seems providing more > >>> > >>guarantees > >>> > >> >> and safer. > >>> > >> >> > >>> > >> >> Thanks. > >>> > >> >> > >>> > >> >> Jiangjie (Becket) Qin > >>> > >> >> > >>> > >> >> > >>> > >> >> On 3/16/15, 10:11 AM, "Guozhang Wang" <wangg...@gmail.com> > >>>wrote: > >>> > >> >> > >>> > >> >> >HI Jiangjie, > >>> > >> >> > > >>> > >> >> >As far as I understand calling close() in the ioThread is not > >>> > >>common, > >>> > >> >>as > >>> > >> >> >it > >>> > >> >> >may only trigger when we saw some non-retriable error. Hence > >>>when > >>> > >>user > >>> > >> >>run > >>> > >> >> >their program it is unlikely that close() will be triggered > >>>and > >>> > >>problem > >>> > >> >> >will be detected. So it seems to me that from the error > >>>detection > >>> > >> >>aspect > >>> > >> >> >these two options seems to be the same as people will usually > >>> > >>detect it > >>> > >> >> >from the producer metrics all dropping to 0. > >>> > >> >> > > >>> > >> >> >Guozhang > >>> > >> >> > > >>> > >> >> >On Mon, Mar 16, 2015 at 9:52 AM, Jiangjie Qin > >>> > >> >><j...@linkedin.com.invalid> > >>> > >> >> >wrote: > >>> > >> >> > > >>> > >> >> >> It seems there are two options we can choose from when > >>>close() > >>> is > >>> > >> >>called > >>> > >> >> >> from sender thread (callback): > >>> > >> >> >> 1. Log an error and close the producer using close(-1) > >>> > >> >> >> 2. Log an error and block. > >>> > >> >> >> (Throwing an exception will not work because we catch all > >>>the > >>> > >> >>exception > >>> > >> >> >> thrown from user callback. It will just lead to an error > >>>log.) > >>> > >> >> >> > >>> > >> >> >> My concern for the first option is that the producer will be > >>> > >>closed > >>> > >> >>even > >>> > >> >> >> if we logged and error. I am wondering if some user would > >>>not > >>> even > >>> > >> >>take > >>> > >> >> >>a > >>> > >> >> >> look at the log if producer is closed normally. Because from > >>>the > >>> > >> >> >>programs > >>> > >> >> >> behavior, everything looks good. If that is the case, the > >>>error > >>> > >> >>message > >>> > >> >> >>we > >>> > >> >> >> logged probably will just be ignored until some day when > >>>people > >>> > >>check > >>> > >> >> >>the > >>> > >> >> >> log and see it. > >>> > >> >> >> > >>> > >> >> >> As for the second option, because producer does not close > >>>but > >>> > >>blocks. > >>> > >> >> >>User > >>> > >> >> >> will notice this the first time they run the program. They > >>> > >>probably > >>> > >> >>will > >>> > >> >> >> look at the log to see why producer could not be closed and > >>>they > >>> > >>will > >>> > >> >> >>see > >>> > >> >> >> the error log we put there. So they will get informed about > >>>this > >>> > >> >> >>mis-usage > >>> > >> >> >> of close() in sender thread the first time they run the code > >>> > >>instead > >>> > >> >>of > >>> > >> >> >> some time later. > >>> > >> >> >> > >>> > >> >> >> Personally I prefer the second one because it is more > >>>obvious > >>> that > >>> > >> >> >> something was wrong. > >>> > >> >> >> > >>> > >> >> >> Jiangjie (Becket) Qin > >>> > >> >> >> > >>> > >> >> >> On 3/15/15, 4:27 PM, "Guozhang Wang" <wangg...@gmail.com> > >>> wrote: > >>> > >> >> >> > >>> > >> >> >> >Yeah I agree we should not silently change the behavior of > >>>the > >>> > >> >>function > >>> > >> >> >> >with the given parameters; and I would prefer > >>> > >> >> >>error-logging-and-shutdown > >>> > >> >> >> >over blocking when close(>0) is used, since as Neha > >>>suggested > >>> > >> >>blocking > >>> > >> >> >> >would also not proceed with sending any data, bu will just > >>>let > >>> > >> >>users to > >>> > >> >> >> >realize the issue later than sooner. > >>> > >> >> >> > > >>> > >> >> >> >On Sun, Mar 15, 2015 at 3:25 PM, Neha Narkhede > >>> > >><n...@confluent.io> > >>> > >> >> >>wrote: > >>> > >> >> >> > > >>> > >> >> >> >> > > >>> > >> >> >> >> > And I also agree it is better if we can make producer > >>>block > >>> > >>when > >>> > >> >> >> >> > close() is called from sender thread so user will > >>>notice > >>> > >> >>something > >>> > >> >> >> >>went > >>> > >> >> >> >> > wrong. > >>> > >> >> >> >> > >>> > >> >> >> >> > >>> > >> >> >> >> This isn't a great experience either. Why can't we just > >>>throw > >>> > >>an > >>> > >> >> >> >>exception > >>> > >> >> >> >> for a behavior we know is incorrect and we'd like the > >>>user to > >>> > >> >>know. > >>> > >> >> >> >> Blocking as a means of doing that seems wrong and > >>>annoying. > >>> > >> >> >> >> > >>> > >> >> >> >> On Sun, Mar 15, 2015 at 11:56 AM, Jay Kreps > >>> > >><jay.kr...@gmail.com> > >>> > >> >> >> wrote: > >>> > >> >> >> >> > >>> > >> >> >> >> > Cool. > >>> > >> >> >> >> > > >>> > >> >> >> >> > I think blocking is good or alternately throwing an > >>> exception > >>> > >> >> >>directly > >>> > >> >> >> >> from > >>> > >> >> >> >> > close(). Basically I would just worry about subtly > >>>doing > >>> > >> >>something > >>> > >> >> >> >> slightly > >>> > >> >> >> >> > different from what the user asked for as it will be > >>>hard > >>> to > >>> > >> >>notice > >>> > >> >> >> >>that > >>> > >> >> >> >> > behavior difference. > >>> > >> >> >> >> > > >>> > >> >> >> >> > -Jay > >>> > >> >> >> >> > > >>> > >> >> >> >> > On Sat, Mar 14, 2015 at 5:48 PM, Jiangjie Qin > >>> > >> >> >> >><j...@linkedin.com.invalid > >>> > >> >> >> >> > > >>> > >> >> >> >> > wrote: > >>> > >> >> >> >> > > >>> > >> >> >> >> > > Hi Jay, > >>> > >> >> >> >> > > > >>> > >> >> >> >> > > I have modified the KIP as you suggested. I thinks as > >>> long > >>> > >>as > >>> > >> >>we > >>> > >> >> >> >>have > >>> > >> >> >> >> > > consistent define for timeout across Kafka interface, > >>> there > >>> > >> >>would > >>> > >> >> >> >>be no > >>> > >> >> >> >> > > problem. And I also agree it is better if we can make > >>> > >>producer > >>> > >> >> >>block > >>> > >> >> >> >> when > >>> > >> >> >> >> > > close() is called from sender thread so user will > >>>notice > >>> > >> >> >>something > >>> > >> >> >> >>went > >>> > >> >> >> >> > > wrong. > >>> > >> >> >> >> > > > >>> > >> >> >> >> > > Thanks. > >>> > >> >> >> >> > > > >>> > >> >> >> >> > > Jiangjie (Becket) Qin > >>> > >> >> >> >> > > > >>> > >> >> >> >> > > On 3/14/15, 11:37 AM, "Jay Kreps" > >>><jay.kr...@gmail.com> > >>> > >> wrote: > >>> > >> >> >> >> > > > >>> > >> >> >> >> > > >Hey Jiangjie, > >>> > >> >> >> >> > > > > >>> > >> >> >> >> > > >I think this is going to be very confusing that > >>> > >> >> >> >> > > > close(0) waits indefinitely and > >>> > >> >> >> >> > > > close(-1) waits for 0. > >>> > >> >> >> >> > > >I understand this appears in other apis, but it is a > >>> > >>constant > >>> > >> >> >> >>cause of > >>> > >> >> >> >> > > >bugs. Let's not repeat that mistake. > >>> > >> >> >> >> > > > > >>> > >> >> >> >> > > >Let's make close(0) wait for 0. We don't need a way > >>>to > >>> > >>wait > >>> > >> >> >> >> indefinitely > >>> > >> >> >> >> > > >as > >>> > >> >> >> >> > > >we already have close() so having a magical constant > >>>for > >>> > >> >>that is > >>> > >> >> >> >> > > >redundant. > >>> > >> >> >> >> > > > > >>> > >> >> >> >> > > >Calling close() from the I/O thread was already > >>>possible > >>> > >>and > >>> > >> >> >>would > >>> > >> >> >> >> block > >>> > >> >> >> >> > > >indefinitely. I think trying to silently change the > >>> > >>behavior > >>> > >> >>is > >>> > >> >> >> >> probably > >>> > >> >> >> >> > > >not right. I.e. if the user calls close() in the > >>> callback > >>> > >> >>there > >>> > >> >> >>is > >>> > >> >> >> >> > > >actually > >>> > >> >> >> >> > > >some misunderstanding and they need to think more, > >>> > >>silently > >>> > >> >> >>making > >>> > >> >> >> >> this > >>> > >> >> >> >> > > >not > >>> > >> >> >> >> > > >block will hide the problem from them which is the > >>> > >>opposite > >>> > >> >>of > >>> > >> >> >> >>what we > >>> > >> >> >> >> > > >want. > >>> > >> >> >> >> > > > > >>> > >> >> >> >> > > >-Jay > >>> > >> >> >> >> > > > > >>> > >> >> >> >> > > >On Thu, Mar 12, 2015 at 1:49 AM, Jiangjie Qin > >>> > >> >> >> >> <j...@linkedin.com.invalid > >>> > >> >> >> >> > > > >>> > >> >> >> >> > > >wrote: > >>> > >> >> >> >> > > > > >>> > >> >> >> >> > > >> Hey Joe & Jay, > >>> > >> >> >> >> > > >> > >>> > >> >> >> >> > > >> Thanks for the comments on the voting thread. > >>>Since it > >>> > >> >>seems > >>> > >> >> >>we > >>> > >> >> >> >> > probably > >>> > >> >> >> >> > > >> will have more discussion on this, I am just > >>>replying > >>> > >>from > >>> > >> >>the > >>> > >> >> >> >> > > >>discussion > >>> > >> >> >> >> > > >> thread here. > >>> > >> >> >> >> > > >> I’ve updated the KIP page to make it less like > >>> > >>half-baked, > >>> > >> >> >> >>apologize > >>> > >> >> >> >> > for > >>> > >> >> >> >> > > >> the rush... > >>> > >> >> >> >> > > >> > >>> > >> >> >> >> > > >> The contract in current KIP is: > >>> > >> >> >> >> > > >> 1. close() - wait until all requests either are > >>>sent > >>> > >>or > >>> > >> >> >>reach > >>> > >> >> >> >> > request > >>> > >> >> >> >> > > >> timeout. > >>> > >> >> >> >> > > >> 2. close(-1, TimeUnit.MILLISECONDS) - close > >>> > >>immediately > >>> > >> >> >> >> > > >> 3. close(0, TimeUnit.MILLISECONDS) - equivalent > >>>to > >>> > >> >>close(), > >>> > >> >> >> >>i.e. > >>> > >> >> >> >> > Wait > >>> > >> >> >> >> > > >> until all requests are sent or reach request > >>>timeout > >>> > >> >> >> >> > > >> 4. close(5, TimeUnit.MILLISECONDS) - try the > >>>best to > >>> > >> >>finish > >>> > >> >> >> >> sending > >>> > >> >> >> >> > > >>in 5 > >>> > >> >> >> >> > > >> milliseconds, if something went wrong, just > >>>shutdown > >>> the > >>> > >> >> >>producer > >>> > >> >> >> >> > > >>anyway, > >>> > >> >> >> >> > > >> my callback will handle the failures. > >>> > >> >> >> >> > > >> > >>> > >> >> >> >> > > >> About how we define what timeout value stands for, > >>>I > >>> > >> >>actually > >>> > >> >> >> >> > struggled > >>> > >> >> >> >> > > >>a > >>> > >> >> >> >> > > >> little bit when wrote the patch. Intuitively, > >>>close(0) > >>> > >> >>should > >>> > >> >> >> >>mean > >>> > >> >> >> >> > > >> immediately, however it seems that all the > >>>existing > >>> java > >>> > >> >>class > >>> > >> >> >> >>have > >>> > >> >> >> >> > this > >>> > >> >> >> >> > > >> convention of timeout=0 means no timeout or never > >>> > >>timeout > >>> > >> >> >> >> > > >>(Thread.join(0), > >>> > >> >> >> >> > > >> Object.wait(0), etc.) So here the dilemma is > >>>either we > >>> > >> >>follow > >>> > >> >> >>the > >>> > >> >> >> >> > > >> intuition or we follow the convention. What I > >>>chose is > >>> > >>to > >>> > >> >> >>follow > >>> > >> >> >> >>the > >>> > >> >> >> >> > > >> convention but document the interface to let user > >>>be > >>> > >>aware > >>> > >> >>of > >>> > >> >> >>the > >>> > >> >> >> >> > usage. > >>> > >> >> >> >> > > >> The reason is that I think producer.close() is a > >>> public > >>> > >> >> >> >>interface so > >>> > >> >> >> >> > it > >>> > >> >> >> >> > > >> might be better to follow java convention. Whereas > >>> > >> >>selector is > >>> > >> >> >> >>not a > >>> > >> >> >> >> > > >> public interface that used by user, so as long as > >>>it > >>> > >>makes > >>> > >> >> >>sense > >>> > >> >> >> >>to > >>> > >> >> >> >> > us, > >>> > >> >> >> >> > > >>it > >>> > >> >> >> >> > > >> is less a problem to be different from java > >>> convention. > >>> > >> >>That > >>> > >> >> >>said > >>> > >> >> >> >> > since > >>> > >> >> >> >> > > >> consumer.poll(timeout) is also a public interface, > >>>I > >>> > >>think > >>> > >> >>it > >>> > >> >> >> >>also > >>> > >> >> >> >> > makes > >>> > >> >> >> >> > > >> sense to make producer.close() to have the same > >>> > >>definition > >>> > >> >>of > >>> > >> >> >> >> > > >> consumer.poll(timeout). > >>> > >> >> >> >> > > >> > >>> > >> >> >> >> > > >> The main argument for keeping a timeout in close > >>>would > >>> > >>be > >>> > >> >> >> >>separating > >>> > >> >> >> >> > the > >>> > >> >> >> >> > > >> close timeout from request timeout, which probably > >>> makes > >>> > >> >> >>sense. I > >>> > >> >> >> >> > would > >>> > >> >> >> >> > > >> guess typically the request timeout would be long > >>> (e.g. > >>> > >>60 > >>> > >> >> >> >>seconds) > >>> > >> >> >> >> > > >> because we might want to consider retries with > >>>back > >>> off > >>> > >> >>time. > >>> > >> >> >>If > >>> > >> >> >> >>we > >>> > >> >> >> >> > have > >>> > >> >> >> >> > > >> multiple batches in accumulator, in worst case > >>>that > >>> > >>could > >>> > >> >>take > >>> > >> >> >> >>up to > >>> > >> >> >> >> > > >> several minutes to complete all the requests. But > >>>when > >>> > >>we > >>> > >> >> >>close a > >>> > >> >> >> >> > > >> producer, we might not want to wait for that long > >>>as > >>> it > >>> > >> >>might > >>> > >> >> >> >>cause > >>> > >> >> >> >> > some > >>> > >> >> >> >> > > >> other problem like deployment tool timeout. > >>> > >> >> >> >> > > >> > >>> > >> >> >> >> > > >> There is also a subtle difference between > >>> close(timeout) > >>> > >> >>and > >>> > >> >> >> >> > > >> flush(timeout). The only purpose for flush() is to > >>> write > >>> > >> >>data > >>> > >> >> >>to > >>> > >> >> >> >>the > >>> > >> >> >> >> > > >> broker, so it makes perfect sense to wait until > >>> request > >>> > >> >> >>timeout. > >>> > >> >> >> >>I > >>> > >> >> >> >> > think > >>> > >> >> >> >> > > >> that is why flush(timeout) looks strange. On the > >>>other > >>> > >> >>hand, > >>> > >> >> >>the > >>> > >> >> >> >>top > >>> > >> >> >> >> > > >> priority for close() is to close the producer > >>>rather > >>> > >>than > >>> > >> >> >>flush() > >>> > >> >> >> >> > data, > >>> > >> >> >> >> > > >>so > >>> > >> >> >> >> > > >> close(timeout) gives guarantee on bounded waiting > >>>for > >>> > >>its > >>> > >> >>main > >>> > >> >> >> >>job. > >>> > >> >> >> >> > > >> > >>> > >> >> >> >> > > >> Sorry for the confusion about forceClose flag. It > >>>is > >>> > >>not a > >>> > >> >> >>public > >>> > >> >> >> >> > > >> interface. I mentioned it in Proposed Changes > >>>section > >>> > >> >>which I > >>> > >> >> >> >> thought > >>> > >> >> >> >> > > >>was > >>> > >> >> >> >> > > >> supposed to provide implementation details. > >>> > >> >> >> >> > > >> > >>> > >> >> >> >> > > >> Thanks again for all the comments and suggestions! > >>> > >> >> >> >> > > >> > >>> > >> >> >> >> > > >> Jiangjie (Becket) Qin > >>> > >> >> >> >> > > >> > >>> > >> >> >> >> > > >> On 3/10/15, 8:57 PM, "Jiangjie Qin" < > >>> j...@linkedin.com> > >>> > >> >> wrote: > >>> > >> >> >> >> > > >> > >>> > >> >> >> >> > > >> >The KIP page has been updated per Jay¹s comments. > >>> > >> >> >> >> > > >> >I¹d like to initiate the voting process if no > >>>further > >>> > >> >> >>comments > >>> > >> >> >> >>are > >>> > >> >> >> >> > > >> >received by tomorrow. > >>> > >> >> >> >> > > >> > > >>> > >> >> >> >> > > >> >Jiangjie (Becket) Qin > >>> > >> >> >> >> > > >> > > >>> > >> >> >> >> > > >> >On 3/8/15, 9:45 AM, "Jay Kreps" > >>><jay.kr...@gmail.com > >>> > > >>> > >> >>wrote: > >>> > >> >> >> >> > > >> > > >>> > >> >> >> >> > > >> >>Hey Jiangjie, > >>> > >> >> >> >> > > >> >> > >>> > >> >> >> >> > > >> >>Can you capture the full motivation and use > >>>cases > >>> for > >>> > >>the > >>> > >> >> >> >>feature? > >>> > >> >> >> >> > > >>This > >>> > >> >> >> >> > > >> >>mentions your interest in having a way of > >>>aborting > >>> > >>from > >>> > >> >> >>inside > >>> > >> >> >> >>the > >>> > >> >> >> >> > > >> >>Callback. But it doesn't really explain that > >>>usage > >>> or > >>> > >>why > >>> > >> >> >>other > >>> > >> >> >> >> > people > >>> > >> >> >> >> > > >> >>would want to do that. It also doesn't list the > >>> > >>primary > >>> > >> >>use > >>> > >> >> >> >>case > >>> > >> >> >> >> for > >>> > >> >> >> >> > > >> >>having > >>> > >> >> >> >> > > >> >>close with a bounded timeout which was to avoid > >>> > >>blocking > >>> > >> >>too > >>> > >> >> >> >>long > >>> > >> >> >> >> on > >>> > >> >> >> >> > > >> >>shutdown. > >>> > >> >> >> >> > > >> >> > >>> > >> >> >> >> > > >> >>-Jay > >>> > >> >> >> >> > > >> >> > >>> > >> >> >> >> > > >> >> > >>> > >> >> >> >> > > >> >> > >>> > >> >> >> >> > > >> >>On Sat, Mar 7, 2015 at 12:25 PM, Jiangjie Qin > >>> > >> >> >> >> > > >><j...@linkedin.com.invalid > >>> > >> >> >> >> > > >> > > >>> > >> >> >> >> > > >> >>wrote: > >>> > >> >> >> >> > > >> >> > >>> > >> >> >> >> > > >> >>> Hi, > >>> > >> >> >> >> > > >> >>> > >>> > >> >> >> >> > > >> >>> I just created a KIP for adding a > >>>close(timeout) > >>> to > >>> > >>new > >>> > >> >> >> >> producer. > >>> > >> >> >> >> > > >>Most > >>> > >> >> >> >> > > >> >>>of > >>> > >> >> >> >> > > >> >>> the previous discussions are in KAFKA-1660 > >>>where > >>> > >>Parth > >>> > >> >> >> >> Brahmbhatt > >>> > >> >> >> >> > > >>has > >>> > >> >> >> >> > > >> >>> already done a lot of work. > >>> > >> >> >> >> > > >> >>> Since this is an interface change so we are > >>>going > >>> > >> >>through > >>> > >> >> >>the > >>> > >> >> >> >> KIP > >>> > >> >> >> >> > > >> >>>process. > >>> > >> >> >> >> > > >> >>> Here is the KIP link: > >>> > >> >> >> >> > > >> >>> > >>> > >> >> >> >> > > >> >>> > >>> > >> >> >> >> > > >> > >>> > >> >> >> >> > > > >>> > >> >> >> >> > >>> > >> >> >> > >>> > >> >> > >>> > >> > >>> > > >>> > https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=5373978 > >>> > >> >> >> >> > > >> >>>2 > >>> > >> >> >> >> > > >> >>> > >>> > >> >> >> >> > > >> >>> Thanks. > >>> > >> >> >> >> > > >> >>> > >>> > >> >> >> >> > > >> >>> Jiangjie (Becket) Qin > >>> > >> >> >> >> > > >> >>> > >>> > >> >> >> >> > > >> > > >>> > >> >> >> >> > > >> > >>> > >> >> >> >> > > >> > >>> > >> >> >> >> > > > >>> > >> >> >> >> > > > >>> > >> >> >> >> > > >>> > >> >> >> >> > >>> > >> >> >> >> > >>> > >> >> >> >> > >>> > >> >> >> >> -- > >>> > >> >> >> >> Thanks, > >>> > >> >> >> >> Neha > >>> > >> >> >> >> > >>> > >> >> >> > > >>> > >> >> >> > > >>> > >> >> >> > > >>> > >> >> >> >-- > >>> > >> >> >> >-- Guozhang > >>> > >> >> >> > >>> > >> >> >> > >>> > >> >> > > >>> > >> >> > > >>> > >> >> >-- > >>> > >> >> >-- Guozhang > >>> > >> >> > >>> > >> >> > >>> > >> > > >>> > >> > > >>> > >> >-- > >>> > >> >-- Guozhang > >>> > >> > >>> > >> > >>> > > >>> > > >>> > >> > >> > >> > >>-- > >>-- Guozhang > > > >