Skip to content

Commit b0a26bc

Browse files
authored
KAFKA-19173: Add Feature for "streams" group (#19509)
Add new StreamsGroupFeature, disabled by default, and add "streams" as default value to `group.coordinator.rebalance.protocols`. Reviewers: Chia-Ping Tsai <chia7712@gmail.com>, David Jacot <david.jacot@gmail.com>, Lucas Brutschy <lbrutschy@confluent.io>, Justine Olshan <jolshan@confluent.io>, Andrew Schofield <aschofield@confluent.io>, Jun Rao <jun@confluent.io>
1 parent 81881de commit b0a26bc

File tree

19 files changed

+216
-69
lines changed

19 files changed

+216
-69
lines changed

core/src/main/scala/kafka/server/KafkaApis.scala

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ import org.apache.kafka.coordinator.share.ShareCoordinator
6262
import org.apache.kafka.metadata.{ConfigRepository, MetadataCache}
6363
import org.apache.kafka.server.{ApiVersionManager, ClientMetricsManager, DelegationTokenManager, ProcessRole}
6464
import org.apache.kafka.server.authorizer._
65-
import org.apache.kafka.server.common.{GroupVersion, RequestLocal, TransactionVersion}
65+
import org.apache.kafka.server.common.{GroupVersion, RequestLocal, StreamsVersion, TransactionVersion}
6666
import org.apache.kafka.server.config.DelegationTokenManagerConfigs
6767
import org.apache.kafka.server.share.context.ShareFetchContext
6868
import org.apache.kafka.server.share.{ErroneousAndValidPartitionData, SharePartitionKey}
@@ -2649,11 +2649,15 @@ class KafkaApis(val requestChannel: RequestChannel,
26492649
}
26502650
}
26512651
}
2652+
}
26522653

2654+
private def streamsVersion(): StreamsVersion = {
2655+
StreamsVersion.fromFeatureLevel(metadataCache.features.finalizedFeatures.getOrDefault(StreamsVersion.FEATURE_NAME, 0.toShort))
26532656
}
26542657

26552658
private def isStreamsGroupProtocolEnabled: Boolean = {
2656-
config.groupCoordinatorRebalanceProtocols.contains(Group.GroupType.STREAMS)
2659+
config.groupCoordinatorRebalanceProtocols.contains(Group.GroupType.STREAMS) &&
2660+
streamsVersion().streamsGroupSupported
26572661
}
26582662

26592663
def handleStreamsGroupHeartbeat(request: RequestChannel.Request): CompletableFuture[Unit] = {

core/src/main/scala/kafka/server/KafkaConfig.scala

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -386,10 +386,6 @@ class KafkaConfig private(doLog: Boolean, val props: util.Map[_, _])
386386
if (!protocols.contains(GroupType.CLASSIC)) {
387387
throw new ConfigException(s"Disabling the '${GroupType.CLASSIC}' protocol is not supported.")
388388
}
389-
if (protocols.contains(GroupType.STREAMS)) {
390-
warn(s"Streams groups and the new '${GroupType.STREAMS}' rebalance protocol are enabled. " +
391-
"This is part of the early access of KIP-1071 and MUST NOT be used in production.")
392-
}
393389
protocols
394390
}
395391

core/src/test/scala/unit/kafka/server/AbstractApiVersionsRequestTest.scala

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import org.apache.kafka.common.protocol.ApiKeys
2525
import org.apache.kafka.common.requests.{ApiVersionsRequest, ApiVersionsResponse, RequestUtils}
2626
import org.apache.kafka.common.test.ClusterInstance
2727
import org.apache.kafka.common.utils.Utils
28-
import org.apache.kafka.server.common.{EligibleLeaderReplicasVersion, GroupVersion, MetadataVersion, ShareVersion, TransactionVersion}
28+
import org.apache.kafka.server.common.{EligibleLeaderReplicasVersion, GroupVersion, MetadataVersion, ShareVersion, StreamsVersion, TransactionVersion}
2929
import org.apache.kafka.test.TestUtils
3030
import org.junit.jupiter.api.Assertions._
3131
import org.junit.jupiter.api.Tag
@@ -64,11 +64,11 @@ abstract class AbstractApiVersionsRequestTest(cluster: ClusterInstance) {
6464
apiVersion: Short = ApiKeys.API_VERSIONS.latestVersion
6565
): Unit = {
6666
if (apiVersion >= 3) {
67-
assertEquals(5, apiVersionsResponse.data().finalizedFeatures().size())
67+
assertEquals(6, apiVersionsResponse.data().finalizedFeatures().size())
6868
assertEquals(MetadataVersion.latestTesting().featureLevel(), apiVersionsResponse.data().finalizedFeatures().find(MetadataVersion.FEATURE_NAME).minVersionLevel())
6969
assertEquals(MetadataVersion.latestTesting().featureLevel(), apiVersionsResponse.data().finalizedFeatures().find(MetadataVersion.FEATURE_NAME).maxVersionLevel())
7070

71-
assertEquals(6, apiVersionsResponse.data().supportedFeatures().size())
71+
assertEquals(7, apiVersionsResponse.data().supportedFeatures().size())
7272
assertEquals(MetadataVersion.MINIMUM_VERSION.featureLevel(), apiVersionsResponse.data().supportedFeatures().find(MetadataVersion.FEATURE_NAME).minVersion())
7373
if (apiVersion < 4) {
7474
assertEquals(1, apiVersionsResponse.data().supportedFeatures().find("kraft.version").minVersion())
@@ -88,6 +88,9 @@ abstract class AbstractApiVersionsRequestTest(cluster: ClusterInstance) {
8888

8989
assertEquals(0, apiVersionsResponse.data().supportedFeatures().find(ShareVersion.FEATURE_NAME).minVersion())
9090
assertEquals(ShareVersion.SV_1.featureLevel(), apiVersionsResponse.data().supportedFeatures().find(ShareVersion.FEATURE_NAME).maxVersion())
91+
92+
assertEquals(0, apiVersionsResponse.data().supportedFeatures().find(StreamsVersion.FEATURE_NAME).minVersion())
93+
assertEquals(StreamsVersion.SV_1.featureLevel(), apiVersionsResponse.data().supportedFeatures().find(StreamsVersion.FEATURE_NAME).maxVersion())
9194
}
9295
val expectedApis = if (cluster.controllerListenerName().toScala.contains(listenerName)) {
9396
ApiVersionsResponse.collectApis(

0 commit comments

Comments
 (0)