That's a fair point about other clients. I think the abortable error case is interesting because I'm curious how other clients would handle this. I assume they would need to implement handling for the error code unless they did something like "any unknown error codes/any codes that aren't x,y,z are retriable." I would hope that unknown error codes were fatal, and if the code was implemented it would abort the transaction. But I will think on this too.
As for InvalidRecord -- you mentioned it was not fatal, but I'm taking a look through the code. We would see this on handling the produce response. If I recall correctly, we check if errors are retriable. I think this error would not be retriable. But I guess the concern here is that it is not enough for just that batch to fail. I guess I hadn't considered fully fencing the old producer but there are valid arguments here why we would want to. Thanks, Justine On Fri, Jan 20, 2023 at 2:35 PM Guozhang Wang <guozhang.wang...@gmail.com> wrote: > Thanks Justine for the replies! I agree with most of your thoughts. > > Just for 3/7), though I agree for our own AK producer, since we do > "nextRequest(boolean hasIncompleteBatches)", we guarantee the end-txn > would not be sent until we've effectively flushed, but I was referring > to any future bugs or other buggy clients that the same client may get > into this situation, in which case we should give the client a clear > msg that "you did something wrong, and hence now you should fatally > close yourself". What I'm concerned about is that, by seeing an > "abortable error" or in some rare cases an "invalid record", the > client could not realize "something that's really bad happened". So > it's not about adding a new error, it's mainly about those real buggy > situations causing such "should never happen" cases, the errors return > would not be informative enough. > > Thinking in other ways, if we believe that for most cases such error > codes would not reach the original clients since they would be > disconnected or even gone by that time, and only in some rare cases > they would still be seen by the sending clients, then why not make > them more fatal and more specific than generic. > > Guozhang > > On Fri, Jan 20, 2023 at 1:59 PM Justine Olshan > <jols...@confluent.io.invalid> wrote: > > > > Hey Guozhang. Thanks for taking a look and for the detailed comments! > I'll > > do my best to address below. > > > > 1. I see what you are saying here, but I think I need to look through the > > sequence of events you mention. Typically we've seen this issue in a few > > cases. > > > > One is when we have a producer disconnect when trying to produce. > > Typically in these cases, we abort the transaction. We've seen that after > > the markers are written, the disconnection can sometimes cause the > request > > to get flushed to the broker. In this case, we don't need client handling > > because the producer we are responding to is gone. We just needed to make > > sure we didn't write to the log on the broker side. I'm trying to think > of > > a case where we do have the client to return to. I'd think the same > client > > couldn't progress to committing the transaction unless the produce > request > > returned right? Of course, there is the incorrectly written clients case. > > I'll think on this a bit more and let you know if I come up with another > > scenario when we would return to an active client when the transaction is > > no longer ongoing. > > > > I was not aware that we checked the result of a send after we commit > > though. I'll need to look into that a bit more. > > > > 2. There were some questions about this in the discussion. The plan is to > > handle overflow with the mechanism we currently have in the producer. If > we > > try to bump and the epoch will overflow, we actually allocate a new > > producer ID. I need to confirm the fencing logic on the last epoch (ie, > we > > probably shouldn't allow any records to be produced with the final epoch > > since we can never properly fence that one). > > > > 3. I can agree with you that the current error handling is messy. I > recall > > taking a look at your KIP a while back, but I think I mostly saw the > > section about how the errors were wrapped. Maybe I need to take another > > look. As for abortable error, the idea was that the handling would be > > simple -- if this error is seen, the transaction should be aborted -- no > > other logic about previous state or requests necessary. Is your concern > > simply about adding new errors? We were hoping to have an error that > would > > have one meaning and many of the current errors have a history of meaning > > different things on different client versions. That was the main > motivation > > for adding a new error. > > > > 4. This is a good point about record timestamp reordering. Timestamps > don't > > affect compaction, but they do affect retention deletion. For that, kafka > > considers the largest timestamp in the segment, so I think a small amount > > of reordering (hopefully on the order of milliseconds or even seconds) > will > > be ok. We take timestamps from clients so there is already a possibility > > for some drift and non-monotonically increasing timestamps. > > > > 5. Thanks for catching. The error is there, but it's actually that those > > fields should be 4+! Due to how the message generator works, I actually > > have to redefine those fields inside the `"AddPartitionsToTxnTransaction` > > block for it to build correctly. I'll fix it to be correct. > > > > 6. Correct -- we will only add the request to purgatory if the cache has > no > > ongoing transaction. I can change the wording to make that clearer that > we > > only place the request in purgatory if we need to contact the transaction > > coordinator. > > > > 7. We did take a look at some of the errors and it was hard to come up > with > > a good one. I agree that InvalidTxnStateException is ideal except for the > > fact that it hasn't been returned on Produce requests before. The error > > handling for clients is a bit vague (which is why I opened KAFKA-14439 > > <https://issues.apache.org/jira/browse/KAFKA-14439>), but the decision > we > > made here was to only return errors that have been previously returned to > > producers. As for not being fatal, I think part of the theory was that in > > many cases, the producer would be disconnected. (See point 1) and this > > would just be an error to return from the server. I did plan to think > about > > other cases, so let me know if you think of any as well! > > > > Lots to say! Let me know if you have further thoughts! > > Justine > > > > On Fri, Jan 20, 2023 at 11:21 AM Guozhang Wang < > guozhang.wang...@gmail.com> > > wrote: > > > > > Hello Justine, > > > > > > Thanks for the great write-up! I made a quick pass through it and here > > > are some thoughts (I have not been able to read through this thread so > > > pardon me if they have overlapped or subsumed by previous comments): > > > > > > First are some meta ones: > > > > > > 1. I think we need to also improve the client's experience once we > > > have this defence in place. More concretely, say a user's producer > > > code is like following: > > > > > > future = producer.send(); > > > // producer.flush(); > > > producer.commitTransaction(); > > > future.get(); > > > > > > Which resulted in the order of a) produce-request sent by producer, b) > > > end-txn-request sent by producer, c) end-txn-response sent back, d) > > > txn-marker-request sent from coordinator to partition leader, e) > > > produce-request finally received by the partition leader, before this > > > KIP e) step would be accepted causing a dangling txn; now it would be > > > rejected in step e) which is good. But from the client's point of view > > > now it becomes confusing since the `commitTransaction()` returns > > > successfully, but the "future" throws an invalid-epoch error, and they > > > are not sure if the transaction did succeed or not. In fact, it > > > "partially succeeded" with some msgs being rejected but others > > > committed successfully. > > > > > > Of course the easy way to avoid this is, always call > > > "producer.flush()" before commitTxn and that's what we do ourselves, > > > and what we recommend users do. But I suspect not everyone does it. In > > > fact I just checked the javadoc in KafkaProducer and our code snippet > > > does not include a `flush()` call. So I'm thinking maybe we can in > > > side the `commitTxn` code to enforce flushing before sending the > > > end-txn request. > > > > > > 2. I'd like to clarify a bit details on "just add partitions to the > > > transaction on the first produce request during a transaction". My > > > understanding is that the partition leader's cache has the producer id > > > / sequence / epoch for the latest txn, either on-going or is completed > > > (upon receiving the marker request from coordinator). When a produce > > > request is received, if > > > > > > * producer's epoch < cached epoch, or producer's epoch == cached epoch > > > but the latest txn is completed, leader directly reject with > > > invalid-epoch. > > > * producer's epoch > cached epoch, park the the request and send > > > add-partitions request to coordinator. > > > > > > In order to do it, does the coordinator need to bump the sequence and > > > reset epoch to 0 when the next epoch is going to overflow? If no need > > > to do so, then how we handle the (admittedly rare, but still may > > > happen) epoch overflow situation? > > > > > > 3. I'm a bit concerned about adding a generic "ABORTABLE_ERROR" given > > > we already have a pretty messy error classification and error handling > > > on the producer clients side --- I have a summary about the issues and > > > a proposal to address this in > > > > > > > https://cwiki.apache.org/confluence/display/KAFKA/KIP-691%3A+Enhance+Transactional+Producer+Exception+Handling > > > -- I understand we do not want to use "UNKNOWN_PRODUCER_ID" anymore > > > and in fact we intend to deprecate it in KIP-360 and eventually remove > > > it; but I'm wondering can we still use specific error codes. E.g. what > > > about "InvalidProducerEpochException" since for new clients, the > > > actual reason this would actually be rejected is indeed because the > > > epoch on the coordinator caused the add-partitions-request from the > > > brokers to be rejected anyways? > > > > > > 4. It seems we put the producer request into purgatory before we ever > > > append the records, while other producer's records may still be > > > appended during the time; and that potentially may result in some > > > re-ordering compared with reception order. I'm not super concerned > > > about it since Kafka does not guarantee reception ordering across > > > producers anyways, but it may make the timestamps of records inside a > > > partition to be more out-of-ordered. Are we aware of any scenarios > > > such as future enhancements on log compactions that may be affected by > > > this effect? > > > > > > Below are just minor comments: > > > > > > 5. In "AddPartitionsToTxnTransaction" field of > > > "AddPartitionsToTxnRequest" RPC, the versions of those inner fields > > > are "0-3" while I thought they should be "0+" still? > > > > > > 6. Regarding "we can place the request in a purgatory of sorts and > > > check if there is any state for the transaction on the broker": i > > > think at this time when we just do the checks against the cached > > > state, we do not need to put the request to purgatory yet? > > > > > > 7. This is related to 3) above. I feel using "InvalidRecordException" > > > for older clients may also be a bit confusing, and also it is not > > > fatal -- for old clients, it better to be fatal since this indicates > > > the clients is doing something wrong and hence it should be closed. > > > And in general I'd prefer to use slightly more specific meaning error > > > codes for clients. That being said, I also feel > > > "InvalidProducerEpochException" is not suitable for old versioned > > > clients, and we'd have to pick one that old clients recognize. I'd > > > prefer "InvalidTxnStateException" but that one is supposed to be > > > returned from txn coordinators only today. I'd suggest we do a quick > > > check in the current client's code path and see if that one would be > > > handled if it's from a produce-response, and if yes, use this one; > > > otherwise, use "ProducerFencedException" which is much less meaningful > > > but it's still a fatal error. > > > > > > > > > Thanks, > > > Guozhang > > > > > > > > > > > > On Wed, Jan 18, 2023 at 3:01 PM Justine Olshan > > > <jols...@confluent.io.invalid> wrote: > > > > > > > > Yeah -- looks like we already have code to handle bumping the epoch > and > > > > when the epoch is Short.MAX_VALUE, we get a new producer ID. Since > this > > > is > > > > already the behavior, do we want to change it further? > > > > > > > > Justine > > > > > > > > On Wed, Jan 18, 2023 at 1:12 PM Justine Olshan <jols...@confluent.io > > > > > wrote: > > > > > > > > > Hey all, just wanted to quickly update and say I've modified the > KIP to > > > > > explicitly mention that AddOffsetCommitsToTxnRequest will be > replaced > > > by > > > > > a coordinator-side (inter-broker) AddPartitionsToTxn implicit > request. > > > This > > > > > mirrors the user partitions and will implicitly add offset > partitions > > > to > > > > > transactions when we commit offsets on them. We will deprecate > > > AddOffsetCommitsToTxnRequest > > > > > for new clients. > > > > > > > > > > Also to address Artem's comments -- > > > > > I'm a bit unsure if the changes here will change the previous > behavior > > > for > > > > > fencing producers. In the case you mention in the first paragraph, > are > > > you > > > > > saying we bump the epoch before we try to abort the transaction? I > > > think I > > > > > need to understand the scenarios you mention a bit better. > > > > > > > > > > As for the second part -- I think it makes sense to have some sort > of > > > > > "sentinel" epoch to signal epoch is about to overflow (I think we > sort > > > of > > > > > have this value in place in some ways) so we can codify it in the > KIP. > > > I'll > > > > > look into that and try to update soon. > > > > > > > > > > Thanks, > > > > > Justine. > > > > > > > > > > On Fri, Jan 13, 2023 at 5:01 PM Artem Livshits > > > > > <alivsh...@confluent.io.invalid> wrote: > > > > > > > > > >> It's good to know that KIP-588 addressed some of the issues. > Looking > > > at > > > > >> the code, it still looks like there are some cases that would > result > > > in > > > > >> fatal error, e.g. PRODUCER_FENCED is issued by the transaction > > > coordinator > > > > >> if epoch doesn't match, and the client treats it as a fatal error > > > (code in > > > > >> TransactionManager request handling). If we consider, for > example, > > > > >> committing a transaction that returns a timeout, but actually > > > succeeds, > > > > >> trying to abort it or re-commit may result in PRODUCER_FENCED > error > > > > >> (because of epoch bump). > > > > >> > > > > >> For failed commits, specifically, we need to know the actual > outcome, > > > > >> because if we return an error the application may think that the > > > > >> transaction is aborted and redo the work, leading to duplicates. > > > > >> > > > > >> Re: overflowing epoch. We could either do it on the TC and return > > > both > > > > >> producer id and epoch (e.g. change the protocol), or signal the > client > > > > >> that > > > > >> it needs to get a new producer id. Checking for max epoch could > be a > > > > >> reasonable signal, the value to check should probably be present > in > > > the > > > > >> KIP > > > > >> as this is effectively a part of the contract. Also, the TC > should > > > > >> probably return an error if the client didn't change producer id > after > > > > >> hitting max epoch. > > > > >> > > > > >> -Artem > > > > >> > > > > >> > > > > >> On Thu, Jan 12, 2023 at 10:31 AM Justine Olshan > > > > >> <jols...@confluent.io.invalid> wrote: > > > > >> > > > > >> > Thanks for the discussion Artem. > > > > >> > > > > > >> > With respect to the handling of fenced producers, we have some > > > behavior > > > > >> > already in place. As of KIP-588: > > > > >> > > > > > >> > > > > > >> > > > > https://cwiki.apache.org/confluence/display/KAFKA/KIP-588%3A+Allow+producers+to+recover+gracefully+from+transaction+timeouts > > > > >> > , > > > > >> > we handle timeouts more gracefully. The producer can recover. > > > > >> > > > > > >> > Produce requests can also recover from epoch fencing by > aborting the > > > > >> > transaction and starting over. > > > > >> > > > > > >> > What other cases were you considering that would cause us to > have a > > > > >> fenced > > > > >> > epoch but we'd want to recover? > > > > >> > > > > > >> > The first point about handling epoch overflows is fair. I think > > > there is > > > > >> > some logic we'd need to consider. (ie, if we are one away from > the > > > max > > > > >> > epoch, we need to reset the producer ID.) I'm still wondering if > > > there > > > > >> is a > > > > >> > way to direct this from the response, or if everything should be > > > done on > > > > >> > the client side. Let me know if you have any thoughts here. > > > > >> > > > > > >> > Thanks, > > > > >> > Justine > > > > >> > > > > > >> > On Tue, Jan 10, 2023 at 4:06 PM Artem Livshits > > > > >> > <alivsh...@confluent.io.invalid> wrote: > > > > >> > > > > > >> > > There are some workflows in the client that are implied by > > > protocol > > > > >> > > changes, e.g.: > > > > >> > > > > > > >> > > - for new clients, epoch changes with every transaction and > can > > > > >> overflow, > > > > >> > > in old clients this condition was handled transparently, > because > > > epoch > > > > >> > was > > > > >> > > bumped in InitProducerId and it would return a new producer > id if > > > > >> epoch > > > > >> > > overflows, the new clients would need to implement some > workflow > > > to > > > > >> > refresh > > > > >> > > producer id > > > > >> > > - how to handle fenced producers, for new clients epoch > changes > > > with > > > > >> > every > > > > >> > > transaction, so in presence of failures during commits / > aborts, > > > the > > > > >> > > producer could get easily fenced, old clients would pretty > much > > > would > > > > >> get > > > > >> > > fenced when a new incarnation of the producer was initialized > with > > > > >> > > InitProducerId so it's ok to treat as a fatal error, the new > > > clients > > > > >> > would > > > > >> > > need to implement some workflow to handle that error, > otherwise > > > they > > > > >> > could > > > > >> > > get fenced by themselves > > > > >> > > - in particular (as a subset of the previous issue), what > would > > > the > > > > >> > client > > > > >> > > do if it got a timeout during commit? commit could've > succeeded > > > or > > > > >> > failed > > > > >> > > > > > > >> > > Not sure if this has to be defined in the KIP as implementing > > > those > > > > >> > > probably wouldn't require protocol changes, but we have > multiple > > > > >> > > implementations of Kafka clients, so probably would be good to > > > have > > > > >> some > > > > >> > > client implementation guidance. Could also be done as a > separate > > > doc. > > > > >> > > > > > > >> > > -Artem > > > > >> > > > > > > >> > > On Mon, Jan 9, 2023 at 3:38 PM Justine Olshan > > > > >> > <jols...@confluent.io.invalid > > > > >> > > > > > > > >> > > wrote: > > > > >> > > > > > > >> > > > Hey all, I've updated the KIP to incorporate Jason's > > > suggestions. > > > > >> > > > > > > > >> > > > > > > > >> > > > > > > > >> > > > > > > >> > > > > > >> > > > > https://cwiki.apache.org/confluence/display/KAFKA/KIP-890%3A+Transactions+Server-Side+Defense > > > > >> > > > > > > > >> > > > > > > > >> > > > 1. Use AddPartitionsToTxn + verify flag to check on old > clients > > > > >> > > > 2. Updated AddPartitionsToTxn API to support transaction > > > batching > > > > >> > > > 3. Mention IBP bump > > > > >> > > > 4. Mention auth change on new AddPartitionsToTxn version. > > > > >> > > > > > > > >> > > > I'm planning on opening a vote soon. > > > > >> > > > Thanks, > > > > >> > > > Justine > > > > >> > > > > > > > >> > > > On Fri, Jan 6, 2023 at 3:32 PM Justine Olshan < > > > jols...@confluent.io > > > > >> > > > > > >> > > > wrote: > > > > >> > > > > > > > >> > > > > Thanks Jason. Those changes make sense to me. I will > update > > > the > > > > >> KIP. > > > > >> > > > > > > > > >> > > > > > > > > >> > > > > > > > > >> > > > > On Fri, Jan 6, 2023 at 3:31 PM Jason Gustafson > > > > >> > > > <ja...@confluent.io.invalid> > > > > >> > > > > wrote: > > > > >> > > > > > > > > >> > > > >> Hey Justine, > > > > >> > > > >> > > > > >> > > > >> > I was wondering about compatibility here. When we send > > > requests > > > > >> > > > >> between brokers, we want to ensure that the receiving > broker > > > > >> > > understands > > > > >> > > > >> the request (specifically the new fields). Typically > this is > > > done > > > > >> > via > > > > >> > > > >> IBP/metadata version. > > > > >> > > > >> I'm trying to think if there is a way around it but I'm > not > > > sure > > > > >> > there > > > > >> > > > is. > > > > >> > > > >> > > > > >> > > > >> Yes. I think we would gate usage of this behind an IBP > bump. > > > Does > > > > >> > that > > > > >> > > > >> seem > > > > >> > > > >> reasonable? > > > > >> > > > >> > > > > >> > > > >> > As for the improvements -- can you clarify how the > multiple > > > > >> > > > >> transactional > > > > >> > > > >> IDs would help here? Were you thinking of a case where we > > > > >> wait/batch > > > > >> > > > >> multiple produce requests together? My understanding for > now > > > was > > > > >> 1 > > > > >> > > > >> transactional ID and one validation per 1 produce > request. > > > > >> > > > >> > > > > >> > > > >> Each call to `AddPartitionsToTxn` is essentially a write > to > > > the > > > > >> > > > >> transaction > > > > >> > > > >> log and must block on replication. The more we can fit > into a > > > > >> single > > > > >> > > > >> request, the more writes we can do in parallel. The > > > alternative > > > > >> is > > > > >> > to > > > > >> > > > make > > > > >> > > > >> use of more connections, but usually we prefer batching > > > since the > > > > >> > > > network > > > > >> > > > >> stack is not really optimized for high connection/request > > > loads. > > > > >> > > > >> > > > > >> > > > >> > Finally with respect to the authorizations, I think it > > > makes > > > > >> sense > > > > >> > > to > > > > >> > > > >> skip > > > > >> > > > >> topic authorizations, but I'm a bit confused by the > "leader > > > ID" > > > > >> > field. > > > > >> > > > >> Wouldn't we just want to flag the request as from a > broker > > > (does > > > > >> it > > > > >> > > > matter > > > > >> > > > >> which one?). > > > > >> > > > >> > > > > >> > > > >> We could also make it version-based. For the next > version, we > > > > >> could > > > > >> > > > >> require > > > > >> > > > >> CLUSTER auth. So clients would not be able to use the API > > > > >> anymore, > > > > >> > > which > > > > >> > > > >> is > > > > >> > > > >> probably what we want. > > > > >> > > > >> > > > > >> > > > >> -Jason > > > > >> > > > >> > > > > >> > > > >> On Fri, Jan 6, 2023 at 10:43 AM Justine Olshan > > > > >> > > > >> <jols...@confluent.io.invalid> > > > > >> > > > >> wrote: > > > > >> > > > >> > > > > >> > > > >> > As a follow up, I was just thinking about the batching > a > > > bit > > > > >> more. > > > > >> > > > >> > I suppose if we have one request in flight and we > queue up > > > the > > > > >> > other > > > > >> > > > >> > produce requests in some sort of purgatory, we could > send > > > > >> > > information > > > > >> > > > >> out > > > > >> > > > >> > for all of them rather than one by one. So that would > be a > > > > >> benefit > > > > >> > > of > > > > >> > > > >> > batching partitions to add per transaction. > > > > >> > > > >> > > > > > >> > > > >> > I'll need to think a bit more on the design of this > part > > > of the > > > > >> > KIP, > > > > >> > > > and > > > > >> > > > >> > will update the KIP in the next few days. > > > > >> > > > >> > > > > > >> > > > >> > Thanks, > > > > >> > > > >> > Justine > > > > >> > > > >> > > > > > >> > > > >> > On Fri, Jan 6, 2023 at 10:22 AM Justine Olshan < > > > > >> > > jols...@confluent.io> > > > > >> > > > >> > wrote: > > > > >> > > > >> > > > > > >> > > > >> > > Hey Jason -- thanks for the input -- I was just > digging > > > a bit > > > > >> > > deeper > > > > >> > > > >> into > > > > >> > > > >> > > the design + implementation of the validation calls > here > > > and > > > > >> > what > > > > >> > > > you > > > > >> > > > >> say > > > > >> > > > >> > > makes sense. > > > > >> > > > >> > > > > > > >> > > > >> > > I was wondering about compatibility here. When we > send > > > > >> requests > > > > >> > > > >> > > between brokers, we want to ensure that the receiving > > > broker > > > > >> > > > >> understands > > > > >> > > > >> > > the request (specifically the new fields). Typically > > > this is > > > > >> > done > > > > >> > > > via > > > > >> > > > >> > > IBP/metadata version. > > > > >> > > > >> > > I'm trying to think if there is a way around it but > I'm > > > not > > > > >> sure > > > > >> > > > there > > > > >> > > > >> > is. > > > > >> > > > >> > > > > > > >> > > > >> > > As for the improvements -- can you clarify how the > > > multiple > > > > >> > > > >> transactional > > > > >> > > > >> > > IDs would help here? Were you thinking of a case > where we > > > > >> > > wait/batch > > > > >> > > > >> > > multiple produce requests together? My understanding > for > > > now > > > > >> > was 1 > > > > >> > > > >> > > transactional ID and one validation per 1 produce > > > request. > > > > >> > > > >> > > > > > > >> > > > >> > > Finally with respect to the authorizations, I think > it > > > makes > > > > >> > sense > > > > >> > > > to > > > > >> > > > >> > skip > > > > >> > > > >> > > topic authorizations, but I'm a bit confused by the > > > "leader > > > > >> ID" > > > > >> > > > field. > > > > >> > > > >> > > Wouldn't we just want to flag the request as from a > > > broker > > > > >> (does > > > > >> > > it > > > > >> > > > >> > matter > > > > >> > > > >> > > which one?). > > > > >> > > > >> > > > > > > >> > > > >> > > I think I want to adopt these suggestions, just had > a few > > > > >> > > questions > > > > >> > > > on > > > > >> > > > >> > the > > > > >> > > > >> > > details. > > > > >> > > > >> > > > > > > >> > > > >> > > Thanks, > > > > >> > > > >> > > Justine > > > > >> > > > >> > > > > > > >> > > > >> > > On Thu, Jan 5, 2023 at 5:05 PM Jason Gustafson > > > > >> > > > >> > <ja...@confluent.io.invalid> > > > > >> > > > >> > > wrote: > > > > >> > > > >> > > > > > > >> > > > >> > >> Hi Justine, > > > > >> > > > >> > >> > > > > >> > > > >> > >> Thanks for the proposal. > > > > >> > > > >> > >> > > > > >> > > > >> > >> I was thinking about the implementation a little > bit. > > > In the > > > > >> > > > current > > > > >> > > > >> > >> proposal, the behavior depends on whether we have an > > > old or > > > > >> new > > > > >> > > > >> client. > > > > >> > > > >> > >> For > > > > >> > > > >> > >> old clients, we send `DescribeTransactions` and > verify > > > the > > > > >> > result > > > > >> > > > and > > > > >> > > > >> > for > > > > >> > > > >> > >> new clients, we send `AddPartitionsToTxn`. We might > be > > > able > > > > >> to > > > > >> > > > >> simplify > > > > >> > > > >> > >> the > > > > >> > > > >> > >> implementation if we can use the same request type. > For > > > > >> > example, > > > > >> > > > >> what if > > > > >> > > > >> > >> we > > > > >> > > > >> > >> bump the protocol version for `AddPartitionsToTxn` > and > > > add a > > > > >> > > > >> > >> `validateOnly` > > > > >> > > > >> > >> flag? For older versions, we can set > > > `validateOnly=true` so > > > > >> > that > > > > >> > > > the > > > > >> > > > >> > >> request only returns successfully if the partition > had > > > > >> already > > > > >> > > been > > > > >> > > > >> > added. > > > > >> > > > >> > >> For new versions, we can set `validateOnly=false` > and > > > the > > > > >> > > partition > > > > >> > > > >> will > > > > >> > > > >> > >> be > > > > >> > > > >> > >> added to the transaction. The other slightly > annoying > > > thing > > > > >> > that > > > > >> > > > this > > > > >> > > > >> > >> would > > > > >> > > > >> > >> get around is the need to collect the transaction > state > > > for > > > > >> all > > > > >> > > > >> > partitions > > > > >> > > > >> > >> even when we only care about a subset. > > > > >> > > > >> > >> > > > > >> > > > >> > >> Some additional improvements to consider: > > > > >> > > > >> > >> > > > > >> > > > >> > >> - We can give `AddPartitionsToTxn` better batch > support > > > for > > > > >> > > > >> inter-broker > > > > >> > > > >> > >> usage. Currently we only allow one > `TransactionalId` to > > > be > > > > >> > > > specified, > > > > >> > > > >> > but > > > > >> > > > >> > >> the broker may get some benefit being able to batch > > > across > > > > >> > > multiple > > > > >> > > > >> > >> transactions. > > > > >> > > > >> > >> - Another small improvement is skipping topic > > > authorization > > > > >> > > checks > > > > >> > > > >> for > > > > >> > > > >> > >> `AddPartitionsToTxn` when the request is from a > broker. > > > > >> Perhaps > > > > >> > > we > > > > >> > > > >> can > > > > >> > > > >> > add > > > > >> > > > >> > >> a field for the `LeaderId` or something like that > and > > > > >> require > > > > >> > > > CLUSTER > > > > >> > > > >> > >> permission when set. > > > > >> > > > >> > >> > > > > >> > > > >> > >> Best, > > > > >> > > > >> > >> Jason > > > > >> > > > >> > >> > > > > >> > > > >> > >> > > > > >> > > > >> > >> > > > > >> > > > >> > >> On Mon, Dec 19, 2022 at 3:56 PM Jun Rao > > > > >> > <j...@confluent.io.invalid > > > > >> > > > > > > > >> > > > >> > wrote: > > > > >> > > > >> > >> > > > > >> > > > >> > >> > Hi, Justine, > > > > >> > > > >> > >> > > > > > >> > > > >> > >> > Thanks for the explanation. It makes sense to me > now. > > > > >> > > > >> > >> > > > > > >> > > > >> > >> > Jun > > > > >> > > > >> > >> > > > > > >> > > > >> > >> > On Mon, Dec 19, 2022 at 1:42 PM Justine Olshan > > > > >> > > > >> > >> > <jols...@confluent.io.invalid> > > > > >> > > > >> > >> > wrote: > > > > >> > > > >> > >> > > > > > >> > > > >> > >> > > Hi Jun, > > > > >> > > > >> > >> > > > > > > >> > > > >> > >> > > My understanding of the mechanism is that when > we > > > get to > > > > >> > the > > > > >> > > > last > > > > >> > > > >> > >> epoch, > > > > >> > > > >> > >> > we > > > > >> > > > >> > >> > > increment to the fencing/last epoch and if any > > > further > > > > >> > > requests > > > > >> > > > >> come > > > > >> > > > >> > >> in > > > > >> > > > >> > >> > for > > > > >> > > > >> > >> > > this producer ID they are fenced. Then the > producer > > > > >> gets a > > > > >> > > new > > > > >> > > > ID > > > > >> > > > >> > and > > > > >> > > > >> > >> > > restarts with epoch/sequence 0. The fenced epoch > > > sticks > > > > >> > > around > > > > >> > > > >> for > > > > >> > > > >> > the > > > > >> > > > >> > >> > > duration of producer.id.expiration.ms and > blocks > > > any > > > > >> late > > > > >> > > > >> messages > > > > >> > > > >> > >> > there. > > > > >> > > > >> > >> > > The new ID will get to take advantage of the > > > improved > > > > >> > > semantics > > > > >> > > > >> > around > > > > >> > > > >> > >> > > non-zero start sequences. So I think we are > covered. > > > > >> > > > >> > >> > > > > > > >> > > > >> > >> > > The only potential issue is overloading the > cache, > > > but > > > > >> > > > hopefully > > > > >> > > > >> the > > > > >> > > > >> > >> > > improvements (lowered producer.id.expiration.ms > ) > > > will > > > > >> help > > > > >> > > > with > > > > >> > > > >> > that. > > > > >> > > > >> > >> > Let > > > > >> > > > >> > >> > > me know if you still have concerns. > > > > >> > > > >> > >> > > > > > > >> > > > >> > >> > > Thanks, > > > > >> > > > >> > >> > > Justine > > > > >> > > > >> > >> > > > > > > >> > > > >> > >> > > On Mon, Dec 19, 2022 at 10:24 AM Jun Rao > > > > >> > > > >> <j...@confluent.io.invalid> > > > > >> > > > >> > >> > wrote: > > > > >> > > > >> > >> > > > > > > >> > > > >> > >> > > > Hi, Justine, > > > > >> > > > >> > >> > > > > > > > >> > > > >> > >> > > > Thanks for the explanation. > > > > >> > > > >> > >> > > > > > > > >> > > > >> > >> > > > 70. The proposed fencing logic doesn't apply > when > > > pid > > > > >> > > > changes, > > > > >> > > > >> is > > > > >> > > > >> > >> that > > > > >> > > > >> > >> > > > right? If so, I am not sure how complete we > are > > > > >> > addressing > > > > >> > > > this > > > > >> > > > >> > >> issue > > > > >> > > > >> > >> > if > > > > >> > > > >> > >> > > > the pid changes more frequently. > > > > >> > > > >> > >> > > > > > > > >> > > > >> > >> > > > Thanks, > > > > >> > > > >> > >> > > > > > > > >> > > > >> > >> > > > Jun > > > > >> > > > >> > >> > > > > > > > >> > > > >> > >> > > > > > > > >> > > > >> > >> > > > > > > > >> > > > >> > >> > > > On Fri, Dec 16, 2022 at 9:16 AM Justine Olshan > > > > >> > > > >> > >> > > > <jols...@confluent.io.invalid> > > > > >> > > > >> > >> > > > wrote: > > > > >> > > > >> > >> > > > > > > > >> > > > >> > >> > > > > Hi Jun, > > > > >> > > > >> > >> > > > > > > > > >> > > > >> > >> > > > > Thanks for replying! > > > > >> > > > >> > >> > > > > > > > > >> > > > >> > >> > > > > 70.We already do the overflow mechanism, so > my > > > > >> change > > > > >> > > would > > > > >> > > > >> just > > > > >> > > > >> > >> make > > > > >> > > > >> > >> > > it > > > > >> > > > >> > >> > > > > happen more often. > > > > >> > > > >> > >> > > > > I was also not suggesting a new field in the > > > log, > > > > >> but > > > > >> > in > > > > >> > > > the > > > > >> > > > >> > >> > response, > > > > >> > > > >> > >> > > > > which would be gated by the client version. > > > Sorry if > > > > >> > > > >> something > > > > >> > > > >> > >> there > > > > >> > > > >> > >> > is > > > > >> > > > >> > >> > > > > unclear. I think we are starting to diverge. > > > > >> > > > >> > >> > > > > The goal of this KIP is to not change to the > > > marker > > > > >> > > format > > > > >> > > > at > > > > >> > > > >> > all. > > > > >> > > > >> > >> > > > > > > > > >> > > > >> > >> > > > > 71. Yes, I guess I was going under the > > > assumption > > > > >> that > > > > >> > > the > > > > >> > > > >> log > > > > >> > > > >> > >> would > > > > >> > > > >> > >> > > just > > > > >> > > > >> > >> > > > > look at its last epoch and treat it as the > > > current > > > > >> > > epoch. I > > > > >> > > > >> > >> suppose > > > > >> > > > >> > >> > we > > > > >> > > > >> > >> > > > can > > > > >> > > > >> > >> > > > > have some special logic that if the last > epoch > > > was > > > > >> on a > > > > >> > > > >> marker > > > > >> > > > >> > we > > > > >> > > > >> > >> > > > actually > > > > >> > > > >> > >> > > > > expect the next epoch or something like > that. We > > > > >> just > > > > >> > > need > > > > >> > > > to > > > > >> > > > >> > >> > > distinguish > > > > >> > > > >> > >> > > > > based on whether we had a commit/abort > marker. > > > > >> > > > >> > >> > > > > > > > > >> > > > >> > >> > > > > 72. > > > > >> > > > >> > >> > > > > > if the producer epoch hasn't been bumped > on > > > the > > > > >> > > > >> > >> > > > > broker, it seems that the stucked message > will > > > fail > > > > >> the > > > > >> > > > >> sequence > > > > >> > > > >> > >> > > > validation > > > > >> > > > >> > >> > > > > and will be ignored. If the producer epoch > has > > > been > > > > >> > > bumped, > > > > >> > > > >> we > > > > >> > > > >> > >> ignore > > > > >> > > > >> > >> > > the > > > > >> > > > >> > >> > > > > sequence check and the stuck message could > be > > > > >> appended > > > > >> > to > > > > >> > > > the > > > > >> > > > >> > log. > > > > >> > > > >> > >> > So, > > > > >> > > > >> > >> > > is > > > > >> > > > >> > >> > > > > the latter case that we want to guard? > > > > >> > > > >> > >> > > > > > > > > >> > > > >> > >> > > > > I'm not sure I follow that "the message will > > > fail > > > > >> the > > > > >> > > > >> sequence > > > > >> > > > >> > >> > > > validation". > > > > >> > > > >> > >> > > > > In some of these cases, we had an abort > marker > > > (due > > > > >> to > > > > >> > an > > > > >> > > > >> error) > > > > >> > > > >> > >> and > > > > >> > > > >> > >> > > then > > > > >> > > > >> > >> > > > > the late message comes in with the correct > > > sequence > > > > >> > > number. > > > > >> > > > >> This > > > > >> > > > >> > >> is a > > > > >> > > > >> > >> > > > case > > > > >> > > > >> > >> > > > > covered by the KIP. > > > > >> > > > >> > >> > > > > The latter case is actually not something > we've > > > > >> > > considered > > > > >> > > > >> > here. I > > > > >> > > > >> > >> > > think > > > > >> > > > >> > >> > > > > generally when we bump the epoch, we are > > > accepting > > > > >> that > > > > >> > > the > > > > >> > > > >> > >> sequence > > > > >> > > > >> > >> > > does > > > > >> > > > >> > >> > > > > not need to be checked anymore. My > > > understanding is > > > > >> > also > > > > >> > > > >> that we > > > > >> > > > >> > >> > don't > > > > >> > > > >> > >> > > > > typically bump epoch mid transaction (based > on a > > > > >> quick > > > > >> > > look > > > > >> > > > >> at > > > > >> > > > >> > the > > > > >> > > > >> > >> > > code) > > > > >> > > > >> > >> > > > > but let me know if that is the case. > > > > >> > > > >> > >> > > > > > > > > >> > > > >> > >> > > > > Thanks, > > > > >> > > > >> > >> > > > > Justine > > > > >> > > > >> > >> > > > > > > > > >> > > > >> > >> > > > > On Thu, Dec 15, 2022 at 12:23 PM Jun Rao > > > > >> > > > >> > <j...@confluent.io.invalid > > > > >> > > > >> > >> > > > > > >> > > > >> > >> > > > wrote: > > > > >> > > > >> > >> > > > > > > > > >> > > > >> > >> > > > > > Hi, Justine, > > > > >> > > > >> > >> > > > > > > > > > >> > > > >> > >> > > > > > Thanks for the reply. > > > > >> > > > >> > >> > > > > > > > > > >> > > > >> > >> > > > > > 70. Assigning a new pid on int overflow > seems > > > a > > > > >> bit > > > > >> > > > hacky. > > > > >> > > > >> If > > > > >> > > > >> > we > > > > >> > > > >> > >> > > need a > > > > >> > > > >> > >> > > > > txn > > > > >> > > > >> > >> > > > > > level id, it will be better to model this > > > > >> explicitly. > > > > >> > > > >> Adding a > > > > >> > > > >> > >> new > > > > >> > > > >> > >> > > > field > > > > >> > > > >> > >> > > > > > would require a bit more work since it > > > requires a > > > > >> new > > > > >> > > txn > > > > >> > > > >> > marker > > > > >> > > > >> > >> > > format > > > > >> > > > >> > >> > > > > in > > > > >> > > > >> > >> > > > > > the log. So, we probably need to guard it > > > with an > > > > >> IBP > > > > >> > > or > > > > >> > > > >> > >> metadata > > > > >> > > > >> > >> > > > version > > > > >> > > > >> > >> > > > > > and document the impact on downgrade once > the > > > new > > > > >> > > format > > > > >> > > > is > > > > >> > > > >> > >> written > > > > >> > > > >> > >> > > to > > > > >> > > > >> > >> > > > > the > > > > >> > > > >> > >> > > > > > log. > > > > >> > > > >> > >> > > > > > > > > > >> > > > >> > >> > > > > > 71. Hmm, once the marker is written, the > > > partition > > > > >> > will > > > > >> > > > >> expect > > > > >> > > > >> > >> the > > > > >> > > > >> > >> > > next > > > > >> > > > >> > >> > > > > > append to be on the next epoch. Does that > > > cover > > > > >> the > > > > >> > > case > > > > >> > > > >> you > > > > >> > > > >> > >> > > mentioned? > > > > >> > > > >> > >> > > > > > > > > > >> > > > >> > >> > > > > > 72. Also, just to be clear on the stucked > > > message > > > > >> > issue > > > > >> > > > >> > >> described > > > > >> > > > >> > >> > in > > > > >> > > > >> > >> > > > the > > > > >> > > > >> > >> > > > > > motivation. With EoS, we also validate the > > > > >> sequence > > > > >> > id > > > > >> > > > for > > > > >> > > > >> > >> > > idempotency. > > > > >> > > > >> > >> > > > > So, > > > > >> > > > >> > >> > > > > > with the current logic, if the producer > epoch > > > > >> hasn't > > > > >> > > been > > > > >> > > > >> > >> bumped on > > > > >> > > > >> > >> > > the > > > > >> > > > >> > >> > > > > > broker, it seems that the stucked message > will > > > > >> fail > > > > >> > the > > > > >> > > > >> > sequence > > > > >> > > > >> > >> > > > > validation > > > > >> > > > >> > >> > > > > > and will be ignored. If the producer > epoch has > > > > >> been > > > > >> > > > >> bumped, we > > > > >> > > > >> > >> > ignore > > > > >> > > > >> > >> > > > the > > > > >> > > > >> > >> > > > > > sequence check and the stuck message > could be > > > > >> > appended > > > > >> > > to > > > > >> > > > >> the > > > > >> > > > >> > >> log. > > > > >> > > > >> > >> > > So, > > > > >> > > > >> > >> > > > is > > > > >> > > > >> > >> > > > > > the latter case that we want to guard? > > > > >> > > > >> > >> > > > > > > > > > >> > > > >> > >> > > > > > Thanks, > > > > >> > > > >> > >> > > > > > > > > > >> > > > >> > >> > > > > > Jun > > > > >> > > > >> > >> > > > > > > > > > >> > > > >> > >> > > > > > On Wed, Dec 14, 2022 at 10:44 AM Justine > > > Olshan > > > > >> > > > >> > >> > > > > > <jols...@confluent.io.invalid> wrote: > > > > >> > > > >> > >> > > > > > > > > > >> > > > >> > >> > > > > > > Matthias — thanks again for taking time > to > > > look > > > > >> a > > > > >> > > this. > > > > >> > > > >> You > > > > >> > > > >> > >> said: > > > > >> > > > >> > >> > > > > > > > > > > >> > > > >> > >> > > > > > > > My proposal was only focusing to avoid > > > > >> dangling > > > > >> > > > >> > >> > > > > > > > > > > >> > > > >> > >> > > > > > > transactions if records are added > without > > > > >> > registered > > > > >> > > > >> > >> partition. > > > > >> > > > >> > >> > -- > > > > >> > > > >> > >> > > > > Maybe > > > > >> > > > >> > >> > > > > > > > > > > >> > > > >> > >> > > > > > > you can add a few more details to the > KIP > > > about > > > > >> > this > > > > >> > > > >> > scenario > > > > >> > > > >> > >> for > > > > >> > > > >> > >> > > > > better > > > > >> > > > >> > >> > > > > > > > > > > >> > > > >> > >> > > > > > > documentation purpose? > > > > >> > > > >> > >> > > > > > > > > > > >> > > > >> > >> > > > > > > > > > > >> > > > >> > >> > > > > > > I'm not sure I understand what you mean > > > here. > > > > >> The > > > > >> > > > >> motivation > > > > >> > > > >> > >> > > section > > > > >> > > > >> > >> > > > > > > describes two scenarios about how the > record > > > > >> can be > > > > >> > > > added > > > > >> > > > >> > >> > without a > > > > >> > > > >> > >> > > > > > > registered partition: > > > > >> > > > >> > >> > > > > > > > > > > >> > > > >> > >> > > > > > > > > > > >> > > > >> > >> > > > > > > > This can happen when a message gets > stuck > > > or > > > > >> > > delayed > > > > >> > > > >> due > > > > >> > > > >> > to > > > > >> > > > >> > >> > > > > networking > > > > >> > > > >> > >> > > > > > > issues or a network partition, the > > > transaction > > > > >> > > aborts, > > > > >> > > > >> and > > > > >> > > > >> > >> then > > > > >> > > > >> > >> > the > > > > >> > > > >> > >> > > > > > delayed > > > > >> > > > >> > >> > > > > > > message finally comes in. > > > > >> > > > >> > >> > > > > > > > > > > >> > > > >> > >> > > > > > > > > > > >> > > > >> > >> > > > > > > > Another way hanging transactions can > > > occur is > > > > >> > that > > > > >> > > a > > > > >> > > > >> > client > > > > >> > > > >> > >> is > > > > >> > > > >> > >> > > > buggy > > > > >> > > > >> > >> > > > > > and > > > > >> > > > >> > >> > > > > > > may somehow try to write to a partition > > > before > > > > >> it > > > > >> > > adds > > > > >> > > > >> the > > > > >> > > > >> > >> > > partition > > > > >> > > > >> > >> > > > to > > > > >> > > > >> > >> > > > > > the > > > > >> > > > >> > >> > > > > > > transaction. > > > > >> > > > >> > >> > > > > > > > > > > >> > > > >> > >> > > > > > > > > > > >> > > > >> > >> > > > > > > > > > > >> > > > >> > >> > > > > > > For the first example of this would it > be > > > > >> helpful > > > > >> > to > > > > >> > > > say > > > > >> > > > >> > that > > > > >> > > > >> > >> > this > > > > >> > > > >> > >> > > > > > message > > > > >> > > > >> > >> > > > > > > comes in after the abort, but before the > > > > >> partition > > > > >> > is > > > > >> > > > >> added > > > > >> > > > >> > to > > > > >> > > > >> > >> > the > > > > >> > > > >> > >> > > > next > > > > >> > > > >> > >> > > > > > > transaction so it becomes "hanging." > > > Perhaps the > > > > >> > next > > > > >> > > > >> > sentence > > > > >> > > > >> > >> > > > > describing > > > > >> > > > >> > >> > > > > > > the message becoming part of the next > > > > >> transaction > > > > >> > (a > > > > >> > > > >> > different > > > > >> > > > >> > >> > > case) > > > > >> > > > >> > >> > > > > was > > > > >> > > > >> > >> > > > > > > not properly differentiated. > > > > >> > > > >> > >> > > > > > > > > > > >> > > > >> > >> > > > > > > > > > > >> > > > >> > >> > > > > > > > > > > >> > > > >> > >> > > > > > > Jun — thanks for reading the KIP. > > > > >> > > > >> > >> > > > > > > > > > > >> > > > >> > >> > > > > > > 70. The int typing was a concern. > Currently > > > we > > > > >> > have a > > > > >> > > > >> > >> mechanism > > > > >> > > > >> > >> > in > > > > >> > > > >> > >> > > > > place > > > > >> > > > >> > >> > > > > > to > > > > >> > > > >> > >> > > > > > > fence the final epoch when the epoch is > > > about to > > > > >> > > > overflow > > > > >> > > > >> > and > > > > >> > > > >> > >> > > assign > > > > >> > > > >> > >> > > > a > > > > >> > > > >> > >> > > > > > new > > > > >> > > > >> > >> > > > > > > producer ID with epoch 0. Of course, > this > > > is a > > > > >> bit > > > > >> > > > tricky > > > > >> > > > >> > >> when it > > > > >> > > > >> > >> > > > comes > > > > >> > > > >> > >> > > > > > to > > > > >> > > > >> > >> > > > > > > the response back to the client. > > > > >> > > > >> > >> > > > > > > Making this a long could be another > option, > > > but > > > > >> I > > > > >> > > > wonder > > > > >> > > > >> are > > > > >> > > > >> > >> > there > > > > >> > > > >> > >> > > > any > > > > >> > > > >> > >> > > > > > > implications on changing this field if > the > > > > >> epoch is > > > > >> > > > >> > persisted > > > > >> > > > >> > >> to > > > > >> > > > >> > >> > > > disk? > > > > >> > > > >> > >> > > > > > I'd > > > > >> > > > >> > >> > > > > > > need to check the usages. > > > > >> > > > >> > >> > > > > > > > > > > >> > > > >> > >> > > > > > > 71.This was something Matthias asked > about > > > as > > > > >> > well. I > > > > >> > > > was > > > > >> > > > >> > >> > > > considering a > > > > >> > > > >> > >> > > > > > > possible edge case where a produce > request > > > from > > > > >> a > > > > >> > new > > > > >> > > > >> > >> transaction > > > > >> > > > >> > >> > > > > somehow > > > > >> > > > >> > >> > > > > > > gets sent right after the marker is > > > written, but > > > > >> > > before > > > > >> > > > >> the > > > > >> > > > >> > >> > > producer > > > > >> > > > >> > >> > > > is > > > > >> > > > >> > >> > > > > > > alerted of the newly bumped epoch. In > this > > > > >> case, we > > > > >> > > may > > > > >> > > > >> > >> include > > > > >> > > > >> > >> > > this > > > > >> > > > >> > >> > > > > > record > > > > >> > > > >> > >> > > > > > > when we don't want to. I suppose we > could > > > try > > > > >> to do > > > > >> > > > >> > something > > > > >> > > > >> > >> > > client > > > > >> > > > >> > >> > > > > side > > > > >> > > > >> > >> > > > > > > to bump the epoch after sending an > endTxn as > > > > >> well > > > > >> > in > > > > >> > > > this > > > > >> > > > >> > >> > scenario > > > > >> > > > >> > >> > > — > > > > >> > > > >> > >> > > > > but > > > > >> > > > >> > >> > > > > > I > > > > >> > > > >> > >> > > > > > > wonder how it would work when the > server is > > > > >> > aborting > > > > >> > > > >> based > > > > >> > > > >> > on > > > > >> > > > >> > >> a > > > > >> > > > >> > >> > > > > > server-side > > > > >> > > > >> > >> > > > > > > error. I could also be missing > something and > > > > >> this > > > > >> > > > >> scenario > > > > >> > > > >> > is > > > > >> > > > >> > >> > > > actually > > > > >> > > > >> > >> > > > > > not > > > > >> > > > >> > >> > > > > > > possible. > > > > >> > > > >> > >> > > > > > > > > > > >> > > > >> > >> > > > > > > Thanks again to everyone reading and > > > commenting. > > > > >> > Let > > > > >> > > me > > > > >> > > > >> know > > > > >> > > > >> > >> > about > > > > >> > > > >> > >> > > > any > > > > >> > > > >> > >> > > > > > > further questions or comments. > > > > >> > > > >> > >> > > > > > > > > > > >> > > > >> > >> > > > > > > Justine > > > > >> > > > >> > >> > > > > > > > > > > >> > > > >> > >> > > > > > > On Wed, Dec 14, 2022 at 9:41 AM Jun Rao > > > > >> > > > >> > >> <j...@confluent.io.invalid > > > > >> > > > >> > >> > > > > > > >> > > > >> > >> > > > > > wrote: > > > > >> > > > >> > >> > > > > > > > > > > >> > > > >> > >> > > > > > > > Hi, Justine, > > > > >> > > > >> > >> > > > > > > > > > > > >> > > > >> > >> > > > > > > > Thanks for the KIP. A couple of > comments. > > > > >> > > > >> > >> > > > > > > > > > > > >> > > > >> > >> > > > > > > > 70. Currently, the producer epoch is > an > > > int. > > > > >> I am > > > > >> > > not > > > > >> > > > >> sure > > > > >> > > > >> > >> if > > > > >> > > > >> > >> > > it's > > > > >> > > > >> > >> > > > > > enough > > > > >> > > > >> > >> > > > > > > > to accommodate all transactions in the > > > > >> lifetime > > > > >> > of > > > > >> > > a > > > > >> > > > >> > >> producer. > > > > >> > > > >> > >> > > > Should > > > > >> > > > >> > >> > > > > > we > > > > >> > > > >> > >> > > > > > > > change that to a long or add a new > long > > > field > > > > >> > like > > > > >> > > > >> txnId? > > > > >> > > > >> > >> > > > > > > > > > > > >> > > > >> > >> > > > > > > > 71. "it will write the prepare commit > > > message > > > > >> > with > > > > >> > > a > > > > >> > > > >> > bumped > > > > >> > > > >> > >> > epoch > > > > >> > > > >> > >> > > > and > > > > >> > > > >> > >> > > > > > > send > > > > >> > > > >> > >> > > > > > > > WriteTxnMarkerRequests with the bumped > > > epoch." > > > > >> > Hmm, > > > > >> > > > the > > > > >> > > > >> > >> epoch > > > > >> > > > >> > >> > is > > > > >> > > > >> > >> > > > > > > associated > > > > >> > > > >> > >> > > > > > > > with the current txn right? So, it > seems > > > > >> weird to > > > > >> > > > >> write a > > > > >> > > > >> > >> > commit > > > > >> > > > >> > >> > > > > > message > > > > >> > > > >> > >> > > > > > > > with a bumped epoch. Should we only > bump > > > up > > > > >> the > > > > >> > > epoch > > > > >> > > > >> in > > > > >> > > > >> > >> > > > > EndTxnResponse > > > > >> > > > >> > >> > > > > > > and > > > > >> > > > >> > >> > > > > > > > rename the field to sth like > > > > >> nextProducerEpoch? > > > > >> > > > >> > >> > > > > > > > > > > > >> > > > >> > >> > > > > > > > Thanks, > > > > >> > > > >> > >> > > > > > > > > > > > >> > > > >> > >> > > > > > > > Jun > > > > >> > > > >> > >> > > > > > > > > > > > >> > > > >> > >> > > > > > > > > > > > >> > > > >> > >> > > > > > > > > > > > >> > > > >> > >> > > > > > > > On Mon, Dec 12, 2022 at 8:54 PM > Matthias > > > J. > > > > >> Sax < > > > > >> > > > >> > >> > > mj...@apache.org> > > > > >> > > > >> > >> > > > > > > wrote: > > > > >> > > > >> > >> > > > > > > > > > > > >> > > > >> > >> > > > > > > > > Thanks for the background. > > > > >> > > > >> > >> > > > > > > > > > > > > >> > > > >> > >> > > > > > > > > 20/30: SGTM. My proposal was only > > > focusing > > > > >> to > > > > >> > > avoid > > > > >> > > > >> > >> dangling > > > > >> > > > >> > >> > > > > > > > > transactions if records are added > > > without > > > > >> > > > registered > > > > >> > > > >> > >> > partition. > > > > >> > > > >> > >> > > > -- > > > > >> > > > >> > >> > > > > > > Maybe > > > > >> > > > >> > >> > > > > > > > > you can add a few more details to > the > > > KIP > > > > >> about > > > > >> > > > this > > > > >> > > > >> > >> scenario > > > > >> > > > >> > >> > > for > > > > >> > > > >> > >> > > > > > > better > > > > >> > > > >> > >> > > > > > > > > documentation purpose? > > > > >> > > > >> > >> > > > > > > > > > > > > >> > > > >> > >> > > > > > > > > 40: I think you hit a fair point > about > > > race > > > > >> > > > >> conditions > > > > >> > > > >> > or > > > > >> > > > >> > >> > > client > > > > >> > > > >> > >> > > > > bugs > > > > >> > > > >> > >> > > > > > > > > (incorrectly not bumping the > epoch). The > > > > >> > > > >> > >> complexity/confusion > > > > >> > > > >> > >> > > for > > > > >> > > > >> > >> > > > > > using > > > > >> > > > >> > >> > > > > > > > > the bumped epoch I see, is mainly > for > > > > >> internal > > > > >> > > > >> > debugging, > > > > >> > > > >> > >> ie, > > > > >> > > > >> > >> > > > > > > inspecting > > > > >> > > > >> > >> > > > > > > > > log segment dumps -- it seems > harder to > > > > >> reason > > > > >> > > > about > > > > >> > > > >> the > > > > >> > > > >> > >> > system > > > > >> > > > >> > >> > > > for > > > > >> > > > >> > >> > > > > > us > > > > >> > > > >> > >> > > > > > > > > humans. But if we get better > > > guarantees, it > > > > >> > would > > > > >> > > > be > > > > >> > > > >> > >> worth to > > > > >> > > > >> > >> > > use > > > > >> > > > >> > >> > > > > the > > > > >> > > > >> > >> > > > > > > > > bumped epoch. > > > > >> > > > >> > >> > > > > > > > > > > > > >> > > > >> > >> > > > > > > > > 60: as I mentioned already, I don't > > > know the > > > > >> > > broker > > > > >> > > > >> > >> internals > > > > >> > > > >> > >> > > to > > > > >> > > > >> > >> > > > > > > provide > > > > >> > > > >> > >> > > > > > > > > more input. So if nobody else chimes > > > in, we > > > > >> > > should > > > > >> > > > >> just > > > > >> > > > >> > >> move > > > > >> > > > >> > >> > > > > forward > > > > >> > > > >> > >> > > > > > > > > with your proposal. > > > > >> > > > >> > >> > > > > > > > > > > > > >> > > > >> > >> > > > > > > > > > > > > >> > > > >> > >> > > > > > > > > -Matthias > > > > >> > > > >> > >> > > > > > > > > > > > > >> > > > >> > >> > > > > > > > > > > > > >> > > > >> > >> > > > > > > > > On 12/6/22 4:22 PM, Justine Olshan > > > wrote: > > > > >> > > > >> > >> > > > > > > > > > Hi all, > > > > >> > > > >> > >> > > > > > > > > > After Artem's questions about > error > > > > >> behavior, > > > > >> > > > I've > > > > >> > > > >> > >> > > re-evaluated > > > > >> > > > >> > >> > > > > the > > > > >> > > > >> > >> > > > > > > > > > unknown producer ID exception and > had > > > some > > > > >> > > > >> discussions > > > > >> > > > >> > >> > > offline. > > > > >> > > > >> > >> > > > > > > > > > > > > > >> > > > >> > >> > > > > > > > > > I think generally it makes sense > to > > > > >> simplify > > > > >> > > > error > > > > >> > > > >> > >> handling > > > > >> > > > >> > >> > > in > > > > >> > > > >> > >> > > > > > cases > > > > >> > > > >> > >> > > > > > > > like > > > > >> > > > >> > >> > > > > > > > > > this and the UNKNOWN_PRODUCER_ID > error > > > > >> has a > > > > >> > > > pretty > > > > >> > > > >> > long > > > > >> > > > >> > >> > and > > > > >> > > > >> > >> > > > > > > > complicated > > > > >> > > > >> > >> > > > > > > > > > history. Because of this, I > propose > > > > >> adding a > > > > >> > > new > > > > >> > > > >> error > > > > >> > > > >> > >> code > > > > >> > > > >> > >> > > > > > > > > ABORTABLE_ERROR > > > > >> > > > >> > >> > > > > > > > > > that when encountered by new > clients > > > > >> (gated > > > > >> > by > > > > >> > > > the > > > > >> > > > >> > >> produce > > > > >> > > > >> > >> > > > > request > > > > >> > > > >> > >> > > > > > > > > version) > > > > >> > > > >> > >> > > > > > > > > > will simply abort the transaction. > > > This > > > > >> > allows > > > > >> > > > the > > > > >> > > > >> > >> server > > > > >> > > > >> > >> > to > > > > >> > > > >> > >> > > > have > > > > >> > > > >> > >> > > > > > > some > > > > >> > > > >> > >> > > > > > > > > say > > > > >> > > > >> > >> > > > > > > > > > in whether the client aborts and > makes > > > > >> > handling > > > > >> > > > >> much > > > > >> > > > >> > >> > simpler. > > > > >> > > > >> > >> > > > In > > > > >> > > > >> > >> > > > > > the > > > > >> > > > >> > >> > > > > > > > > > future, we can also use this > error in > > > > >> other > > > > >> > > > >> situations > > > > >> > > > >> > >> > where > > > > >> > > > >> > >> > > we > > > > >> > > > >> > >> > > > > > want > > > > >> > > > >> > >> > > > > > > to > > > > >> > > > >> > >> > > > > > > > > > abort the transactions. We can > even > > > use on > > > > >> > > other > > > > >> > > > >> apis. > > > > >> > > > >> > >> > > > > > > > > > > > > > >> > > > >> > >> > > > > > > > > > I've added this to the KIP. Let me > > > know if > > > > >> > > there > > > > >> > > > >> are > > > > >> > > > >> > any > > > > >> > > > >> > >> > > > > questions > > > > >> > > > >> > >> > > > > > or > > > > >> > > > >> > >> > > > > > > > > > issues. > > > > >> > > > >> > >> > > > > > > > > > > > > > >> > > > >> > >> > > > > > > > > > Justine > > > > >> > > > >> > >> > > > > > > > > > > > > > >> > > > >> > >> > > > > > > > > > On Fri, Dec 2, 2022 at 10:22 AM > > > Justine > > > > >> > Olshan > > > > >> > > < > > > > >> > > > >> > >> > > > > > jols...@confluent.io > > > > >> > > > >> > >> > > > > > > > > > > > >> > > > >> > >> > > > > > > > > wrote: > > > > >> > > > >> > >> > > > > > > > > > > > > > >> > > > >> > >> > > > > > > > > >> Hey Matthias, > > > > >> > > > >> > >> > > > > > > > > >> > > > > >> > > > >> > >> > > > > > > > > >> > > > > >> > > > >> > >> > > > > > > > > >> 20/30 — Maybe I also didn't > express > > > > >> myself > > > > >> > > > >> clearly. > > > > >> > > > >> > For > > > > >> > > > >> > >> > > older > > > > >> > > > >> > >> > > > > > > clients > > > > >> > > > >> > >> > > > > > > > we > > > > >> > > > >> > >> > > > > > > > > >> don't have a way to distinguish > > > between a > > > > >> > > > previous > > > > >> > > > >> > and > > > > >> > > > >> > >> the > > > > >> > > > >> > >> > > > > current > > > > >> > > > >> > >> > > > > > > > > >> transaction since we don't have > the > > > epoch > > > > >> > > bump. > > > > >> > > > >> This > > > > >> > > > >> > >> means > > > > >> > > > >> > >> > > > that > > > > >> > > > >> > >> > > > > a > > > > >> > > > >> > >> > > > > > > late > > > > >> > > > >> > >> > > > > > > > > >> message from the previous > transaction > > > > >> may be > > > > >> > > > >> added to > > > > >> > > > >> > >> the > > > > >> > > > >> > >> > > new > > > > >> > > > >> > >> > > > > one. > > > > >> > > > >> > >> > > > > > > > With > > > > >> > > > >> > >> > > > > > > > > >> older clients — we can't > guarantee > > > this > > > > >> > won't > > > > >> > > > >> happen > > > > >> > > > >> > >> if we > > > > >> > > > >> > >> > > > > already > > > > >> > > > >> > >> > > > > > > > sent > > > > >> > > > >> > >> > > > > > > > > the > > > > >> > > > >> > >> > > > > > > > > >> addPartitionsToTxn call (why we > make > > > > >> changes > > > > >> > > for > > > > >> > > > >> the > > > > >> > > > >> > >> newer > > > > >> > > > >> > >> > > > > client) > > > > >> > > > >> > >> > > > > > > but > > > > >> > > > >> > >> > > > > > > > > we > > > > >> > > > >> > >> > > > > > > > > >> can at least gate some by > ensuring > > > that > > > > >> the > > > > >> > > > >> partition > > > > >> > > > >> > >> has > > > > >> > > > >> > >> > > been > > > > >> > > > >> > >> > > > > > added > > > > >> > > > >> > >> > > > > > > > to > > > > >> > > > >> > >> > > > > > > > > the > > > > >> > > > >> > >> > > > > > > > > >> transaction. The rationale here > is > > > that > > > > >> > there > > > > >> > > > are > > > > >> > > > >> > >> likely > > > > >> > > > >> > >> > > LESS > > > > >> > > > >> > >> > > > > late > > > > >> > > > >> > >> > > > > > > > > arrivals > > > > >> > > > >> > >> > > > > > > > > >> as time goes on, so hopefully > most > > > late > > > > >> > > arrivals > > > > >> > > > >> will > > > > >> > > > >> > >> come > > > > >> > > > >> > >> > > in > > > > >> > > > >> > >> > > > > > BEFORE > > > > >> > > > >> > >> > > > > > > > the > > > > >> > > > >> > >> > > > > > > > > >> addPartitionsToTxn call. Those > that > > > > >> arrive > > > > >> > > > before > > > > >> > > > >> > will > > > > >> > > > >> > >> be > > > > >> > > > >> > >> > > > > properly > > > > >> > > > >> > >> > > > > > > > gated > > > > >> > > > >> > >> > > > > > > > > >> with the describeTransactions > > > approach. > > > > >> > > > >> > >> > > > > > > > > >> > > > > >> > > > >> > >> > > > > > > > > >> If we take the approach you > > > suggested, > > > > >> ANY > > > > >> > > late > > > > >> > > > >> > arrival > > > > >> > > > >> > >> > > from a > > > > >> > > > >> > >> > > > > > > > previous > > > > >> > > > >> > >> > > > > > > > > >> transaction will be added. And we > > > don't > > > > >> want > > > > >> > > > >> that. I > > > > >> > > > >> > >> also > > > > >> > > > >> > >> > > > don't > > > > >> > > > >> > >> > > > > > see > > > > >> > > > >> > >> > > > > > > > any > > > > >> > > > >> > >> > > > > > > > > >> benefit in sending > addPartitionsToTxn > > > > >> over > > > > >> > the > > > > >> > > > >> > >> > describeTxns > > > > >> > > > >> > >> > > > > call. > > > > >> > > > >> > >> > > > > > > They > > > > >> > > > >> > >> > > > > > > > > will > > > > >> > > > >> > >> > > > > > > > > >> both be one extra RPC to the Txn > > > > >> > coordinator. > > > > >> > > > >> > >> > > > > > > > > >> > > > > >> > > > >> > >> > > > > > > > > >> > > > > >> > > > >> > >> > > > > > > > > >> To be clear — newer clients will > use > > > > >> > > > >> > addPartitionsToTxn > > > > >> > > > >> > >> > > > instead > > > > >> > > > >> > >> > > > > of > > > > >> > > > >> > >> > > > > > > the > > > > >> > > > >> > >> > > > > > > > > >> DescribeTxns. > > > > >> > > > >> > >> > > > > > > > > >> > > > > >> > > > >> > >> > > > > > > > > >> > > > > >> > > > >> > >> > > > > > > > > >> 40) > > > > >> > > > >> > >> > > > > > > > > >> My concern is that if we have > some > > > delay > > > > >> in > > > > >> > > the > > > > >> > > > >> > client > > > > >> > > > >> > >> to > > > > >> > > > >> > >> > > bump > > > > >> > > > >> > >> > > > > the > > > > >> > > > >> > >> > > > > > > > > epoch, > > > > >> > > > >> > >> > > > > > > > > >> it could continue to send epoch > 73 > > > and > > > > >> those > > > > >> > > > >> records > > > > >> > > > >> > >> would > > > > >> > > > >> > >> > > not > > > > >> > > > >> > >> > > > > be > > > > >> > > > >> > >> > > > > > > > > fenced. > > > > >> > > > >> > >> > > > > > > > > >> Perhaps this is not an issue if > we > > > don't > > > > >> > allow > > > > >> > > > the > > > > >> > > > >> > next > > > > >> > > > >> > >> > > > produce > > > > >> > > > >> > >> > > > > to > > > > >> > > > >> > >> > > > > > > go > > > > >> > > > >> > >> > > > > > > > > >> through before the EndTxn request > > > > >> returns. > > > > >> > I'm > > > > >> > > > >> also > > > > >> > > > >> > >> > thinking > > > > >> > > > >> > >> > > > > about > > > > >> > > > >> > >> > > > > > > > > cases of > > > > >> > > > >> > >> > > > > > > > > >> failure. I will need to think on > > > this a > > > > >> bit. > > > > >> > > > >> > >> > > > > > > > > >> > > > > >> > > > >> > >> > > > > > > > > >> I wasn't sure if it was that > > > confusing. > > > > >> But > > > > >> > if > > > > >> > > > we > > > > >> > > > >> > >> think it > > > > >> > > > >> > >> > > is, > > > > >> > > > >> > >> > > > > we > > > > >> > > > >> > >> > > > > > > can > > > > >> > > > >> > >> > > > > > > > > >> investigate other ways. > > > > >> > > > >> > >> > > > > > > > > >> > > > > >> > > > >> > >> > > > > > > > > >> > > > > >> > > > >> > >> > > > > > > > > >> 60) > > > > >> > > > >> > >> > > > > > > > > >> > > > > >> > > > >> > >> > > > > > > > > >> I'm not sure these are the same > > > > >> purgatories > > > > >> > > > since > > > > >> > > > >> one > > > > >> > > > >> > >> is a > > > > >> > > > >> > >> > > > > produce > > > > >> > > > >> > >> > > > > > > > > >> purgatory (I was planning on > using a > > > > >> > callback > > > > >> > > > >> rather > > > > >> > > > >> > >> than > > > > >> > > > >> > >> > > > > > purgatory) > > > > >> > > > >> > >> > > > > > > > and > > > > >> > > > >> > >> > > > > > > > > >> the other is simply a request to > > > append > > > > >> to > > > > >> > the > > > > >> > > > >> log. > > > > >> > > > >> > Not > > > > >> > > > >> > >> > sure > > > > >> > > > >> > >> > > > we > > > > >> > > > >> > >> > > > > > have > > > > >> > > > >> > >> > > > > > > > any > > > > >> > > > >> > >> > > > > > > > > >> structure here for ordering, but > my > > > > >> > > > understanding > > > > >> > > > >> is > > > > >> > > > >> > >> that > > > > >> > > > >> > >> > > the > > > > >> > > > >> > >> > > > > > broker > > > > >> > > > >> > >> > > > > > > > > could > > > > >> > > > >> > >> > > > > > > > > >> handle the write request before > it > > > hears > > > > >> > back > > > > >> > > > from > > > > >> > > > >> > the > > > > >> > > > >> > >> Txn > > > > >> > > > >> > >> > > > > > > > Coordinator. > > > > >> > > > >> > >> > > > > > > > > >> > > > > >> > > > >> > >> > > > > > > > > >> Let me know if I misunderstood > > > something > > > > >> or > > > > >> > > > >> something > > > > >> > > > >> > >> was > > > > >> > > > >> > >> > > > > unclear. > > > > >> > > > >> > >> > > > > > > > > >> > > > > >> > > > >> > >> > > > > > > > > >> Justine > > > > >> > > > >> > >> > > > > > > > > >> > > > > >> > > > >> > >> > > > > > > > > >> On Thu, Dec 1, 2022 at 12:15 PM > > > Matthias > > > > >> J. > > > > >> > > Sax > > > > >> > > > < > > > > >> > > > >> > >> > > > > mj...@apache.org > > > > >> > > > >> > >> > > > > > > > > > > >> > > > >> > >> > > > > > > > > wrote: > > > > >> > > > >> > >> > > > > > > > > >> > > > > >> > > > >> > >> > > > > > > > > >>> Thanks for the details Justine! > > > > >> > > > >> > >> > > > > > > > > >>> > > > > >> > > > >> > >> > > > > > > > > >>>> 20) > > > > >> > > > >> > >> > > > > > > > > >>>> > > > > >> > > > >> > >> > > > > > > > > >>>> The client side change for 2 is > > > > >> removing > > > > >> > the > > > > >> > > > >> > >> > addPartitions > > > > >> > > > >> > >> > > > to > > > > >> > > > >> > >> > > > > > > > > >>> transaction > > > > >> > > > >> > >> > > > > > > > > >>>> call. We don't need to make > this > > > from > > > > >> the > > > > >> > > > >> producer > > > > >> > > > >> > to > > > > >> > > > >> > >> > the > > > > >> > > > >> > >> > > > txn > > > > >> > > > >> > >> > > > > > > > > >>> coordinator, > > > > >> > > > >> > >> > > > > > > > > >>>> only server side. > > > > >> > > > >> > >> > > > > > > > > >>> > > > > >> > > > >> > >> > > > > > > > > >>> I think I did not express myself > > > > >> clearly. I > > > > >> > > > >> > understand > > > > >> > > > >> > >> > that > > > > >> > > > >> > >> > > > we > > > > >> > > > >> > >> > > > > > can > > > > >> > > > >> > >> > > > > > > > (and > > > > >> > > > >> > >> > > > > > > > > >>> should) change the producer to > not > > > send > > > > >> the > > > > >> > > > >> > >> > `addPartitions` > > > > >> > > > >> > >> > > > > > request > > > > >> > > > >> > >> > > > > > > > any > > > > >> > > > >> > >> > > > > > > > > >>> longer. But I don't thinks it's > > > > >> requirement > > > > >> > > to > > > > >> > > > >> > change > > > > >> > > > >> > >> the > > > > >> > > > >> > >> > > > > broker? > > > > >> > > > >> > >> > > > > > > > > >>> > > > > >> > > > >> > >> > > > > > > > > >>> What I am trying to say is: as a > > > > >> safe-guard > > > > >> > > and > > > > >> > > > >> > >> > improvement > > > > >> > > > >> > >> > > > for > > > > >> > > > >> > >> > > > > > > older > > > > >> > > > >> > >> > > > > > > > > >>> producers, the partition leader > can > > > just > > > > >> > send > > > > >> > > > the > > > > >> > > > >> > >> > > > > `addPartitions` > > > > >> > > > >> > >> > > > > > > > > >>> request to the TX-coordinator > in any > > > > >> case > > > > >> > -- > > > > >> > > if > > > > >> > > > >> the > > > > >> > > > >> > >> old > > > > >> > > > >> > >> > > > > producer > > > > >> > > > >> > >> > > > > > > > > >>> correctly did send the > > > `addPartition` > > > > >> > request > > > > >> > > > to > > > > >> > > > >> the > > > > >> > > > >> > >> > > > > > TX-coordinator > > > > >> > > > >> > >> > > > > > > > > >>> already, the TX-coordinator can > just > > > > >> > "ignore" > > > > >> > > > is > > > > >> > > > >> as > > > > >> > > > >> > >> > > > idempotent. > > > > >> > > > >> > >> > > > > > > > > However, > > > > >> > > > >> > >> > > > > > > > > >>> if the old producer has a bug > and > > > did > > > > >> > forget > > > > >> > > to > > > > >> > > > >> sent > > > > >> > > > >> > >> the > > > > >> > > > >> > >> > > > > > > > `addPartition` > > > > >> > > > >> > >> > > > > > > > > >>> request, we would now ensure > that > > > the > > > > >> > > partition > > > > >> > > > >> is > > > > >> > > > >> > >> indeed > > > > >> > > > >> > >> > > > added > > > > >> > > > >> > >> > > > > > to > > > > >> > > > >> > >> > > > > > > > the > > > > >> > > > >> > >> > > > > > > > > >>> TX and thus fix a potential > > > producer bug > > > > >> > > (even > > > > >> > > > >> if we > > > > >> > > > >> > >> > don't > > > > >> > > > >> > >> > > > get > > > > >> > > > >> > >> > > > > > the > > > > >> > > > >> > >> > > > > > > > > >>> fencing via the bump epoch). -- > It > > > > >> seems to > > > > >> > > be > > > > >> > > > a > > > > >> > > > >> > good > > > > >> > > > >> > >> > > > > > improvement? > > > > >> > > > >> > >> > > > > > > Or > > > > >> > > > >> > >> > > > > > > > > is > > > > >> > > > >> > >> > > > > > > > > >>> there a reason to not do this? > > > > >> > > > >> > >> > > > > > > > > >>> > > > > >> > > > >> > >> > > > > > > > > >>> > > > > >> > > > >> > >> > > > > > > > > >>> > > > > >> > > > >> > >> > > > > > > > > >>>> 30) > > > > >> > > > >> > >> > > > > > > > > >>>> > > > > >> > > > >> > >> > > > > > > > > >>>> Transaction is ongoing = > partition > > > was > > > > >> > added > > > > >> > > > to > > > > >> > > > >> > >> > > transaction > > > > >> > > > >> > >> > > > > via > > > > >> > > > >> > >> > > > > > > > > >>>> addPartitionsToTxn. We check > this > > > with > > > > >> the > > > > >> > > > >> > >> > > > > DescribeTransactions > > > > >> > > > >> > >> > > > > > > > call. > > > > >> > > > >> > >> > > > > > > > > >>> Let > > > > >> > > > >> > >> > > > > > > > > >>>> me know if this wasn't > sufficiently > > > > >> > > explained > > > > >> > > > >> here: > > > > >> > > > >> > >> > > > > > > > > >>> > > > > >> > > > >> > >> > > > > > > > > >>> If we do what I propose in > (20), we > > > > >> don't > > > > >> > > > really > > > > >> > > > >> > need > > > > >> > > > >> > >> to > > > > >> > > > >> > >> > > make > > > > >> > > > >> > >> > > > > > this > > > > >> > > > >> > >> > > > > > > > > >>> `DescribeTransaction` call, as > the > > > > >> > partition > > > > >> > > > >> leader > > > > >> > > > >> > >> adds > > > > >> > > > >> > >> > > the > > > > >> > > > >> > >> > > > > > > > partition > > > > >> > > > >> > >> > > > > > > > > >>> for older clients and we get > this > > > check > > > > >> for > > > > >> > > > free. > > > > >> > > > >> > >> > > > > > > > > >>> > > > > >> > > > >> > >> > > > > > > > > >>> > > > > >> > > > >> > >> > > > > > > > > >>>> 40) > > > > >> > > > >> > >> > > > > > > > > >>>> > > > > >> > > > >> > >> > > > > > > > > >>>> The idea here is that if any > > > messages > > > > >> > > somehow > > > > >> > > > >> come > > > > >> > > > >> > in > > > > >> > > > >> > >> > > before > > > > >> > > > >> > >> > > > > we > > > > >> > > > >> > >> > > > > > > get > > > > >> > > > >> > >> > > > > > > > > the > > > > >> > > > >> > >> > > > > > > > > >>> new > > > > >> > > > >> > >> > > > > > > > > >>>> epoch to the producer, they > will be > > > > >> > fenced. > > > > >> > > > >> > However, > > > > >> > > > >> > >> if > > > > >> > > > >> > >> > we > > > > >> > > > >> > >> > > > > don't > > > > >> > > > >> > >> > > > > > > > think > > > > >> > > > >> > >> > > > > > > > > >>> this > > > > >> > > > >> > >> > > > > > > > > >>>> is necessary, it can be > discussed > > > > >> > > > >> > >> > > > > > > > > >>> > > > > >> > > > >> > >> > > > > > > > > >>> I agree that we should have > epoch > > > > >> fencing. > > > > >> > My > > > > >> > > > >> > >> question is > > > > >> > > > >> > >> > > > > > > different: > > > > >> > > > >> > >> > > > > > > > > >>> Assume we are at epoch 73, and > we > > > have > > > > >> an > > > > >> > > > ongoing > > > > >> > > > >> > >> > > > transaction, > > > > >> > > > >> > >> > > > > > that > > > > >> > > > >> > >> > > > > > > > is > > > > >> > > > >> > >> > > > > > > > > >>> committed. It seems natural to > > > write the > > > > >> > > > "prepare > > > > >> > > > >> > >> commit" > > > > >> > > > >> > >> > > > > marker > > > > >> > > > >> > >> > > > > > > and > > > > >> > > > >> > >> > > > > > > > > the > > > > >> > > > >> > >> > > > > > > > > >>> `WriteTxMarkerRequest` both with > > > epoch > > > > >> 73, > > > > >> > > too, > > > > >> > > > >> as > > > > >> > > > >> > it > > > > >> > > > >> > >> > > belongs > > > > >> > > > >> > >> > > > > to > > > > >> > > > >> > >> > > > > > > the > > > > >> > > > >> > >> > > > > > > > > >>> current transaction. Of course, > we > > > now > > > > >> also > > > > >> > > > bump > > > > >> > > > >> the > > > > >> > > > >> > >> > epoch > > > > >> > > > >> > >> > > > and > > > > >> > > > >> > >> > > > > > > expect > > > > >> > > > >> > >> > > > > > > > > >>> the next requests to have epoch > 74, > > > and > > > > >> > would > > > > >> > > > >> reject > > > > >> > > > >> > >> an > > > > >> > > > >> > >> > > > request > > > > >> > > > >> > >> > > > > > > with > > > > >> > > > >> > >> > > > > > > > > >>> epoch 73, as the corresponding > TX > > > for > > > > >> epoch > > > > >> > > 73 > > > > >> > > > >> was > > > > >> > > > >> > >> > already > > > > >> > > > >> > >> > > > > > > committed. > > > > >> > > > >> > >> > > > > > > > > >>> > > > > >> > > > >> > >> > > > > > > > > >>> It seems you propose to write > the > > > > >> "prepare > > > > >> > > > commit > > > > >> > > > >> > >> marker" > > > > >> > > > >> > >> > > and > > > > >> > > > >> > >> > > > > > > > > >>> `WriteTxMarkerRequest` with > epoch 74 > > > > >> > though, > > > > >> > > > what > > > > >> > > > >> > >> would > > > > >> > > > >> > >> > > work, > > > > >> > > > >> > >> > > > > but > > > > >> > > > >> > >> > > > > > > it > > > > >> > > > >> > >> > > > > > > > > >>> seems confusing. Is there a > reason > > > why > > > > >> we > > > > >> > > would > > > > >> > > > >> use > > > > >> > > > >> > >> the > > > > >> > > > >> > >> > > > bumped > > > > >> > > > >> > >> > > > > > > epoch > > > > >> > > > >> > >> > > > > > > > 74 > > > > >> > > > >> > >> > > > > > > > > >>> instead of the current epoch 73? > > > > >> > > > >> > >> > > > > > > > > >>> > > > > >> > > > >> > >> > > > > > > > > >>> > > > > >> > > > >> > >> > > > > > > > > >>>> 60) > > > > >> > > > >> > >> > > > > > > > > >>>> > > > > >> > > > >> > >> > > > > > > > > >>>> When we are checking if the > > > > >> transaction is > > > > >> > > > >> ongoing, > > > > >> > > > >> > >> we > > > > >> > > > >> > >> > > need > > > > >> > > > >> > >> > > > to > > > > >> > > > >> > >> > > > > > > make > > > > >> > > > >> > >> > > > > > > > a > > > > >> > > > >> > >> > > > > > > > > >>> round > > > > >> > > > >> > >> > > > > > > > > >>>> trip from the leader partition > to > > > the > > > > >> > > > >> transaction > > > > >> > > > >> > >> > > > coordinator. > > > > >> > > > >> > >> > > > > > In > > > > >> > > > >> > >> > > > > > > > the > > > > >> > > > >> > >> > > > > > > > > >>> time > > > > >> > > > >> > >> > > > > > > > > >>>> we are waiting for this > message to > > > come > > > > >> > > back, > > > > >> > > > in > > > > >> > > > >> > >> theory > > > > >> > > > >> > >> > we > > > > >> > > > >> > >> > > > > could > > > > >> > > > >> > >> > > > > > > > have > > > > >> > > > >> > >> > > > > > > > > >>> sent > > > > >> > > > >> > >> > > > > > > > > >>>> a commit/abort call that would > > > make the > > > > >> > > > original > > > > >> > > > >> > >> result > > > > >> > > > >> > >> > of > > > > >> > > > >> > >> > > > the > > > > >> > > > >> > >> > > > > > > check > > > > >> > > > >> > >> > > > > > > > > >>> out of > > > > >> > > > >> > >> > > > > > > > > >>>> date. That is why we can check > the > > > > >> leader > > > > >> > > > state > > > > >> > > > >> > >> before > > > > >> > > > >> > >> > we > > > > >> > > > >> > >> > > > > write > > > > >> > > > >> > >> > > > > > to > > > > >> > > > >> > >> > > > > > > > the > > > > >> > > > >> > >> > > > > > > > > >>> log. > > > > >> > > > >> > >> > > > > > > > > >>> > > > > >> > > > >> > >> > > > > > > > > >>> Thanks. Got it. > > > > >> > > > >> > >> > > > > > > > > >>> > > > > >> > > > >> > >> > > > > > > > > >>> However, is this really an > issue? > > > We put > > > > >> > the > > > > >> > > > >> produce > > > > >> > > > >> > >> > > request > > > > >> > > > >> > >> > > > in > > > > >> > > > >> > >> > > > > > > > > >>> purgatory, so how could we > process > > > the > > > > >> > > > >> > >> > > > `WriteTxnMarkerRequest` > > > > >> > > > >> > >> > > > > > > first? > > > > >> > > > >> > >> > > > > > > > > >>> Don't we need to put the > > > > >> > > > `WriteTxnMarkerRequest` > > > > >> > > > >> > into > > > > >> > > > >> > >> > > > > purgatory, > > > > >> > > > >> > >> > > > > > > too, > > > > >> > > > >> > >> > > > > > > > > >>> for this case, and process both > > > request > > > > >> > > > in-order? > > > > >> > > > >> > >> (Again, > > > > >> > > > >> > >> > > my > > > > >> > > > >> > >> > > > > > broker > > > > >> > > > >> > >> > > > > > > > > >>> knowledge is limited and maybe > we > > > don't > > > > >> > > > maintain > > > > >> > > > >> > >> request > > > > >> > > > >> > >> > > > order > > > > >> > > > >> > >> > > > > > for > > > > >> > > > >> > >> > > > > > > > this > > > > >> > > > >> > >> > > > > > > > > >>> case, what seems to be an issue > > > IMHO, > > > > >> and I > > > > >> > > am > > > > >> > > > >> > >> wondering > > > > >> > > > >> > >> > if > > > > >> > > > >> > >> > > > > > > changing > > > > >> > > > >> > >> > > > > > > > > >>> request handling to preserve > order > > > for > > > > >> this > > > > >> > > > case > > > > >> > > > >> > >> might be > > > > >> > > > >> > >> > > the > > > > >> > > > >> > >> > > > > > > cleaner > > > > >> > > > >> > >> > > > > > > > > >>> solution?) > > > > >> > > > >> > >> > > > > > > > > >>> > > > > >> > > > >> > >> > > > > > > > > >>> > > > > >> > > > >> > >> > > > > > > > > >>> > > > > >> > > > >> > >> > > > > > > > > >>> -Matthias > > > > >> > > > >> > >> > > > > > > > > >>> > > > > >> > > > >> > >> > > > > > > > > >>> > > > > >> > > > >> > >> > > > > > > > > >>> > > > > >> > > > >> > >> > > > > > > > > >>> > > > > >> > > > >> > >> > > > > > > > > >>> On 11/30/22 3:28 PM, Artem > Livshits > > > > >> wrote: > > > > >> > > > >> > >> > > > > > > > > >>>> Hi Justine, > > > > >> > > > >> > >> > > > > > > > > >>>> > > > > >> > > > >> > >> > > > > > > > > >>>> I think the interesting part is > > > not in > > > > >> > this > > > > >> > > > >> logic > > > > >> > > > >> > >> > (because > > > > >> > > > >> > >> > > > it > > > > >> > > > >> > >> > > > > > > tries > > > > >> > > > >> > >> > > > > > > > to > > > > >> > > > >> > >> > > > > > > > > >>>> figure out when > > > UNKNOWN_PRODUCER_ID is > > > > >> > > > retriable > > > > >> > > > >> > and > > > > >> > > > >> > >> if > > > > >> > > > >> > >> > > it's > > > > >> > > > >> > >> > > > > > > > > retryable, > > > > >> > > > >> > >> > > > > > > > > >>>> it's definitely not fatal), but > > > what > > > > >> > happens > > > > >> > > > >> when > > > > >> > > > >> > >> this > > > > >> > > > >> > >> > > logic > > > > >> > > > >> > >> > > > > > > doesn't > > > > >> > > > >> > >> > > > > > > > > >>> return > > > > >> > > > >> > >> > > > > > > > > >>>> 'true' and falls through. In > the > > > old > > > > >> > > clients > > > > >> > > > it > > > > >> > > > >> > >> seems > > > > >> > > > >> > >> > to > > > > >> > > > >> > >> > > be > > > > >> > > > >> > >> > > > > > > fatal, > > > > >> > > > >> > >> > > > > > > > if > > > > >> > > > >> > >> > > > > > > > > >>> we > > > > >> > > > >> > >> > > > > > > > > >>>> keep the behavior in the new > > > clients, > > > > >> I'd > > > > >> > > > >> expect it > > > > >> > > > >> > >> > would > > > > >> > > > >> > >> > > be > > > > >> > > > >> > >> > > > > > fatal > > > > >> > > > >> > >> > > > > > > > as > > > > >> > > > >> > >> > > > > > > > > >>> well. > > > > >> > > > >> > >> > > > > > > > > >>>> > > > > >> > > > >> > >> > > > > > > > > >>>> -Artem > > > > >> > > > >> > >> > > > > > > > > >>>> > > > > >> > > > >> > >> > > > > > > > > >>>> On Tue, Nov 29, 2022 at 11:57 > AM > > > > >> Justine > > > > >> > > > Olshan > > > > >> > > > >> > >> > > > > > > > > >>>> <jols...@confluent.io.invalid> > > > wrote: > > > > >> > > > >> > >> > > > > > > > > >>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> Hi Artem and Jeff, > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> Thanks for taking a look and > > > sorry for > > > > >> > the > > > > >> > > > slow > > > > >> > > > >> > >> > response. > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> You both mentioned the change > to > > > > >> handle > > > > >> > > > >> > >> > > UNKNOWN_PRODUCER_ID > > > > >> > > > >> > >> > > > > > > errors. > > > > >> > > > >> > >> > > > > > > > > To > > > > >> > > > >> > >> > > > > > > > > >>> be > > > > >> > > > >> > >> > > > > > > > > >>>>> clear — this error code will > only > > > be > > > > >> sent > > > > >> > > > again > > > > >> > > > >> > when > > > > >> > > > >> > >> > the > > > > >> > > > >> > >> > > > > > client's > > > > >> > > > >> > >> > > > > > > > > >>> request > > > > >> > > > >> > >> > > > > > > > > >>>>> version is high enough to > ensure > > > we > > > > >> > handle > > > > >> > > it > > > > >> > > > >> > >> > correctly. > > > > >> > > > >> > >> > > > > > > > > >>>>> The current (Java) client > handles > > > > >> this by > > > > >> > > the > > > > >> > > > >> > >> following > > > > >> > > > >> > >> > > > > > (somewhat > > > > >> > > > >> > >> > > > > > > > > long) > > > > >> > > > >> > >> > > > > > > > > >>>>> code snippet: > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> // An UNKNOWN_PRODUCER_ID > means > > > that > > > > >> we > > > > >> > > have > > > > >> > > > >> lost > > > > >> > > > >> > >> the > > > > >> > > > >> > >> > > > > producer > > > > >> > > > >> > >> > > > > > > > state > > > > >> > > > >> > >> > > > > > > > > >>> on the > > > > >> > > > >> > >> > > > > > > > > >>>>> broker. Depending on the log > start > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> // offset, we may want to > retry > > > > >> these, as > > > > >> > > > >> > described > > > > >> > > > >> > >> for > > > > >> > > > >> > >> > > > each > > > > >> > > > >> > >> > > > > > case > > > > >> > > > >> > >> > > > > > > > > >>> below. If > > > > >> > > > >> > >> > > > > > > > > >>>>> none of those apply, then for > the > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> // idempotent producer, we > will > > > > >> locally > > > > >> > > bump > > > > >> > > > >> the > > > > >> > > > >> > >> epoch > > > > >> > > > >> > >> > > and > > > > >> > > > >> > >> > > > > > reset > > > > >> > > > >> > >> > > > > > > > the > > > > >> > > > >> > >> > > > > > > > > >>>>> sequence numbers of in-flight > > > batches > > > > >> > from > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> // sequence 0, then retry the > > > failed > > > > >> > batch, > > > > >> > > > >> which > > > > >> > > > >> > >> > should > > > > >> > > > >> > >> > > > now > > > > >> > > > >> > >> > > > > > > > succeed. > > > > >> > > > >> > >> > > > > > > > > >>> For > > > > >> > > > >> > >> > > > > > > > > >>>>> the transactional producer, > allow > > > the > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> // batch to fail. When > processing > > > the > > > > >> > > failed > > > > >> > > > >> > batch, > > > > >> > > > >> > >> we > > > > >> > > > >> > >> > > will > > > > >> > > > >> > >> > > > > > > > > transition > > > > >> > > > >> > >> > > > > > > > > >>> to > > > > >> > > > >> > >> > > > > > > > > >>>>> an abortable error and set a > flag > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> // indicating that we need to > > > bump the > > > > >> > > epoch > > > > >> > > > >> (if > > > > >> > > > >> > >> > > supported > > > > >> > > > >> > >> > > > by > > > > >> > > > >> > >> > > > > > the > > > > >> > > > >> > >> > > > > > > > > >>> broker). > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> if (error == > > > > >> > Errors.*UNKNOWN_PRODUCER_ID*) > > > > >> > > { > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> if > (response.logStartOffset > > > == > > > > >> -1) > > > > >> > { > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> // We don't know > the log > > > > >> start > > > > >> > > > offset > > > > >> > > > >> > with > > > > >> > > > >> > >> > this > > > > >> > > > >> > >> > > > > > > response. > > > > >> > > > >> > >> > > > > > > > > We > > > > >> > > > >> > >> > > > > > > > > >>> should > > > > >> > > > >> > >> > > > > > > > > >>>>> just retry the request until > we > > > get > > > > >> it. > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> // The > > > UNKNOWN_PRODUCER_ID > > > > >> > error > > > > >> > > > code > > > > >> > > > >> > was > > > > >> > > > >> > >> > added > > > > >> > > > >> > >> > > > > along > > > > >> > > > >> > >> > > > > > > > with > > > > >> > > > >> > >> > > > > > > > > >>> the new > > > > >> > > > >> > >> > > > > > > > > >>>>> ProduceResponse which > includes the > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> // logStartOffset. > So > > > the > > > > >> '-1' > > > > >> > > > >> sentinel > > > > >> > > > >> > is > > > > >> > > > >> > >> > not > > > > >> > > > >> > >> > > > for > > > > >> > > > >> > >> > > > > > > > backward > > > > >> > > > >> > >> > > > > > > > > >>>>> compatibility. Instead, it is > > > possible > > > > >> > for > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> // a broker to not > know > > > the > > > > >> > > > >> > >> logStartOffset at > > > > >> > > > >> > >> > > > when > > > > >> > > > >> > >> > > > > it > > > > >> > > > >> > >> > > > > > > is > > > > >> > > > >> > >> > > > > > > > > >>> returning > > > > >> > > > >> > >> > > > > > > > > >>>>> the response because the > partition > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> // may have moved > away > > > from > > > > >> the > > > > >> > > > >> broker > > > > >> > > > >> > >> from > > > > >> > > > >> > >> > the > > > > >> > > > >> > >> > > > > time > > > > >> > > > >> > >> > > > > > > the > > > > >> > > > >> > >> > > > > > > > > >>> error was > > > > >> > > > >> > >> > > > > > > > > >>>>> initially raised to the time > the > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> // response was > being > > > > >> > > constructed. > > > > >> > > > In > > > > >> > > > >> > >> these > > > > >> > > > >> > >> > > > cases, > > > > >> > > > >> > >> > > > > we > > > > >> > > > >> > >> > > > > > > > > should > > > > >> > > > >> > >> > > > > > > > > >>> just > > > > >> > > > >> > >> > > > > > > > > >>>>> retry the request: we are > > > guaranteed > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> // to eventually > get a > > > > >> > > > logStartOffset > > > > >> > > > >> > once > > > > >> > > > >> > >> > > things > > > > >> > > > >> > >> > > > > > > settle > > > > >> > > > >> > >> > > > > > > > > down. > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> return true; > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> } > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> if > > > > >> (batch.sequenceHasBeenReset()) { > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> // When the first > > > inflight > > > > >> > batch > > > > >> > > > >> fails > > > > >> > > > >> > >> due to > > > > >> > > > >> > >> > > the > > > > >> > > > >> > >> > > > > > > > > truncation > > > > >> > > > >> > >> > > > > > > > > >>> case, > > > > >> > > > >> > >> > > > > > > > > >>>>> then the sequences of all the > > > other > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> // in flight batches > > > would > > > > >> have > > > > >> > > > been > > > > >> > > > >> > >> > restarted > > > > >> > > > >> > >> > > > from > > > > >> > > > >> > >> > > > > > the > > > > >> > > > >> > >> > > > > > > > > >>> beginning. > > > > >> > > > >> > >> > > > > > > > > >>>>> However, when those responses > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> // come back from > the > > > > >> broker, > > > > >> > > they > > > > >> > > > >> would > > > > >> > > > >> > >> also > > > > >> > > > >> > >> > > > come > > > > >> > > > >> > >> > > > > > with > > > > >> > > > >> > >> > > > > > > > an > > > > >> > > > >> > >> > > > > > > > > >>>>> UNKNOWN_PRODUCER_ID error. In > this > > > > >> case, > > > > >> > we > > > > >> > > > >> should > > > > >> > > > >> > >> not > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> // reset the > sequence > > > > >> numbers > > > > >> > to > > > > >> > > > the > > > > >> > > > >> > >> > beginning. > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> return true; > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> } else if > > > > >> > > > >> > >> > > > > > (lastAckedOffset(batch.topicPartition).orElse( > > > > >> > > > >> > >> > > > > > > > > >>>>> > *NO_LAST_ACKED_SEQUENCE_NUMBER*) < > > > > >> > > > >> > >> > > > response.logStartOffset) { > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> // The head of the > log > > > has > > > > >> been > > > > >> > > > >> removed, > > > > >> > > > >> > >> > > probably > > > > >> > > > >> > >> > > > > due > > > > >> > > > >> > >> > > > > > > to > > > > >> > > > >> > >> > > > > > > > > the > > > > >> > > > >> > >> > > > > > > > > >>>>> retention time elapsing. In > this > > > case, > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> // we expect to > lose the > > > > >> > producer > > > > >> > > > >> state. > > > > >> > > > >> > >> For > > > > >> > > > >> > >> > > the > > > > >> > > > >> > >> > > > > > > > > transactional > > > > >> > > > >> > >> > > > > > > > > >>>>> producer, reset the sequences > of > > > all > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> // inflight batches > to > > > be > > > > >> from > > > > >> > > the > > > > >> > > > >> > >> beginning > > > > >> > > > >> > >> > > and > > > > >> > > > >> > >> > > > > > retry > > > > >> > > > >> > >> > > > > > > > > them, > > > > >> > > > >> > >> > > > > > > > > >>> so > > > > >> > > > >> > >> > > > > > > > > >>>>> that the transaction does not > > > need to > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> // be aborted. For > the > > > > >> > idempotent > > > > >> > > > >> > >> producer, > > > > >> > > > >> > >> > > bump > > > > >> > > > >> > >> > > > > the > > > > >> > > > >> > >> > > > > > > > epoch > > > > >> > > > >> > >> > > > > > > > > to > > > > >> > > > >> > >> > > > > > > > > >>> avoid > > > > >> > > > >> > >> > > > > > > > > >>>>> reusing (sequence, epoch) > pairs > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> if > (isTransactional()) { > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>> > > > > >> > > > >> > >> > > > > > > > >> > > > > txnPartitionMap.startSequencesAtBeginning(batch.topicPartition, > > > > >> > > > >> > >> > > > > > > > > >>>>> this.producerIdAndEpoch); > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> } else { > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > > >> requestEpochBumpForPartition(batch.topicPartition); > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> } > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> return true; > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> } > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> if (!isTransactional()) > { > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> // For the > idempotent > > > > >> producer, > > > > >> > > > >> always > > > > >> > > > >> > >> retry > > > > >> > > > >> > >> > > > > > > > > >>> UNKNOWN_PRODUCER_ID > > > > >> > > > >> > >> > > > > > > > > >>>>> errors. If the batch has the > > > current > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> // producer ID and > > > epoch, > > > > >> > > request a > > > > >> > > > >> bump > > > > >> > > > >> > >> of > > > > >> > > > >> > >> > the > > > > >> > > > >> > >> > > > > > epoch. > > > > >> > > > >> > >> > > > > > > > > >>> Otherwise > > > > >> > > > >> > >> > > > > > > > > >>>>> just retry the produce. > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > requestEpochBumpForPartition(batch.topicPartition); > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> return true; > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> } > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> } > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> I was considering keeping this > > > > >> behavior — > > > > >> > > but > > > > >> > > > >> am > > > > >> > > > >> > >> open > > > > >> > > > >> > >> > to > > > > >> > > > >> > >> > > > > > > > simplifying > > > > >> > > > >> > >> > > > > > > > > >>> it. > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> We are leaving changes to > older > > > > >> clients > > > > >> > off > > > > >> > > > the > > > > >> > > > >> > >> table > > > > >> > > > >> > >> > > here > > > > >> > > > >> > >> > > > > > since > > > > >> > > > >> > >> > > > > > > it > > > > >> > > > >> > >> > > > > > > > > >>> caused > > > > >> > > > >> > >> > > > > > > > > >>>>> many issues for clients in the > > > past. > > > > >> > > > Previously > > > > >> > > > >> > this > > > > >> > > > >> > >> > was > > > > >> > > > >> > >> > > a > > > > >> > > > >> > >> > > > > > fatal > > > > >> > > > >> > >> > > > > > > > > error > > > > >> > > > >> > >> > > > > > > > > >>> and > > > > >> > > > >> > >> > > > > > > > > >>>>> we didn't have the mechanisms > in > > > > >> place to > > > > >> > > > >> detect > > > > >> > > > >> > >> when > > > > >> > > > >> > >> > > this > > > > >> > > > >> > >> > > > > was > > > > >> > > > >> > >> > > > > > a > > > > >> > > > >> > >> > > > > > > > > >>> legitimate > > > > >> > > > >> > >> > > > > > > > > >>>>> case vs some bug or gap in the > > > > >> protocol. > > > > >> > > > >> Ensuring > > > > >> > > > >> > >> each > > > > >> > > > >> > >> > > > > > > transaction > > > > >> > > > >> > >> > > > > > > > > has > > > > >> > > > >> > >> > > > > > > > > >>> its > > > > >> > > > >> > >> > > > > > > > > >>>>> own epoch should close this > gap. > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> And to address Jeff's second > > > point: > > > > >> > > > >> > >> > > > > > > > > >>>>> *does the typical produce > request > > > path > > > > >> > > append > > > > >> > > > >> > >> records > > > > >> > > > >> > >> > to > > > > >> > > > >> > >> > > > > local > > > > >> > > > >> > >> > > > > > > log > > > > >> > > > >> > >> > > > > > > > > >>> along* > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> *with the > currentTxnFirstOffset > > > > >> > > information? > > > > >> > > > I > > > > >> > > > >> > would > > > > >> > > > >> > >> > like > > > > >> > > > >> > >> > > > to > > > > >> > > > >> > >> > > > > > > > > >>> understand* > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> *when the field is written to > > > disk.* > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> Yes, the first produce request > > > > >> populates > > > > >> > > this > > > > >> > > > >> > field > > > > >> > > > >> > >> and > > > > >> > > > >> > >> > > > > writes > > > > >> > > > >> > >> > > > > > > the > > > > >> > > > >> > >> > > > > > > > > >>> offset > > > > >> > > > >> > >> > > > > > > > > >>>>> as part of the record batch > and > > > also > > > > >> to > > > > >> > the > > > > >> > > > >> > producer > > > > >> > > > >> > >> > > state > > > > >> > > > >> > >> > > > > > > > snapshot. > > > > >> > > > >> > >> > > > > > > > > >>> When > > > > >> > > > >> > >> > > > > > > > > >>>>> we reload the records on > restart > > > > >> and/or > > > > >> > > > >> > >> reassignment, > > > > >> > > > >> > >> > we > > > > >> > > > >> > >> > > > > > > repopulate > > > > >> > > > >> > >> > > > > > > > > >>> this > > > > >> > > > >> > >> > > > > > > > > >>>>> field with the snapshot from > disk > > > > >> along > > > > >> > > with > > > > >> > > > >> the > > > > >> > > > >> > >> rest > > > > >> > > > >> > >> > of > > > > >> > > > >> > >> > > > the > > > > >> > > > >> > >> > > > > > > > producer > > > > >> > > > >> > >> > > > > > > > > >>>>> state. > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> Let me know if there are > further > > > > >> comments > > > > >> > > > >> and/or > > > > >> > > > >> > >> > > questions. > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> Thanks, > > > > >> > > > >> > >> > > > > > > > > >>>>> Justine > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> On Tue, Nov 22, 2022 at 9:00 > PM > > > Jeff > > > > >> Kim > > > > >> > > > >> > >> > > > > > > > > <jeff....@confluent.io.invalid > > > > >> > > > >> > >> > > > > > > > > >>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> wrote: > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>> Hi Justine, > > > > >> > > > >> > >> > > > > > > > > >>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>> Thanks for the KIP! I have > two > > > > >> > questions: > > > > >> > > > >> > >> > > > > > > > > >>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>> 1) For new clients, we can > once > > > again > > > > >> > > return > > > > >> > > > >> an > > > > >> > > > >> > >> error > > > > >> > > > >> > >> > > > > > > > > >>> UNKNOWN_PRODUCER_ID > > > > >> > > > >> > >> > > > > > > > > >>>>>> for sequences > > > > >> > > > >> > >> > > > > > > > > >>>>>> that are non-zero when there > is > > > no > > > > >> > > producer > > > > >> > > > >> state > > > > >> > > > >> > >> > > present > > > > >> > > > >> > >> > > > on > > > > >> > > > >> > >> > > > > > the > > > > >> > > > >> > >> > > > > > > > > >>> server. > > > > >> > > > >> > >> > > > > > > > > >>>>>> This will indicate we missed > the > > > 0 > > > > >> > > sequence > > > > >> > > > >> and > > > > >> > > > >> > we > > > > >> > > > >> > >> > don't > > > > >> > > > >> > >> > > > yet > > > > >> > > > >> > >> > > > > > > want > > > > >> > > > >> > >> > > > > > > > to > > > > >> > > > >> > >> > > > > > > > > >>>>> write > > > > >> > > > >> > >> > > > > > > > > >>>>>> to the log. > > > > >> > > > >> > >> > > > > > > > > >>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>> I would like to understand > the > > > > >> current > > > > >> > > > >> behavior > > > > >> > > > >> > to > > > > >> > > > >> > >> > > handle > > > > >> > > > >> > >> > > > > > older > > > > >> > > > >> > >> > > > > > > > > >>> clients, > > > > >> > > > >> > >> > > > > > > > > >>>>>> and if there are any changes > we > > > are > > > > >> > > making. > > > > >> > > > >> Maybe > > > > >> > > > >> > >> I'm > > > > >> > > > >> > >> > > > > missing > > > > >> > > > >> > >> > > > > > > > > >>> something, > > > > >> > > > >> > >> > > > > > > > > >>>>>> but we would want to identify > > > > >> whether we > > > > >> > > > >> missed > > > > >> > > > >> > >> the 0 > > > > >> > > > >> > >> > > > > sequence > > > > >> > > > >> > >> > > > > > > for > > > > >> > > > >> > >> > > > > > > > > >>> older > > > > >> > > > >> > >> > > > > > > > > >>>>>> clients, no? > > > > >> > > > >> > >> > > > > > > > > >>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>> 2) Upon returning from the > > > > >> transaction > > > > >> > > > >> > >> coordinator, we > > > > >> > > > >> > >> > > can > > > > >> > > > >> > >> > > > > set > > > > >> > > > >> > >> > > > > > > the > > > > >> > > > >> > >> > > > > > > > > >>>>>> transaction > > > > >> > > > >> > >> > > > > > > > > >>>>>> as ongoing on the leader by > > > > >> populating > > > > >> > > > >> > >> > > > currentTxnFirstOffset > > > > >> > > > >> > >> > > > > > > > > >>>>>> through the typical produce > > > request > > > > >> > > > handling. > > > > >> > > > >> > >> > > > > > > > > >>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>> does the typical produce > request > > > path > > > > >> > > append > > > > >> > > > >> > >> records > > > > >> > > > >> > >> > to > > > > >> > > > >> > >> > > > > local > > > > >> > > > >> > >> > > > > > > log > > > > >> > > > >> > >> > > > > > > > > >>> along > > > > >> > > > >> > >> > > > > > > > > >>>>>> with the > currentTxnFirstOffset > > > > >> > > information? > > > > >> > > > I > > > > >> > > > >> > would > > > > >> > > > >> > >> > like > > > > >> > > > >> > >> > > > to > > > > >> > > > >> > >> > > > > > > > > understand > > > > >> > > > >> > >> > > > > > > > > >>>>>> when the field is written to > > > disk. > > > > >> > > > >> > >> > > > > > > > > >>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>> Thanks, > > > > >> > > > >> > >> > > > > > > > > >>>>>> Jeff > > > > >> > > > >> > >> > > > > > > > > >>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>> On Tue, Nov 22, 2022 at 4:44 > PM > > > Artem > > > > >> > > > Livshits > > > > >> > > > >> > >> > > > > > > > > >>>>>> <alivsh...@confluent.io > .invalid> > > > > >> wrote: > > > > >> > > > >> > >> > > > > > > > > >>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>> Hi Justine, > > > > >> > > > >> > >> > > > > > > > > >>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>> Thank you for the KIP. I > have > > > one > > > > >> > > > question. > > > > >> > > > >> > >> > > > > > > > > >>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>> 5) For new clients, we can > once > > > > >> again > > > > >> > > > return > > > > >> > > > >> an > > > > >> > > > >> > >> error > > > > >> > > > >> > >> > > > > > > > > >>>>> UNKNOWN_PRODUCER_ID > > > > >> > > > >> > >> > > > > > > > > >>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>> I believe we had problems > in the > > > > >> past > > > > >> > > with > > > > >> > > > >> > >> returning > > > > >> > > > >> > >> > > > > > > > > >>>>> UNKNOWN_PRODUCER_ID > > > > >> > > > >> > >> > > > > > > > > >>>>>>> because it was considered > fatal > > > and > > > > >> > > > required > > > > >> > > > >> > >> client > > > > >> > > > >> > >> > > > > restart. > > > > >> > > > >> > >> > > > > > > It > > > > >> > > > >> > >> > > > > > > > > >>> would > > > > >> > > > >> > >> > > > > > > > > >>>>> be > > > > >> > > > >> > >> > > > > > > > > >>>>>>> good to spell out the new > client > > > > >> > behavior > > > > >> > > > >> when > > > > >> > > > >> > it > > > > >> > > > >> > >> > > > receives > > > > >> > > > >> > >> > > > > > the > > > > >> > > > >> > >> > > > > > > > > error. > > > > >> > > > >> > >> > > > > > > > > >>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>> -Artem > > > > >> > > > >> > >> > > > > > > > > >>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>> On Tue, Nov 22, 2022 at > 10:00 AM > > > > >> > Justine > > > > >> > > > >> Olshan > > > > >> > > > >> > >> > > > > > > > > >>>>>>> > <jols...@confluent.io.invalid> > > > > >> wrote: > > > > >> > > > >> > >> > > > > > > > > >>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> Thanks for taking a look > > > Matthias. > > > > >> > I've > > > > >> > > > >> tried > > > > >> > > > >> > to > > > > >> > > > >> > >> > > answer > > > > >> > > > >> > >> > > > > your > > > > >> > > > >> > >> > > > > > > > > >>>>> questions > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> below: > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> 10) > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> Right — so the hanging > > > transaction > > > > >> > only > > > > >> > > > >> occurs > > > > >> > > > >> > >> when > > > > >> > > > >> > >> > we > > > > >> > > > >> > >> > > > > have > > > > >> > > > >> > >> > > > > > a > > > > >> > > > >> > >> > > > > > > > late > > > > >> > > > >> > >> > > > > > > > > >>>>>>> message > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> come in and the partition > is > > > never > > > > >> > added > > > > >> > > > to > > > > >> > > > >> a > > > > >> > > > >> > >> > > > transaction > > > > >> > > > >> > >> > > > > > > again. > > > > >> > > > >> > >> > > > > > > > > If > > > > >> > > > >> > >> > > > > > > > > >>>>> we > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> never add the partition to > a > > > > >> > > transaction, > > > > >> > > > we > > > > >> > > > >> > will > > > > >> > > > >> > >> > > never > > > > >> > > > >> > >> > > > > > write > > > > >> > > > >> > >> > > > > > > a > > > > >> > > > >> > >> > > > > > > > > >>>>> marker > > > > >> > > > >> > >> > > > > > > > > >>>>>>> and > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> never advance the LSO. > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> If we do end up adding the > > > > >> partition > > > > >> > to > > > > >> > > > the > > > > >> > > > >> > >> > > transaction > > > > >> > > > >> > >> > > > (I > > > > >> > > > >> > >> > > > > > > > suppose > > > > >> > > > >> > >> > > > > > > > > >>>>> this > > > > >> > > > >> > >> > > > > > > > > >>>>>>> can > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> happen before or after the > late > > > > >> > message > > > > >> > > > >> comes > > > > >> > > > >> > in) > > > > >> > > > >> > >> > then > > > > >> > > > >> > >> > > > we > > > > >> > > > >> > >> > > > > > will > > > > >> > > > >> > >> > > > > > > > > >>>>> include > > > > >> > > > >> > >> > > > > > > > > >>>>>>> the > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> late message in the next > > > > >> (incorrect) > > > > >> > > > >> > transaction. > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> So perhaps it is clearer to > > > make > > > > >> the > > > > >> > > > >> > distinction > > > > >> > > > >> > >> > > between > > > > >> > > > >> > >> > > > > > > > messages > > > > >> > > > >> > >> > > > > > > > > >>>>> that > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> eventually get added to the > > > > >> > transaction > > > > >> > > > (but > > > > >> > > > >> > the > > > > >> > > > >> > >> > wrong > > > > >> > > > >> > >> > > > > one) > > > > >> > > > >> > >> > > > > > or > > > > >> > > > >> > >> > > > > > > > > >>>>> messages > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> that never get added and > become > > > > >> > hanging. > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> 20) > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> The client side change for > 2 is > > > > >> > removing > > > > >> > > > the > > > > >> > > > >> > >> > > > addPartitions > > > > >> > > > >> > >> > > > > > to > > > > >> > > > >> > >> > > > > > > > > >>>>>> transaction > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> call. We don't need to make > > > this > > > > >> from > > > > >> > > the > > > > >> > > > >> > >> producer > > > > >> > > > >> > >> > to > > > > >> > > > >> > >> > > > the > > > > >> > > > >> > >> > > > > > txn > > > > >> > > > >> > >> > > > > > > > > >>>>>>> coordinator, > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> only server side. > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> In my opinion, the issue > with > > > the > > > > >> > > > >> > >> addPartitionsToTxn > > > > >> > > > >> > >> > > > call > > > > >> > > > >> > >> > > > > > for > > > > >> > > > >> > >> > > > > > > > > older > > > > >> > > > >> > >> > > > > > > > > >>>>>>> clients > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> is that we don't have the > epoch > > > > >> bump, > > > > >> > so > > > > >> > > > we > > > > >> > > > >> > don't > > > > >> > > > >> > >> > know > > > > >> > > > >> > >> > > > if > > > > >> > > > >> > >> > > > > > the > > > > >> > > > >> > >> > > > > > > > > >>> message > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> belongs to the previous > > > > >> transaction or > > > > >> > > > this > > > > >> > > > >> > one. > > > > >> > > > >> > >> We > > > > >> > > > >> > >> > > need > > > > >> > > > >> > >> > > > > to > > > > >> > > > >> > >> > > > > > > > check > > > > >> > > > >> > >> > > > > > > > > if > > > > >> > > > >> > >> > > > > > > > > >>>>>> the > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> partition has been added to > > > this > > > > >> > > > >> transaction. > > > > >> > > > >> > Of > > > > >> > > > >> > >> > > course, > > > > >> > > > >> > >> > > > > > this > > > > >> > > > >> > >> > > > > > > > > means > > > > >> > > > >> > >> > > > > > > > > >>>>> we > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> won't completely cover the > case > > > > >> where > > > > >> > we > > > > >> > > > >> have a > > > > >> > > > >> > >> > really > > > > >> > > > >> > >> > > > > late > > > > >> > > > >> > >> > > > > > > > > message > > > > >> > > > >> > >> > > > > > > > > >>>>> and > > > > >> > > > >> > >> > > > > > > > > >>>>>>> we > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> have added the partition to > > > the new > > > > >> > > > >> > transaction, > > > > >> > > > >> > >> but > > > > >> > > > >> > >> > > > > that's > > > > >> > > > >> > >> > > > > > > > > >>>>>> unfortunately > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> something we will need the > new > > > > >> clients > > > > >> > > to > > > > >> > > > >> > cover. > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> 30) > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> Transaction is ongoing = > > > partition > > > > >> was > > > > >> > > > >> added to > > > > >> > > > >> > >> > > > > transaction > > > > >> > > > >> > >> > > > > > > via > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> addPartitionsToTxn. We > check > > > this > > > > >> with > > > > >> > > the > > > > >> > > > >> > >> > > > > > > DescribeTransactions > > > > >> > > > >> > >> > > > > > > > > >>> call. > > > > >> > > > >> > >> > > > > > > > > >>>>>> Let > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> me know if this wasn't > > > sufficiently > > > > >> > > > >> explained > > > > >> > > > >> > >> here: > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>> > > > > >> > > > >> > >> > > > > > > > > > > > > >> > > > >> > >> > > > > > > > > > > > >> > > > >> > >> > > > > > > > > > > >> > > > >> > >> > > > > > > > > > >> > > > >> > >> > > > > > > > > >> > > > >> > >> > > > > > > > >> > > > >> > >> > > > > > > >> > > > >> > >> > > > > > >> > > > >> > >> > > > > >> > > > >> > > > > > >> > > > >> > > > > >> > > > > > > > >> > > > > > > >> > > > > > >> > > > > https://cwiki.apache.org/confluence/display/KAFKA/KIP-890%3A+Transactions+Server-Side+Defense#KIP890:TransactionsServerSideDefense-EnsureOngoingTransactionforOlderClients(3) > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> 40) > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> The idea here is that if > any > > > > >> messages > > > > >> > > > >> somehow > > > > >> > > > >> > >> come > > > > >> > > > >> > >> > in > > > > >> > > > >> > >> > > > > before > > > > >> > > > >> > >> > > > > > > we > > > > >> > > > >> > >> > > > > > > > > get > > > > >> > > > >> > >> > > > > > > > > >>>>> the > > > > >> > > > >> > >> > > > > > > > > >>>>>>> new > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> epoch to the producer, they > > > will be > > > > >> > > > fenced. > > > > >> > > > >> > >> However, > > > > >> > > > >> > >> > > if > > > > >> > > > >> > >> > > > we > > > > >> > > > >> > >> > > > > > > don't > > > > >> > > > >> > >> > > > > > > > > >>>>> think > > > > >> > > > >> > >> > > > > > > > > >>>>>>> this > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> is necessary, it can be > > > discussed > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> 50) > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> It should be synchronous > > > because > > > > >> if we > > > > >> > > > have > > > > >> > > > >> an > > > > >> > > > >> > >> event > > > > >> > > > >> > >> > > > (ie, > > > > >> > > > >> > >> > > > > an > > > > >> > > > >> > >> > > > > > > > > error) > > > > >> > > > >> > >> > > > > > > > > >>>>>> that > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> causes us to need to abort > the > > > > >> > > > transaction, > > > > >> > > > >> we > > > > >> > > > >> > >> need > > > > >> > > > >> > >> > to > > > > >> > > > >> > >> > > > > know > > > > >> > > > >> > >> > > > > > > > which > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> partitions to send > transaction > > > > >> markers > > > > >> > > to. > > > > >> > > > >> We > > > > >> > > > >> > >> know > > > > >> > > > >> > >> > the > > > > >> > > > >> > >> > > > > > > > partitions > > > > >> > > > >> > >> > > > > > > > > >>>>>> because > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> we added them to the > > > coordinator > > > > >> via > > > > >> > the > > > > >> > > > >> > >> > > > > addPartitionsToTxn > > > > >> > > > >> > >> > > > > > > > call. > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> Previously we have had > > > asynchronous > > > > >> > > calls > > > > >> > > > in > > > > >> > > > >> > the > > > > >> > > > >> > >> > past > > > > >> > > > >> > >> > > > (ie, > > > > >> > > > >> > >> > > > > > > > writing > > > > >> > > > >> > >> > > > > > > > > >>>>> the > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> commit markers when the > > > > >> transaction is > > > > >> > > > >> > completed) > > > > >> > > > >> > >> > but > > > > >> > > > >> > >> > > > > often > > > > >> > > > >> > >> > > > > > > this > > > > >> > > > >> > >> > > > > > > > > >>> just > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> causes confusion as we > need to > > > wait > > > > >> > for > > > > >> > > > some > > > > >> > > > >> > >> > > operations > > > > >> > > > >> > >> > > > to > > > > >> > > > >> > >> > > > > > > > > complete. > > > > >> > > > >> > >> > > > > > > > > >>>>> In > > > > >> > > > >> > >> > > > > > > > > >>>>>>> the > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> writing commit markers > case, > > > > >> clients > > > > >> > > often > > > > >> > > > >> see > > > > >> > > > >> > >> > > > > > > > > >>>>> CONCURRENT_TRANSACTIONs > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> error messages and that > can be > > > > >> > > confusing. > > > > >> > > > >> For > > > > >> > > > >> > >> that > > > > >> > > > >> > >> > > > reason, > > > > >> > > > >> > >> > > > > > it > > > > >> > > > >> > >> > > > > > > > may > > > > >> > > > >> > >> > > > > > > > > be > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> simpler to just have > > > synchronous > > > > >> > calls — > > > > >> > > > >> > >> especially > > > > >> > > > >> > >> > if > > > > >> > > > >> > >> > > > we > > > > >> > > > >> > >> > > > > > need > > > > >> > > > >> > >> > > > > > > > to > > > > >> > > > >> > >> > > > > > > > > >>>>> block > > > > >> > > > >> > >> > > > > > > > > >>>>>>> on > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> some operation's completion > > > anyway > > > > >> > > before > > > > >> > > > we > > > > >> > > > >> > can > > > > >> > > > >> > >> > start > > > > >> > > > >> > >> > > > the > > > > >> > > > >> > >> > > > > > > next > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> transaction. And yes, I > meant > > > > >> > > > coordinator. I > > > > >> > > > >> > will > > > > >> > > > >> > >> > fix > > > > >> > > > >> > >> > > > > that. > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> 60) > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> When we are checking if the > > > > >> > transaction > > > > >> > > is > > > > >> > > > >> > >> ongoing, > > > > >> > > > >> > >> > we > > > > >> > > > >> > >> > > > > need > > > > >> > > > >> > >> > > > > > to > > > > >> > > > >> > >> > > > > > > > > make > > > > >> > > > >> > >> > > > > > > > > >>> a > > > > >> > > > >> > >> > > > > > > > > >>>>>>> round > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> trip from the leader > partition > > > to > > > > >> the > > > > >> > > > >> > transaction > > > > >> > > > >> > >> > > > > > coordinator. > > > > >> > > > >> > >> > > > > > > > In > > > > >> > > > >> > >> > > > > > > > > >>> the > > > > >> > > > >> > >> > > > > > > > > >>>>>>> time > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> we are waiting for this > > > message to > > > > >> > come > > > > >> > > > >> back, > > > > >> > > > >> > in > > > > >> > > > >> > >> > > theory > > > > >> > > > >> > >> > > > we > > > > >> > > > >> > >> > > > > > > could > > > > >> > > > >> > >> > > > > > > > > >>> have > > > > >> > > > >> > >> > > > > > > > > >>>>>>> sent > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> a commit/abort call that > would > > > make > > > > >> > the > > > > >> > > > >> > original > > > > >> > > > >> > >> > > result > > > > >> > > > >> > >> > > > of > > > > >> > > > >> > >> > > > > > the > > > > >> > > > >> > >> > > > > > > > > check > > > > >> > > > >> > >> > > > > > > > > >>>>>> out > > > > >> > > > >> > >> > > > > > > > > >>>>>>> of > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> date. That is why we can > check > > > the > > > > >> > > leader > > > > >> > > > >> state > > > > >> > > > >> > >> > before > > > > >> > > > >> > >> > > > we > > > > >> > > > >> > >> > > > > > > write > > > > >> > > > >> > >> > > > > > > > to > > > > >> > > > >> > >> > > > > > > > > >>>>> the > > > > >> > > > >> > >> > > > > > > > > >>>>>>> log. > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> I'm happy to update the > KIP if > > > > >> some of > > > > >> > > > these > > > > >> > > > >> > >> things > > > > >> > > > >> > >> > > were > > > > >> > > > >> > >> > > > > not > > > > >> > > > >> > >> > > > > > > > > clear. > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> Thanks, > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> Justine > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> On Mon, Nov 21, 2022 at > 7:11 PM > > > > >> > Matthias > > > > >> > > > J. > > > > >> > > > >> > Sax < > > > > >> > > > >> > >> > > > > > > > mj...@apache.org > > > > >> > > > >> > >> > > > > > > > > > > > > > >> > > > >> > >> > > > > > > > > >>>>>>> wrote: > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> Thanks for the KIP. > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> Couple of clarification > > > questions > > > > >> (I > > > > >> > am > > > > >> > > > >> not a > > > > >> > > > >> > >> > broker > > > > >> > > > >> > >> > > > > expert > > > > >> > > > >> > >> > > > > > > do > > > > >> > > > >> > >> > > > > > > > > >>>>> maybe > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> some question are obvious > for > > > > >> others, > > > > >> > > but > > > > >> > > > >> not > > > > >> > > > >> > >> for > > > > >> > > > >> > >> > me > > > > >> > > > >> > >> > > > with > > > > >> > > > >> > >> > > > > > my > > > > >> > > > >> > >> > > > > > > > lack > > > > >> > > > >> > >> > > > > > > > > >>>>> of > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> broker knowledge). > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> (10) > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>>> The delayed message case > can > > > also > > > > >> > > > violate > > > > >> > > > >> EOS > > > > >> > > > >> > >> if > > > > >> > > > >> > >> > the > > > > >> > > > >> > >> > > > > > delayed > > > > >> > > > >> > >> > > > > > > > > >>>>>> message > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> comes in after the next > > > > >> > > > addPartitionsToTxn > > > > >> > > > >> > >> request > > > > >> > > > >> > >> > > > comes > > > > >> > > > >> > >> > > > > > in. > > > > >> > > > >> > >> > > > > > > > > >>>>>>> Effectively > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> we > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> may see a message from a > > > previous > > > > >> > > > (aborted) > > > > >> > > > >> > >> > > transaction > > > > >> > > > >> > >> > > > > > > become > > > > >> > > > >> > >> > > > > > > > > part > > > > >> > > > >> > >> > > > > > > > > >>>>>> of > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> the > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> next transaction. > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> What happens if the > message > > > come > > > > >> in > > > > >> > > > before > > > > >> > > > >> the > > > > >> > > > >> > >> next > > > > >> > > > >> > >> > > > > > > > > >>>>>> addPartitionsToTxn > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> request? It seems the > broker > > > > >> hosting > > > > >> > > the > > > > >> > > > >> data > > > > >> > > > >> > >> > > > partitions > > > > >> > > > >> > >> > > > > > > won't > > > > >> > > > >> > >> > > > > > > > > know > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> anything about it and > append > > > it to > > > > >> > the > > > > >> > > > >> > >> partition, > > > > >> > > > >> > >> > > too? > > > > >> > > > >> > >> > > > > What > > > > >> > > > >> > >> > > > > > > is > > > > >> > > > >> > >> > > > > > > > > the > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> difference between both > cases? > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> Also, it seems a TX would > only > > > > >> hang, > > > > >> > if > > > > >> > > > >> there > > > > >> > > > >> > >> is no > > > > >> > > > >> > >> > > > > > following > > > > >> > > > >> > >> > > > > > > > TX > > > > >> > > > >> > >> > > > > > > > > >>>>> that > > > > >> > > > >> > >> > > > > > > > > >>>>>>> is > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> either committer or > aborted? > > > Thus, > > > > >> > for > > > > >> > > > the > > > > >> > > > >> > case > > > > >> > > > >> > >> > > above, > > > > >> > > > >> > >> > > > > the > > > > >> > > > >> > >> > > > > > TX > > > > >> > > > >> > >> > > > > > > > > might > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> actually not hang (of > course, > > > we > > > > >> > might > > > > >> > > > get > > > > >> > > > >> an > > > > >> > > > >> > >> EOS > > > > >> > > > >> > >> > > > > violation > > > > >> > > > >> > >> > > > > > > if > > > > >> > > > >> > >> > > > > > > > > the > > > > >> > > > >> > >> > > > > > > > > >>>>>>> first > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> TX was aborted and the > second > > > > >> > > committed, > > > > >> > > > or > > > > >> > > > >> > the > > > > >> > > > >> > >> > other > > > > >> > > > >> > >> > > > way > > > > >> > > > >> > >> > > > > > > > > around). > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> (20) > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>>> Of course, 1 and 2 > require > > > > >> > client-side > > > > >> > > > >> > >> changes, so > > > > >> > > > >> > >> > > for > > > > >> > > > >> > >> > > > > > older > > > > >> > > > >> > >> > > > > > > > > >>>>>> clients, > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> those approaches won’t > apply. > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> For (1) I understand why a > > > client > > > > >> > > change > > > > >> > > > is > > > > >> > > > >> > >> > > necessary, > > > > >> > > > >> > >> > > > > but > > > > >> > > > >> > >> > > > > > > not > > > > >> > > > >> > >> > > > > > > > > sure > > > > >> > > > >> > >> > > > > > > > > >>>>>> why > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> we need a client change > for > > > (2). > > > > >> Can > > > > >> > > you > > > > >> > > > >> > >> elaborate? > > > > >> > > > >> > >> > > -- > > > > >> > > > >> > >> > > > > > Later > > > > >> > > > >> > >> > > > > > > > you > > > > >> > > > >> > >> > > > > > > > > >>>>>>> explain > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> that we should send a > > > > >> > > > >> > >> DescribeTransactionRequest, > > > > >> > > > >> > >> > > but I > > > > >> > > > >> > >> > > > > am > > > > >> > > > >> > >> > > > > > > not > > > > >> > > > >> > >> > > > > > > > > sure > > > > >> > > > >> > >> > > > > > > > > >>>>>>> why? > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> Can't we not just do an > > > implicit > > > > >> > > > >> > >> AddPartiitonToTx, > > > > >> > > > >> > >> > > too? > > > > >> > > > >> > >> > > > > If > > > > >> > > > >> > >> > > > > > > the > > > > >> > > > >> > >> > > > > > > > > old > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> producer correctly > registered > > > the > > > > >> > > > partition > > > > >> > > > >> > >> > already, > > > > >> > > > >> > >> > > > the > > > > >> > > > >> > >> > > > > > > > > >>>>>> TX-coordinator > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> can just ignore it as > it's an > > > > >> > > idempotent > > > > >> > > > >> > >> operation? > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> (30) > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>>> To cover older clients, > we > > > will > > > > >> > > ensure a > > > > >> > > > >> > >> > transaction > > > > >> > > > >> > >> > > > is > > > > >> > > > >> > >> > > > > > > > ongoing > > > > >> > > > >> > >> > > > > > > > > >>>>>>> before > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> we write to a transaction > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> Not sure what you mean by > > > this? > > > > >> Can > > > > >> > you > > > > >> > > > >> > >> elaborate? > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> (40) > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>>> [the TX-coordinator] will > > > write > > > > >> the > > > > >> > > > >> prepare > > > > >> > > > >> > >> commit > > > > >> > > > >> > >> > > > > message > > > > >> > > > >> > >> > > > > > > > with > > > > >> > > > >> > >> > > > > > > > > a > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> bumped > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> epoch and send > > > > >> WriteTxnMarkerRequests > > > > >> > > > with > > > > >> > > > >> the > > > > >> > > > >> > >> > bumped > > > > >> > > > >> > >> > > > > > epoch. > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> Why do we use the bumped > > > epoch for > > > > >> > > both? > > > > >> > > > It > > > > >> > > > >> > >> seems > > > > >> > > > >> > >> > > more > > > > >> > > > >> > >> > > > > > > > intuitive > > > > >> > > > >> > >> > > > > > > > > to > > > > >> > > > >> > >> > > > > > > > > >>>>>> use > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> the current epoch, and > only > > > return > > > > >> > the > > > > >> > > > >> bumped > > > > >> > > > >> > >> epoch > > > > >> > > > >> > >> > > to > > > > >> > > > >> > >> > > > > the > > > > >> > > > >> > >> > > > > > > > > >>>>> producer? > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> (50) "Implicit > > > > >> > > AddPartitionToTransaction" > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> Why does the implicitly > sent > > > > >> request > > > > >> > > need > > > > >> > > > >> to > > > > >> > > > >> > be > > > > >> > > > >> > >> > > > > > synchronous? > > > > >> > > > >> > >> > > > > > > > The > > > > >> > > > >> > >> > > > > > > > > >>>>> KIP > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> also says > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>>> in case we need to abort > and > > > > >> need to > > > > >> > > > know > > > > >> > > > >> > which > > > > >> > > > >> > >> > > > > partitions > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> What do you mean by this? > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>>> we don’t want to write > to it > > > > >> before > > > > >> > we > > > > >> > > > >> store > > > > >> > > > >> > in > > > > >> > > > >> > >> > the > > > > >> > > > >> > >> > > > > > > > transaction > > > > >> > > > >> > >> > > > > > > > > >>>>>>> manager > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> Do you mean TX-coordinator > > > > >> instead of > > > > >> > > > >> > "manager"? > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> (60) > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> For older clients and > ensuring > > > > >> that > > > > >> > the > > > > >> > > > TX > > > > >> > > > >> is > > > > >> > > > >> > >> > > ongoing, > > > > >> > > > >> > >> > > > > you > > > > >> > > > >> > >> > > > > > > > > >>>>> describe a > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> race condition. I am not > sure > > > if I > > > > >> > can > > > > >> > > > >> follow > > > > >> > > > >> > >> here. > > > > >> > > > >> > >> > > Can > > > > >> > > > >> > >> > > > > you > > > > >> > > > >> > >> > > > > > > > > >>>>>> elaborate? > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> -Matthias > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> On 11/18/22 1:21 PM, > Justine > > > > >> Olshan > > > > >> > > > wrote: > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>>> Hey all! > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>>> I'd like to start a > > > discussion > > > > >> on my > > > > >> > > > >> proposal > > > > >> > > > >> > >> to > > > > >> > > > >> > >> > add > > > > >> > > > >> > >> > > > > some > > > > >> > > > >> > >> > > > > > > > > >>>>>> server-side > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>>> checks on transactions to > > > avoid > > > > >> > > hanging > > > > >> > > > >> > >> > > transactions. > > > > >> > > > >> > >> > > > I > > > > >> > > > >> > >> > > > > > know > > > > >> > > > >> > >> > > > > > > > > this > > > > >> > > > >> > >> > > > > > > > > >>>>>> has > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> been > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>>> an issue for some time, > so I > > > > >> really > > > > >> > > hope > > > > >> > > > >> this > > > > >> > > > >> > >> KIP > > > > >> > > > >> > >> > > will > > > > >> > > > >> > >> > > > > be > > > > >> > > > >> > >> > > > > > > > > helpful > > > > >> > > > >> > >> > > > > > > > > >>>>>> for > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> many > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>>> users of EOS. > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>>> The KIP includes changes > that > > > > >> will > > > > >> > be > > > > >> > > > >> > >> compatible > > > > >> > > > >> > >> > > with > > > > >> > > > >> > >> > > > > old > > > > >> > > > >> > >> > > > > > > > > clients > > > > >> > > > >> > >> > > > > > > > > >>>>>> and > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>>> changes to improve > > > performance > > > > >> and > > > > >> > > > >> > correctness > > > > >> > > > >> > >> on > > > > >> > > > >> > >> > > new > > > > >> > > > >> > >> > > > > > > clients. > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>>> Please take a look and > leave > > > any > > > > >> > > > comments > > > > >> > > > >> you > > > > >> > > > >> > >> may > > > > >> > > > >> > >> > > > have! > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>>> KIP: > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>> > > > > >> > > > >> > >> > > > > > > > > > > > > >> > > > >> > >> > > > > > > > > > > > >> > > > >> > >> > > > > > > > > > > >> > > > >> > >> > > > > > > > > > >> > > > >> > >> > > > > > > > > >> > > > >> > >> > > > > > > > >> > > > >> > >> > > > > > > >> > > > >> > >> > > > > > >> > > > >> > >> > > > > >> > > > >> > > > > > >> > > > >> > > > > >> > > > > > > > >> > > > > > > >> > > > > > >> > > > > https://cwiki.apache.org/confluence/display/KAFKA/KIP-890%3A+Transactions+Server-Side+Defense > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>>> JIRA: > > > > >> > > > >> > >> > > > > https://issues.apache.org/jira/browse/KAFKA-14402 > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>>> Thanks! > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>>> Justine > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>>> > > > > >> > > > >> > >> > > > > > > > > >>>>> > > > > >> > > > >> > >> > > > > > > > > >>>> > > > > >> > > > >> > >> > > > > > > > > >>> > > > > >> > > > >> > >> > > > > > > > > >> > > > > >> > > > >> > >> > > > > > > > > > > > > > >> > > > >> > >> > > > > > > > > > > > > >> > > > >> > >> > > > > > > > > > > > >> > > > >> > >> > > > > > > > > > > >> > > > >> > >> > > > > > > > > > >> > > > >> > >> > > > > > > > > >> > > > >> > >> > > > > > > > >> > > > >> > >> > > > > > > >> > > > >> > >> > > > > > >> > > > >> > >> > > > > >> > > > >> > > > > > > >> > > > >> > > > > > >> > > > >> > > > > >> > > > > > > > > >> > > > > > > > >> > > > > > > >> > > > > > >> > > > > > > > > >