KAFKA-18690: Keep leader metadata for RE2J-assigned partitions (#18777)

Reviewers: Lianet Magrans <lmagrans@confluent.io>
This commit is contained in:
Sean Quah 2025-02-04 18:22:28 +00:00 committed by GitHub
parent 8e3a001bf5
commit 42e7cbb67e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 42 additions and 1 deletions

View File

@ -94,6 +94,6 @@ public class ConsumerMetadata extends Metadata {
if (isInternal && !includeInternalTopics)
return false;
return subscription.matchesSubscribedPattern(topic);
return subscription.matchesSubscribedPattern(topic) || subscription.isAssignedFromRe2j(topic);
}
}

View File

@ -490,6 +490,20 @@ public class SubscriptionState {
|| this.subscriptionType == SubscriptionType.AUTO_TOPICS_SHARE || this.subscriptionType == SubscriptionType.AUTO_PATTERN_RE2J;
}
public synchronized boolean isAssignedFromRe2j(String topic) {
if (!hasRe2JPatternSubscription()) {
return false;
}
for (TopicPartition topicPartition : assignment.partitionSet()) {
if (topicPartition.topic().equals(topic)) {
return true;
}
}
return false;
}
public synchronized void position(TopicPartition tp, FetchPosition position) {
assignedState(tp).position(position);
}

View File

@ -215,6 +215,33 @@ class PlaintextConsumerSubscriptionTest extends AbstractConsumerTest {
awaitAssignment(consumer, assignment)
}
@ParameterizedTest(name = TestInfoUtils.TestWithParameterizedQuorumAndGroupProtocolNames)
@MethodSource(Array("getTestQuorumAndGroupProtocolParametersConsumerGroupProtocolOnly"))
def testRe2JPatternSubscriptionFetch(quorum: String, groupProtocol: String): Unit = {
val topic1 = "topic1" // matches subscribed pattern
createTopic(topic1, 2, brokerCount)
val consumer = createConsumer()
assertEquals(0, consumer.assignment().size)
val pattern = new SubscriptionPattern("topic.*")
consumer.subscribe(pattern)
val assignment = Set(
new TopicPartition(topic, 0),
new TopicPartition(topic, 1),
new TopicPartition(topic1, 0),
new TopicPartition(topic1, 1))
awaitAssignment(consumer, assignment)
val producer = createProducer()
val totalRecords = 10L
val startingTimestamp = System.currentTimeMillis()
val tp = new TopicPartition(topic1, 0)
sendRecords(producer, totalRecords.toInt, tp, startingTimestamp = startingTimestamp)
consumeAndVerifyRecords(consumer = consumer, numRecords = totalRecords.toInt, startingOffset = 0, startingTimestamp = startingTimestamp, tp = tp)
}
@ParameterizedTest(name = TestInfoUtils.TestWithParameterizedQuorumAndGroupProtocolNames)
@MethodSource(Array("getTestQuorumAndGroupProtocolParametersConsumerGroupProtocolOnly"))
def testRe2JPatternExpandSubscription(quorum: String, groupProtocol: String): Unit = {