Hey Xiang, since Matthias is agreeing, do you want to kick off the vote?
Boyang On Fri, May 8, 2020 at 4:20 PM Matthias J. Sax <mj...@apache.org> wrote: > >> I'm not sure I follow your question, the producer will not automatically > >> close when there is fatal error IIUC. > > Correct. I found the code example just a little bit confusing, because > the produce is only closed in case of an error and only if the exception > is fatal. > > Overall, the code example might be better like this: > > > > try (Producer<String, String> producer = new KafkaProducer<>(props, new > StringSerializer(), new StringSerializer())) { > > producer.initTransactions(); > > try { > producer.beginTransaction(); > for (int i = 0; i < 100; i++) > producer.send(new ProducerRecord<>("my-topic", > Integer.toString(i), Integer.toString(i))); > producer.commitTransaction(); > } catch (Exception e) { > producer.abortTransaction(); > if(e instanceof IllegalStateException || > e instanceof ProducerFencedException || > e instanceof UnsupportedVersionException || > e instanceof AuthorizationException) { > throw e; > } > } > } > > > > Now the producer is closed via try-with-resources for all cases. > > > > @Xiang: feel free to start a vote thread. > > > -Matthias > > On 5/5/20 6:23 PM, Boyang Chen wrote: > > Hey Matthias, > > > > I'm not sure I follow your question, the producer will not automatically > > close when there is fatal error IIUC. > > > > Boyang > > > > On Tue, May 5, 2020 at 6:16 PM 张祥 <xiangzhang1...@gmail.com> wrote: > > > >> Thanks for the comment Matthias. > >> > >> In fact, I cannot think of why we cannot close the producer no matter > what. > >> On the other hand, it is also okay to reuse the producer when the error > is > >> not fatal. @Guozhang Wang <wangg...@gmail.com> @Boyang Chen > >> <boy...@confluent.io> > >> > >> Matthias J. Sax <mj...@apache.org> 于2020年5月1日周五 上午7:52写道: > >> > >>> Thanks for the KIP. Make sense to me. I think you can start a vote. > >>> > >>> One minor comment about the code example: From my understanding, a > >>> producer should always be closed (independent if there was no error, a > >>> transient error, or a fatal error). If that is correct, than the code > >>> example seems to be miss-leading? > >>> > >>> > >>> -Matthias > >>> > >>> On 4/25/20 6:08 PM, 张祥 wrote: > >>>> Sorry, but this KIP is still open to discussion, any comments and > ideas > >>>> would be appreciated, Thanks. > >>>> > >>>> 张祥 <xiangzhang1...@gmail.com> 于2020年4月17日周五 下午1:04写道: > >>>> > >>>>> Guozhang, thanks for the valuable suggestion. > >>>>> > >>>>> A new part called "suggested coding pattern" has been added and I > copy > >>> the > >>>>> core code here: > >>>>> > >>>>> try { > >>>>> producer.beginTransaction(); > >>>>> for (int i = 0; i < 100; i++) > >>>>> producer.send(new ProducerRecord<>("my-topic", > >>>>> Integer.toString(i), Integer.toString(i))); > >>>>> producer.commitTransaction(); > >>>>> } catch (Exception e) { > >>>>> producer.abortTransaction(); > >>>>> if(e instanceof IllegalStateException || > >>>>> e instanceof ProducerFencedException || > >>>>> e instanceof UnsupportedVersionException || > >>>>> e instanceof AuthorizationException || > >>>>> e instanceof OutOfOrderSequenceException) { > >>>>> producer.close(); > >>>>> } > >>>>> } > >>>>> > >>>>> As you can see, in the catch block, all fatal exceptions need to be > >>>>> listed, I am not sure I have listed all of them and I wonder if there > >>> is a > >>>>> better way to do this. > >>>>> > >>>>> > >>>>> Guozhang Wang <wangg...@gmail.com> 于2020年4月17日周五 上午8:50写道: > >>>>> > >>>>>> Xiang, thanks for the written KIP. I just have one meta comment and > >>>>>> otherwise it looks good to me: could you also add a section about > >>>>>> suggested > >>>>>> coding patterns (especially how try - catch should be implemented) > as > >>> we > >>>>>> discussed on the JIRA to the wiki page as well? > >>>>>> > >>>>>> And please also note that besides the javadoc of the function, on > top > >>> of > >>>>>> the KafkaProducer class there are also comments regarding example > >>> snippet: > >>>>>> > >>>>>> ``` > >>>>>> > >>>>>> * <pre> > >>>>>> * {@code > >>>>>> * Properties props = new Properties(); > >>>>>> * props.put("bootstrap.servers", "localhost:9092"); > >>>>>> * props.put("transactional.id", "my-transactional-id"); > >>>>>> * Producer<String, String> producer = new KafkaProducer<>(props, new > >>>>>> StringSerializer(), new StringSerializer()); > >>>>>> * > >>>>>> * producer.initTransactions(); > >>>>>> * > >>>>>> * try { > >>>>>> * producer.beginTransaction(); > >>>>>> * for (int i = 0; i < 100; i++) > >>>>>> * producer.send(new ProducerRecord<>("my-topic", > >>>>>> Integer.toString(i), Integer.toString(i))); > >>>>>> * producer.commitTransaction(); > >>>>>> * } catch (ProducerFencedException | OutOfOrderSequenceException | > >>>>>> AuthorizationException e) { > >>>>>> * // We can't recover from these exceptions, so our only option > >> is > >>>>>> to close the producer and exit. > >>>>>> * producer.close(); > >>>>>> * } catch (KafkaException e) { > >>>>>> * // For all other exceptions, just abort the transaction and > try > >>>>>> again. > >>>>>> * producer.abortTransaction(); > >>>>>> * } > >>>>>> * producer.close(); > >>>>>> > >>>>>> * } </pre> > >>>>>> ``` > >>>>>> > >>>>>> I think with this change we do not need to educate users that they > >>> should > >>>>>> distinguish the types of exceptions when calling `abortTxn`, instead > >>> they > >>>>>> only need to depend on the exception to decide whether to `close` > the > >>>>>> producer, so the above recommendation could look like: > >>>>>> > >>>>>> try { > >>>>>> > >>>>>> } catch {Exception e} { > >>>>>> > >>>>>> producer.abortTxn; > >>>>>> > >>>>>> if (e instanceof /*fatal exceptions*/) { > >>>>>> producer.close(); > >>>>>> } > >>>>>> } > >>>>>> > >>>>>> > >>>>>> Guozhang > >>>>>> > >>>>>> On Thu, Apr 16, 2020 at 12:14 AM 张祥 <xiangzhang1...@gmail.com> > >> wrote: > >>>>>> > >>>>>>> Thanks for the structure change Boyang. And I agree with you on the > >>> weak > >>>>>>> proposal part, I have adjusted it according to your suggestion. > >> Thanks > >>>>>>> again! > >>>>>>> > >>>>>>> Boyang Chen <reluctanthero...@gmail.com> 于2020年4月16日周四 下午2:39写道: > >>>>>>> > >>>>>>>> Thanks for the KIP Xiang! > >>>>>>>> > >>>>>>>> I think the motivation looks good, and I just did a slight > >> structure > >>>>>>> change > >>>>>>>> to separate "Proposed Changes" and "Public Interfaces", hope you > >>> don't > >>>>>>>> mind. > >>>>>>>> > >>>>>>>> However, "we can determine whether the producer client is already > >> in > >>>>>>> error > >>>>>>>> state in abortTransaction" sounds a bit weak about the actual > >>>>>> proposal, > >>>>>>>> instead we could propose something as "we would remember whether a > >>>>>> fatal > >>>>>>>> exception has already been thrown to the application level, so > that > >>> in > >>>>>>>> abort transaction we will not throw again, thus making the > function > >>>>>> safe > >>>>>>> to > >>>>>>>> be called in an error state". > >>>>>>>> > >>>>>>>> Other than that, I think the KIP is in pretty good shape. > >>>>>>>> > >>>>>>>> Boyang > >>>>>>>> > >>>>>>>> On Wed, Apr 15, 2020 at 7:07 PM 张祥 <xiangzhang1...@gmail.com> > >> wrote: > >>>>>>>> > >>>>>>>>> Hi everyone, > >>>>>>>>> > >>>>>>>>> I have opened a small KIP about safely aborting transaction > during > >>>>>>>>> shutdown. I'd like to use this thread to discuss about it and any > >>>>>>>> feedback > >>>>>>>>> is appreciated (sorry for earlier KIP number mistake). Here is a > >>>>>> link > >>>>>>> to > >>>>>>>>> KIP-596 : > >>>>>>>>> > >>>>>>>>> > >>>>>>>> > >>>>>>> > >>>>>> > >>> > >> > https://cwiki.apache.org/confluence/display/KAFKA/KIP-596%3A+Safely+abort+Producer+transactions+during+application+shutdown > >>>>>>>>> > >>>>>>>>> Thank you! > >>>>>>>>> > >>>>>>>> > >>>>>>> > >>>>>> > >>>>>> > >>>>>> -- > >>>>>> -- Guozhang > >>>>>> > >>>>> > >>>> > >>> > >>> > >> > > > >