Sounds reasonable. I have updated the KIP page accordingly. On 3/12/15, 10:16 PM, "Guozhang Wang" <wangg...@gmail.com> wrote:
>3) I think this is fine. >4) Hmm, error-message-only may NOT be better than blocking, as with the >code written with close(>=0), it will likely to just pollute the logs with >repeating errors until someone gets notified. How about >error-message-and-close(-1), i.e. record the error and force shutdown? > >On Thu, Mar 12, 2015 at 11:50 AM, Jiangjie Qin <j...@linkedin.com.invalid> >wrote: > >> Hey Guozhang, >> >> Thanks for the comments. I updated the page as suggested. >> For 3), that’s right, I put this in java doc. Do you think we need to >> reject value other than -1? >> For 4), I think user will notice this easily because the thread will >>block >> and producer is not going to shutdown. About using close(-1) quietly in >> sender thread when close() is called, my concern is that user might not >>be >> aware of that. Maybe we can put an error messages if user call close() >>in >> sender thread? >> >> Thanks, >> >> Jiangjie (Becket) Qin >> >> On 3/12/15, 5:13 AM, "Guozhang Wang" <wangg...@gmail.com> wrote: >> >> >Hi Becket, >> > >> >Some comments on the wiki page: >> > >> >1. There are a few typos, for example "multivations", "wiithin". >> > >> >2. I think the main motivation could just be "current close() needs to >> >block on flushing all buffered data, however there are scenarios in >>which >> >producers would like to close without blocking on flushing data, or >>even >> >close immediately and make sure any buffered data are dropped instead >>of >> >sending out." You can probably give some examples for such scenarios. >> > >> >3. close(-1, TimeUnit.MILLISECONDS) => from the implementation it seems >> >any >> >negative value has the same semantics. >> > >> >4. In sender thread only close(-1, TimeUnit.MILLISECONDS) should be >>called >> >=> this is not programmatically enforced. Shall we just try to enforce >>it >> >via, for example, checking if caller thread is the IO thread, and if >>yes >> >just use close(-1)? >> > >> >5. Proposed Changes => it seems you only talked about the close(-1) >>case, >> >how about close(>=0)? >> > >> >Guozhang >> > >> >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 >> >> >>> >> >> > >> >> >> >> >> > >> > >> >-- >> >-- Guozhang >> >> > > >-- >-- Guozhang