Hi all,
Thanks for the interesting discussion.

I assume that now the main questions are as follows:

1. Do we need to transit the transcation to the error state for API
exceptions?
2. Should we throw the API exception in `send()` instead of returning a
future error?
3. If the answer to question (1) is NO and to question (2) is YES, do we
need to change the current `flush` or `commitTnx` at all?

Cheers,
Alieh

On Sat, Jun 22, 2024 at 3:21 AM Matthias J. Sax <mj...@apache.org> wrote:

> Hey Kirk,
>
> can you elaborate on a few points?
>
> > Otherwise users would have to know to explicitly change their code to
> invoke flush().
>
> Why? If we would add an option to `flush(FlushOption)`, the existing
> `flush()` w/o any option will still be there, right? If we would really
> deprecate existing `flush()`, it would just mean that we would pass
> "default FlushOption" into an implicit flush (and yes, we would need to
> define what this would be).
>
> I think there is no clear winner (as pointed out in my last reply), and
> both `flush(FlushOption)` and `commitTx(CommitOption)` has advantages
> and drawbacks. Guess we need to just agree on which tradeoff we want to
> move forward with?
>
>
> Not sure if your database example is a 1:1 fit? I think, the better
> comparison would be:
>
> BEGIN TX;
> INSERT INTO foo VALUES (’a’);
> INSERT INTO foo VALUES (’b’);
> INSERT INTO foo VALUES (’c’);
> INSERT INTO foo VALUES (’not sure’);
>
> For this case, the full TX would roll back, right? I still think that
> allowing users to just skip over the last error, and continue the TX
> would be ok. In the end, we provide a programmatic API, and not a
> declarative one as SQL. Of course, default behavior would still be to
> put the producer into error state, and the user would need to call
> `abortTransaction()` to move forward.
>
>
> -Matthias
>
> On 6/21/24 5:26 PM, Kirk True wrote:
> > Hi Matthias,
> >
> >> On Jun 21, 2024, at 12:28 PM, Matthias J. Sax <mj...@apache.org> wrote:
> >>
> >> If we want to limit it to `RecordTooLargeException` throwing from
> `send()` directly make sense. Thanks for calling it out.
> >>
> >> It's still a question of backward compatibility? `send()` does throw
> exceptions already, including generic `KafkaException`. Not sure if this
> helps with backward compatibility? Could we just add a new exception type
> (which is a child of `KafkaException`)?
> >>
> >> The Producer JavaDocs are not totally explicit about it IMHO.
> >>
> >> I think we could expect that some generic error handling path gets
> executed. For the TX-case, I would assume that a TX would be aborted if
> `send()` throws or that the producer would be `closed()`. Overall this
> might be safe?
> >>
> >>> It would be a little less flexible
> >>>> though, since (as you note) it would still be impossible to commit
> >>>> transactions after errors have been reported from brokers.
> >>
> >> KS would still need a way to clear the error state of the producer. We
> could catch a `RecordTooLargeException` from `send()`, call the handler and
> let it decide what to do next. But if it does return `CONTINUE` to swallow
> the error and drop the poison pill record on the floor, we would want to
> move forward and commit the transaction.
> >>
> >> But the question is: if we cannot add a record to the tx, does the
> producer need to go into error state? In the end, we did throw and inform
> the app that the record was _not_ added, and it's up to the app to decide
> what to do next?
> >
> > That’s an excellent question…
> >
> > Imagine the user’s application is writing information to a database
> instead of Kafka. If there’s a table with a CHAR(1) column and this SQL
> statement was attempted, what should happen?
> >
> >      INSERT INTO foo VALUES (’not sure’);
> >
> > Yes, that DML would fail, sure, but would the user expect that the
> connection used by database library would get stuck in some kind of error
> state? A user would be able catch the error and either continue or abort,
> based on their business rules.
> >
> > So I agree with what I believe you’re implying: we shouldn’t poison the
> Producer/TransactionManager on certain types of application-level errors in
> send().
> >
> > Kirk
> >
> >> If we report the error only via the `Callback` it's a different story,
> because the contract for this case is clearly specified on the JavaDocs:
> >>
> >>> When used as part of a transaction, it is not necessary to define a
> callback or check the result of the future
> >>> in order to detect errors from <code>send</code>. If any of the send
> calls failed with an irrecoverable error,
> >>> the final {@link #commitTransaction()} call will fail and throw the
> exception from the last failed send. When
> >>> this happens, your application should call {@link #abortTransaction()}
> to reset the state and continue to send
> >>> data.
> >>
> >>
> >>
> >> -Matthias
> >>
> >>
> >> On 6/21/24 11:42 AM, Chris Egerton wrote:
> >>> Hi Artem,
> >>> I think it'd make sense to throw directly from send whenever possible,
> >>> instead of returning an already-completed future. I didn't do that in
> my
> >>> bug fix to try to be conservative about breaking changes but this
> seems to
> >>> have caused its own set of headaches. It would be a little less
> flexible
> >>> though, since (as you note) it would still be impossible to commit
> >>> transactions after errors have been reported from brokers.
> >>> I'll leave it up to the Kafka Streams folks to decide if that
> flexibility
> >>> is required. If it is, then users could explicitly call flush() before
> >>> committing (and ignoring errors for) or aborting a transaction, if they
> >>> want to implement fine-grained error handling logic such as allowing
> errors
> >>> for a subset of topics to be ignored.
> >>> Hi Matthias,
> >>> Most of the time you're right and we can't throw from send(); however,
> in
> >>> this case (client-side record-too-large exception), the error is
> actually
> >>> noticed by the producer before send() returns, so it should be
> possible to
> >>> throw directly.
> >>> Cheers,
> >>> Chris
> >>> On Fri, Jun 21, 2024, 14:25 Matthias J. Sax <mj...@apache.org> wrote:
> >>>> Not sure if we can change send and make it throw, given that send() is
> >>>> async? That is why users can register a `Callback` to begin with,
> right?
> >>>>
> >>>> And Alieh's point about backward compatibility is also a fair concern.
> >>>>
> >>>>
> >>>>> Actually, this would potentially be even
> >>>>> worse than the original buggy behavior because the bug was that we
> >>>> ignored
> >>>>> errors that happened in the "send()" method itself, not necessarily
> the
> >>>>> ones that we got from the broker.
> >>>>
> >>>> My understanding was that `commitTx(swallowError)` would only swallow
> >>>> `send()` errors, not errors about the actually commit. I agree that it
> >>>> would be very bad to swallow errors about the actual tx commit...
> >>>>
> >>>> It's a fair question if this might be too subtle; to make it explicit,
> >>>> we could use `CommitOpions#ignorePendingSendErors()` [working name] to
> >>>> make it clear.
> >>>>
> >>>>
> >>>> If we think it's too subtle to change commit to swallow send() errors,
> >>>> maybe going with `flush(FlushOptions)` would be clearer (and we can
> use
> >>>> `FlushOption#swallowSendErrorsForTransactions()` [working name] to be
> >>>> explicitly that the `FlushOption` for now has only an effect for TX).
> >>>>
> >>>>
> >>>> Thoughts?
> >>>>
> >>>>
> >>>> -Matthias
> >>>>
> >>>>
> >>>>
> >>>> On 6/21/24 4:10 AM, Alieh Saeedi wrote:
> >>>>> Hi all,
> >>>>>
> >>>>>
> >>>>> It is very exciting to see all the experts here raising very good
> points.
> >>>>>
> >>>>> As we go further, we see more and more options to improve our
> solution,
> >>>>> which makes concluding and updating the KIP impossible.
> >>>>>
> >>>>>
> >>>>> The main suggestions so far are:
> >>>>>
> >>>>> 1. `flush` with `flushOptions` as input parameter
> >>>>>
> >>>>> 2. `commitTx` with `commitOptions` as input parameter
> >>>>>
> >>>>> 3. `send` must throw the exception
> >>>>>
> >>>>>
> >>>>> My concern about the 3rd suggestion:
> >>>>>
> >>>>> 1. Does the change cause any issue with backward compatibility?
> >>>>>
> >>>>> 2. The `send (bad record)` already transits the transaction to the
> error
> >>>>> state. No user, including Streams is able to transit the transaction
> back
> >>>>> from the error state. Do you mean we remove the
> >>>>> `maybeTransitionToErrorState(e)` from here
> >>>>> <
> >>>>
> https://github.com/apache/kafka/blob/9b5b434e2a6b2d5290ea403fc02859b1c523d8aa/clients/src/main/java/org/apache/kafka/clients/producer/KafkaProducer.java#L1112
> >>>>>
> >>>>> as well?
> >>>>>
> >>>>> Cheers,
> >>>>> Alieh
> >>>>>
> >>>>>
> >>>>> On Fri, Jun 21, 2024 at 8:45 AM Andrew Schofield <
> >>>> andrew_schofi...@live.com>
> >>>>> wrote:
> >>>>>
> >>>>>> Hi Artem,
> >>>>>> I think you make a good point which is worth further consideration.
> If
> >>>>>> any of the existing methods is really ripe for a change here, it’s
> the
> >>>>>> send() that actually caused the problem. If that can be fixed so
> there
> >>>> are
> >>>>>> no situations in which a lurking error breaks a transaction, that
> might
> >>>> be
> >>>>>> the best.
> >>>>>>
> >>>>>> Thanks,
> >>>>>> Andrew
> >>>>>>
> >>>>>>> On 21 Jun 2024, at 01:51, Artem Livshits <alivsh...@confluent.io
> >>>> .INVALID>
> >>>>>> wrote:
> >>>>>>>
> >>>>>>>> I thought we still wait for requests (and their errors) to come
> in and
> >>>>>>> could handle fatal errors appropriately.
> >>>>>>>
> >>>>>>> We do wait for requests, but my understanding is that when
> >>>>>>> commitTransaction("ignore send errors") we want to ignore errors.
> So
> >>>> if
> >>>>>> we
> >>>>>>> do
> >>>>>>>
> >>>>>>> 1. send
> >>>>>>> 2. commitTransaction("ignore send errors")
> >>>>>>>
> >>>>>>> the commit will succeed.  You can look at the example in
> >>>>>>> https://issues.apache.org/jira/browse/KAFKA-9279 and just
> substitute
> >>>>>>> commitTransaction with commitTransaction("ignore send errors") and
> we
> >>>> get
> >>>>>>> the buggy behavior back :-).  Actually, this would potentially be
> even
> >>>>>>> worse than the original buggy behavior because the bug was that we
> >>>>>> ignored
> >>>>>>> errors that happened in the "send()" method itself, not
> necessarily the
> >>>>>>> ones that we got from the broker.
> >>>>>>>
> >>>>>>> Actually, looking at
> https://github.com/apache/kafka/pull/11508/files,
> >>>>>>> wouldn't a better solution be to just throw the error from the
> "send"
> >>>>>>> method itself, rather than trying to set it to be thrown during
> commit?
> >>>>>>> This way the example in
> >>>> https://issues.apache.org/jira/browse/KAFKA-9279
> >>>>>>> would be fixed, and at the same time it would give an opportunity
> for
> >>>> KS
> >>>>>> to
> >>>>>>> catch the error and ignore it if needed.  Not sure if we need a
> KIP for
> >>>>>>> that, just do a better fix of the old bug.
> >>>>>>>
> >>>>>>> -Artem
> >>>>>>>
> >>>>>>> On Thu, Jun 20, 2024 at 4:58 PM Justine Olshan
> >>>>>> <jols...@confluent.io.invalid>
> >>>>>>> wrote:
> >>>>>>>
> >>>>>>>> I'm a bit late to the party, but the discussion here looks
> reasonable.
> >>>>>>>> Moving the logic to a transactional method makes sense to me and
> makes
> >>>>>> me
> >>>>>>>> feel a bit better about keeping the complexity in the methods
> relevant
> >>>>>> to
> >>>>>>>> the issue.
> >>>>>>>>
> >>>>>>>>> One minor concern is that if we set "ignore send
> >>>>>>>> errors" (or whatever we decide to name it) option without explicit
> >>>>>> flush,
> >>>>>>>> it'll actually lead to broken behavior as the application won't be
> >>>> able
> >>>>>> to
> >>>>>>>> stop a commit from proceeding even on fatal errors.
> >>>>>>>>
> >>>>>>>> Is this with respect to the case a request is still inflight when
> we
> >>>>>> call
> >>>>>>>> commitTransaction? I thought we still wait for requests (and their
> >>>>>> errors)
> >>>>>>>> to come in and could handle fatal errors appropriately.
> >>>>>>>>
> >>>>>>>> Justine
> >>>>>>>>
> >>>>>>>> On Thu, Jun 20, 2024 at 4:32 PM Artem Livshits
> >>>>>>>> <alivsh...@confluent.io.invalid> wrote:
> >>>>>>>>
> >>>>>>>>> Hi Matthias (and other folks who suggested ideas),
> >>>>>>>>>
> >>>>>>>>>> maybe `commitTransaction(CommitOptions)` or similar could be a
> good
> >>>>>>>> way
> >>>>>>>>> forward?
> >>>>>>>>>
> >>>>>>>>> I like this approach.  One minor concern is that if we set
> "ignore
> >>>> send
> >>>>>>>>> errors" (or whatever we decide to name it) option without
> explicit
> >>>>>> flush,
> >>>>>>>>> it'll actually lead to broken behavior as the application won't
> be
> >>>> able
> >>>>>>>> to
> >>>>>>>>> stop a commit from proceeding even on fatal errors.  But I guess
> >>>> we'll
> >>>>>>>> just
> >>>>>>>>> have to clearly document it.
> >>>>>>>>>
> >>>>>>>>> In some way we are basically adding a flag to optionally restore
> the
> >>>>>>>>> https://issues.apache.org/jira/browse/KAFKA-9279 bug, which is
> the
> >>>>>>>>> motivation for all these changes, anyway :-).
> >>>>>>>>>
> >>>>>>>>> -Artem
> >>>>>>>>>
> >>>>>>>>>
> >>>>>>>>> On Thu, Jun 20, 2024 at 2:18 PM Matthias J. Sax <
> mj...@apache.org>
> >>>>>>>> wrote:
> >>>>>>>>>
> >>>>>>>>>> Seems the option to use a config does not get a lot of support.
> >>>>>>>>>>
> >>>>>>>>>> So we need to go with some form or "overload / new method". I
> think
> >>>>>>>>>> Chris' point about not coupling it to `flush()` but rather
> >>>>>>>>>> `commitTransaction()` is actually a very good one; for non-tx
> case,
> >>>>>> the
> >>>>>>>>>> different flush variants would not make sense.
> >>>>>>>>>>
> >>>>>>>>>> I also like Lianet's idea to pass in some "options" object, so
> maybe
> >>>>>>>>>> `commitTransaction(CommitOptions)` or similar could be a good
> way
> >>>>>>>>>> forward? It's much better than a `boolean` parameter,
> aesthetically,
> >>>>>> as
> >>>>>>>>>> we as extendable in the future if necessary.
> >>>>>>>>>>
> >>>>>>>>>> Given that we would pass in an optional parameter, we might not
> even
> >>>>>>>>>> need to deprecate the existing `commitTransaction()` method?
> >>>>>>>>>>
> >>>>>>>>>>
> >>>>>>>>>>
> >>>>>>>>>> -Matthias
> >>>>>>>>>>
> >>>>>>>>>> On 6/20/24 9:12 AM, Andrew Schofield wrote:
> >>>>>>>>>>> Hi Alieh,
> >>>>>>>>>>> Thanks for the KIP.
> >>>>>>>>>>>
> >>>>>>>>>>> I *really* don’t like adding a config which changes the
> behaviour
> >>>> of
> >>>>>>>>> the
> >>>>>>>>>>> flush() method. We already have too many configs. But I totally
> >>>>>>>>>> understand
> >>>>>>>>>>> the problem that you’re trying to solve and some of the other
> >>>>>>>>> suggestions
> >>>>>>>>>>> in this thread seem neater.
> >>>>>>>>>>>
> >>>>>>>>>>> Personally, I would add another method to KafkaProducer. Not an
> >>>>>>>>> overload
> >>>>>>>>>>> on flush() because this is not flush() at all. Using Matthias’s
> >>>>>>>>> options,
> >>>>>>>>>>> I prefer (3).
> >>>>>>>>>>>
> >>>>>>>>>>> Thanks,
> >>>>>>>>>>> Andrew
> >>>>>>>>>>>
> >>>>>>>>>>>> On 20 Jun 2024, at 15:08, Lianet M. <liane...@gmail.com>
> wrote:
> >>>>>>>>>>>>
> >>>>>>>>>>>> Hi all, thanks for the KIP Alieh!
> >>>>>>>>>>>>
> >>>>>>>>>>>> LM1. Totally agree with Artem's point about the config not
> being
> >>>> the
> >>>>>>>>>> most
> >>>>>>>>>>>> explicit/flexible way to express this capability. Getting
> then to
> >>>>>>>>>> Matthias
> >>>>>>>>>>>> 4 options, what I don't like about 3 and 4 is that it seems
> they
> >>>>>>>> might
> >>>>>>>>>> not
> >>>>>>>>>>>> age very well? Aren't we going to be wanting some other twist
> to
> >>>> the
> >>>>>>>>>> flush
> >>>>>>>>>>>> semantics that will have us adding yet another param to it, or
> >>>>>>>> another
> >>>>>>>>>>>> overloaded method? I truly don't have the context to answer
> that,
> >>>>>>>> but
> >>>>>>>>>> if it
> >>>>>>>>>>>> feels like a realistic future maybe adding some kind
> FlushOptions
> >>>>>>>>>> params to
> >>>>>>>>>>>> the flush would be better from an extensibility point of
> view. It
> >>>>>>>>> would
> >>>>>>>>>>>> only have the clearErrors option available for now but could
> >>>> accept
> >>>>>>>>> any
> >>>>>>>>>>>> other we may need. I find that this would remove the
> "ugliness"
> >>>>>>>>> Matthias
> >>>>>>>>>>>> pointed out for 3. and 4.
> >>>>>>>>>>>>
> >>>>>>>>>>>> LM2. No matter how we end up expressing the different
> semantics
> >>>> for
> >>>>>>>>>> flush,
> >>>>>>>>>>>> let's make sure we update the KIP on the flush and
> >>>> commitTransaction
> >>>>>>>>>> java
> >>>>>>>>>>>> docs. It currently states that  flush "clears the last
> exception"
> >>>>>>>> and
> >>>>>>>>>>>> commitTransaction "will NOT throw" if called after flush, but
> it
> >>>>>>>>> really
> >>>>>>>>>> all
> >>>>>>>>>>>> depends on the config/options/method used.
> >>>>>>>>>>>>
> >>>>>>>>>>>> LM3. I find it would be helpful to include an example to show
> the
> >>>>>>>> new
> >>>>>>>>>> flow
> >>>>>>>>>>>> that we're unblocking (I see this as the great gain here):
> flush
> >>>>>>>> with
> >>>>>>>>>> clear
> >>>>>>>>>>>> error option enabled -> catch and do whatever error handling
> we
> >>>> want
> >>>>>>>>> ->
> >>>>>>>>>>>> commitTransaction successfully
> >>>>>>>>>>>>
> >>>>>>>>>>>> Thanks!
> >>>>>>>>>>>>
> >>>>>>>>>>>> Lianet
> >>>>>>>>>>>>
> >>>>>>>>>>>> On Wed, Jun 19, 2024 at 11:26 PM Chris Egerton <
> >>>>>>>>> fearthecel...@gmail.com
> >>>>>>>>>>>
> >>>>>>>>>>>> wrote:
> >>>>>>>>>>>>
> >>>>>>>>>>>>> Hi Matthias,
> >>>>>>>>>>>>>
> >>>>>>>>>>>>> I like the alternatives you've listed. One more that might
> help
> >>>> is
> >>>>>>>>> if,
> >>>>>>>>>>>>> instead of overloading flush(), we overloaded
> commitTransaction()
> >>>>>>>> to
> >>>>>>>>>>>>> something like commitTransaction(boolean
> tolerateRecordErrors).
> >>>>>>>> This
> >>>>>>>>>> seems
> >>>>>>>>>>>>> slightly cleaner in that it takes the behavioral change we
> want,
> >>>>>>>>> which
> >>>>>>>>>> only
> >>>>>>>>>>>>> applies to transactional producers, to an API method that is
> only
> >>>>>>>>> used
> >>>>>>>>>> for
> >>>>>>>>>>>>> transactional producers. It would also avoid the issue of
> whether
> >>>>>>>> or
> >>>>>>>>>> not
> >>>>>>>>>>>>> flush() (or a new variant of it with altered semantics)
> should
> >>>>>>>> throw
> >>>>>>>>> or
> >>>>>>>>>>>>> not. Thoughts?
> >>>>>>>>>>>>>
> >>>>>>>>>>>>> Hi Alieh,
> >>>>>>>>>>>>>
> >>>>>>>>>>>>> Thanks for the KIP, I like this direction a lot more than the
> >>>>>>>>> pluggable
> >>>>>>>>>>>>> handler!
> >>>>>>>>>>>>>
> >>>>>>>>>>>>> I share Artem's concerns that enabling this behavior via
> >>>>>>>>> configuration
> >>>>>>>>>>>>> doesn't seem like a great fit. It's likely that application
> code
> >>>>>>>> will
> >>>>>>>>>> be
> >>>>>>>>>>>>> written in a style that only works with one type of behavior
> from
> >>>>>>>>>>>>> transactional producers, so requiring that application code
> to
> >>>>>>>>> declare
> >>>>>>>>>> its
> >>>>>>>>>>>>> expectations for the behavior of its producer seems more
> >>>>>>>> appropriate
> >>>>>>>>>> than,
> >>>>>>>>>>>>> e.g., allowing users deploying that application to tweak a
> >>>>>>>>>> configuration
> >>>>>>>>>>>>> file that gets fed to producers spun up inside it.
> >>>>>>>>>>>>>
> >>>>>>>>>>>>> Cheers,
> >>>>>>>>>>>>>
> >>>>>>>>>>>>> Chris
> >>>>>>>>>>>>>
> >>>>>>>>>>>>> On Wed, Jun 19, 2024 at 10:32 PM Matthias J. Sax <
> >>>> mj...@apache.org
> >>>>>>>>>
> >>>>>>>>>> wrote:
> >>>>>>>>>>>>>
> >>>>>>>>>>>>>> Thanks for the KIP Alieh. I actually like the KIP as-is, but
> >>>> think
> >>>>>>>>>>>>>> Arthem raises very good points...
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>> Seems we have four options on how to move forward?
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>>    1. add config to allow "silent error clearance" as the
> KIP
> >>>>>>>>> proposes
> >>>>>>>>>>>>>>    2. change flush() to clear error and let it throw
> >>>>>>>>>>>>>>    3. add new flushAndThrow()` (or better name) which clears
> >>>> error
> >>>>>>>>> and
> >>>>>>>>>>>>>> throws
> >>>>>>>>>>>>>>    4. add `flush(boolean clearAndThrow)` and let user pick
> (and
> >>>>>>>>>> deprecate
> >>>>>>>>>>>>>> existing `flush()`)
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>> For (2), given that it would be a behavior change, we might
> also
> >>>>>>>>> need
> >>>>>>>>>> a
> >>>>>>>>>>>>>> public "feature flag" config.
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>> It seems, both (1) and (2) have the issue Artem mentioned.
> (3)
> >>>> and
> >>>>>>>>> (4)
> >>>>>>>>>>>>>> would be safer to this end, however, for both we kinda get
> an
> >>>> ugly
> >>>>>>>>>> API?
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>> Not sure right now if I have any preference. Seems we need
> to
> >>>> pick
> >>>>>>>>>> some
> >>>>>>>>>>>>>> evil and that there is no clear best solution? Would be
> good to
> >>>>>>>> her
> >>>>>>>>>> from
> >>>>>>>>>>>>>> others what they think
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>> -Matthias
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>> On 6/18/24 8:39 PM, Artem Livshits wrote:
> >>>>>>>>>>>>>>> Hi Alieh,
> >>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>> Thank you for the KIP.  I have a couple of suggestions:
> >>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>> AL1.  We should throw an error from flush after we clear
> it.
> >>>>>>>> This
> >>>>>>>>>>>>> would
> >>>>>>>>>>>>>>> make it so that both "send + commit" and "send + flush +
> >>>> commit"
> >>>>>>>>> (the
> >>>>>>>>>>>>>>> latter looks like just a more verbose way to express the
> >>>> former,
> >>>>>>>>> and
> >>>>>>>>>> it
> >>>>>>>>>>>>>>> would be intuitive if it behaves the same) would throw if
> the
> >>>>>>>>>>>>> transaction
> >>>>>>>>>>>>>>> has an error (so if the code is written either way it's
> going
> >>>> be
> >>>>>>>>>>>>>> correct).
> >>>>>>>>>>>>>>> At the same time, the latter could be extended by the
> caller to
> >>>>>>>>>>>>> intercept
> >>>>>>>>>>>>>>> exceptions from flush, ignore as needed, and commit the
> >>>>>>>>> transaction.
> >>>>>>>>>>>>>> This
> >>>>>>>>>>>>>>> solution would keep basic things simple (if someone has
> code
> >>>> that
> >>>>>>>>>>>>> doesn't
> >>>>>>>>>>>>>>> require advanced error handling, then basic "send + flush +
> >>>>>>>> commit"
> >>>>>>>>>>>>> would
> >>>>>>>>>>>>>>> do the right thing) and advanced things possible, an
> >>>> application
> >>>>>>>>> can
> >>>>>>>>>>>>> add
> >>>>>>>>>>>>>>> try + catch around flush and ignore some errors.
> >>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>> AL2.  I'm not sure if config is the best way to express the
> >>>>>>>>>>>>> modification
> >>>>>>>>>>>>>> of
> >>>>>>>>>>>>>>> the "flush" semantics -- the application logic that calls
> >>>> "flush"
> >>>>>>>>>> needs
> >>>>>>>>>>>>>> to
> >>>>>>>>>>>>>>> match the "flush" semantics and configuring semantics in a
> >>>>>>>> detached
> >>>>>>>>>>>>> place
> >>>>>>>>>>>>>>> creates a room for bugs due to discrepancies.  This can be
> >>>>>>>>> especially
> >>>>>>>>>>>>> bad
> >>>>>>>>>>>>>>> if the producer loads configuration from a file at run
> time, in
> >>>>>>>>> that
> >>>>>>>>>>>>>> case a
> >>>>>>>>>>>>>>> mistake in configuration could break the application
> because it
> >>>>>>>> was
> >>>>>>>>>>>>>> written
> >>>>>>>>>>>>>>> to expect one "flush" semantics but the semantics is
> switched.
> >>>>>>>>> Given
> >>>>>>>>>>>>>> that
> >>>>>>>>>>>>>>> the "flush" semantics needs to match the caller's
> expectation,
> >>>> a
> >>>>>>>>> way
> >>>>>>>>>> to
> >>>>>>>>>>>>>>> accomplish that would be to pass the caller's expectation
> to
> >>>> the
> >>>>>>>>>>>>> "flush"
> >>>>>>>>>>>>>>> call by either have a method with a different name or have
> an
> >>>>>>>>>> overload
> >>>>>>>>>>>>>> with
> >>>>>>>>>>>>>>> a Boolen flag that would configure the semantics (the
> current
> >>>>>>>>> method
> >>>>>>>>>>>>>> could
> >>>>>>>>>>>>>>> just redirect to the new one).
> >>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>> -Artem
> >>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>> On Mon, Jun 17, 2024 at 9:09 AM Alieh Saeedi
> >>>>>>>>>>>>>> <asae...@confluent.io.invalid>
> >>>>>>>>>>>>>>> wrote:
> >>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>> Hi all,
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>> I'd like to kick off a discussion for KIP-1059 that
> suggests
> >>>>>>>>> adding
> >>>>>>>>>> a
> >>>>>>>>>>>>>> new
> >>>>>>>>>>>>>>>> feature to the Producer flush() method.
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>
> >>>>>>>>>>
> >>>>>>>>>
> >>>>>>>>
> >>>>>>
> >>>>
> https://cwiki.apache.org/confluence/display/KAFKA/KIP-1059%3A+Enable+the+Producer+flush%28%29+method+to+clear+the+latest+send%28%29+error
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>> Cheers,
> >>>>>>>>>>>>>>>> Alieh
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>
> >>>>>>>>>>>
> >>>>>>>>>>
> >>>>>>>>>
> >>>>>>>>
> >>>>>>
> >>>>>>
> >>>>>
> >>>>
> >
>

Reply via email to