Sylwester Lachiewicz created FLINK-40624:
--------------------------------------------

             Summary: KafkaCommitter and ExactlyOnceKafkaWriter do not handle 
InvalidProducerEpochException alongside ProducerFencedException
                 Key: FLINK-40624
                 URL: https://issues.apache.org/jira/browse/FLINK-40624
             Project: Flink
          Issue Type: Bug
          Components: Connectors / Kafka
            Reporter: Sylwester Lachiewicz


A fenced Kafka producer can surface either of two exceptions, depending on 
which request observes the epoch bump:

* coordinator path (EndTxn, AddPartitions) -> PRODUCER_FENCED -> 
{{ProducerFencedException}}
* produce path -> INVALID_PRODUCER_EPOCH -> {{InvalidProducerEpochException}}

In kafka-clients 4.2.0 both extend {{ApplicationRecoverableException}} and 
neither is a subtype of the other. {{InvalidProducerEpochException}} does not 
appear anywhere in flink-connector-kafka, so only the first is handled:

* 
[KafkaCommitter.java:109|https://github.com/apache/flink-connector-kafka/blob/main/flink-connector-kafka/src/main/java/org/apache/flink/connector/kafka/sink/internal/KafkaCommitter.java#L109]
 catches {{ProducerFencedException}} and routes it to {{logFencedRequest}} plus 
{{signalFailedWithKnownReason}}. {{InvalidProducerEpochException}} misses that 
branch and every later one, falling through to the terminal {{catch (Exception 
e)}} at 
[KafkaCommitter.java:141|https://github.com/apache/flink-connector-kafka/blob/main/flink-connector-kafka/src/main/java/org/apache/flink/connector/kafka/sink/internal/KafkaCommitter.java#L141],
 which logs "Transaction ({}) encountered error and data has been potentially 
lost" and calls {{signalFailedWithUnknownReason}}. A fenced producer is then 
reported as an unknown error and the fenced-specific guidance is not emitted.
* 
[ExactlyOnceKafkaWriter.java:288|https://github.com/apache/flink-connector-kafka/blob/main/flink-connector-kafka/src/main/java/org/apache/flink/connector/kafka/sink/ExactlyOnceKafkaWriter.java#L288]
 catches {{ProducerFencedException}} to keep the abort best effort, as its 
comment describes. {{InvalidProducerEpochException}} escapes that abort instead.

This is a handling and reporting gap rather than a correctness bug in the 
commit itself; the terminal branch still triggers failover.

Evidence is the class hierarchy plus the catch chains, and 
[FLINK-40621|https://issues.apache.org/jira/browse/FLINK-40621], where 
{{commitTransaction}} on a fenced producer threw 
{{InvalidProducerEpochException}} with the produce-path message "attempted to 
produce with an old epoch". I have not reproduced the production path.

Suggested change: handle both exceptions wherever the intent is "the producer 
is fenced", either by catching both or by catching the shared supertype.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to