This is an automated email from the ASF dual-hosted git repository.
AHeise pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/flink-connector-kafka.git
The following commit(s) were added to refs/heads/main by this push:
new eb8ff700 [FLINK-39728] Fix pauseOrResumeSplits race with unassigned
partitions
eb8ff700 is described below
commit eb8ff700b2390d5bc3a8c67fcdb3f3ad93824e24
Author: Jim Hughes <[email protected]>
AuthorDate: Thu May 21 14:57:37 2026 -0400
[FLINK-39728] Fix pauseOrResumeSplits race with unassigned partitions
Filter against consumer.assignment() before calling pause()/resume()
to prevent IllegalStateException when a partition is concurrently
unassigned by fetch() or removeEmptySplits().
Generated-by: Claude Opus 4.6 (Anthropic)
---
.../source/reader/KafkaPartitionSplitReader.java | 31 ++++++++++++++++------
.../reader/KafkaPartitionSplitReaderTest.java | 23 ++++++++++++++++
2 files changed, 46 insertions(+), 8 deletions(-)
diff --git
a/flink-connector-kafka/src/main/java/org/apache/flink/connector/kafka/source/reader/KafkaPartitionSplitReader.java
b/flink-connector-kafka/src/main/java/org/apache/flink/connector/kafka/source/reader/KafkaPartitionSplitReader.java
index 74d4bc1f..256a9cf1 100644
---
a/flink-connector-kafka/src/main/java/org/apache/flink/connector/kafka/source/reader/KafkaPartitionSplitReader.java
+++
b/flink-connector-kafka/src/main/java/org/apache/flink/connector/kafka/source/reader/KafkaPartitionSplitReader.java
@@ -240,14 +240,29 @@ public class KafkaPartitionSplitReader
public void pauseOrResumeSplits(
Collection<KafkaPartitionSplit> splitsToPause,
Collection<KafkaPartitionSplit> splitsToResume) {
- consumer.resume(
- splitsToResume.stream()
- .map(KafkaPartitionSplit::getTopicPartition)
- .collect(Collectors.toList()));
- consumer.pause(
- splitsToPause.stream()
- .map(KafkaPartitionSplit::getTopicPartition)
- .collect(Collectors.toList()));
+ // Filter against current assignment to avoid IllegalStateException
when a partition
+ // was concurrently unassigned by fetch() or removeEmptySplits().
+ Set<TopicPartition> assigned = consumer.assignment();
+ List<TopicPartition> toResume = new ArrayList<>();
+ for (KafkaPartitionSplit split : splitsToResume) {
+ TopicPartition tp = split.getTopicPartition();
+ if (assigned.contains(tp)) {
+ toResume.add(tp);
+ } else {
+ LOG.warn("Skipping resume for unassigned partition {}", tp);
+ }
+ }
+ List<TopicPartition> toPause = new ArrayList<>();
+ for (KafkaPartitionSplit split : splitsToPause) {
+ TopicPartition tp = split.getTopicPartition();
+ if (assigned.contains(tp)) {
+ toPause.add(tp);
+ } else {
+ LOG.warn("Skipping pause for unassigned partition {}", tp);
+ }
+ }
+ consumer.resume(toResume);
+ consumer.pause(toPause);
}
// ---------------
diff --git
a/flink-connector-kafka/src/test/java/org/apache/flink/connector/kafka/source/reader/KafkaPartitionSplitReaderTest.java
b/flink-connector-kafka/src/test/java/org/apache/flink/connector/kafka/source/reader/KafkaPartitionSplitReaderTest.java
index af000438..adf240df 100644
---
a/flink-connector-kafka/src/test/java/org/apache/flink/connector/kafka/source/reader/KafkaPartitionSplitReaderTest.java
+++
b/flink-connector-kafka/src/test/java/org/apache/flink/connector/kafka/source/reader/KafkaPartitionSplitReaderTest.java
@@ -354,6 +354,29 @@ public class KafkaPartitionSplitReaderTest {
assertThat(properties.containsKey(ConsumerConfig.CLIENT_RACK_CONFIG)).isFalse();
}
+ @Test
+ void testPauseOrResumeSplitsWithUnassignedPartition() {
+ KafkaPartitionSplitReader reader = createReader();
+ // Create a split for a partition that is NOT assigned to the consumer.
+ // Without the fix, this would throw IllegalStateException:
+ // "No current assignment for partition".
+ TopicPartition unassignedPartition = new TopicPartition(TOPIC1, 0);
+ KafkaPartitionSplit unassignedSplit =
+ new KafkaPartitionSplit(unassignedPartition,
KafkaPartitionSplit.EARLIEST_OFFSET);
+
+ // Verify the partition is indeed not assigned
+
assertThat(reader.consumer().assignment()).doesNotContain(unassignedPartition);
+
+ // This should be a no-op, not throw an exception
+ reader.pauseOrResumeSplits(
+ Collections.singletonList(unassignedSplit),
Collections.emptyList());
+ reader.pauseOrResumeSplits(
+ Collections.emptyList(),
Collections.singletonList(unassignedSplit));
+ reader.pauseOrResumeSplits(
+ Collections.singletonList(unassignedSplit),
+ Collections.singletonList(unassignedSplit));
+ }
+
// ------------------
private void assignSplitsAndFetchUntilFinish(KafkaPartitionSplitReader
reader, int readerId)