From 0fc9879bb0de140ec759065cdd929fb906aa1f43 Mon Sep 17 00:00:00 2001 From: David Jacot Date: Thu, 6 Jun 2024 21:40:49 +0200 Subject: [PATCH 1/5] MINOR: Rename uniform assignor's internal builders --- .../AbstractUniformAssignmentBuilder.java | 71 ------------------- .../group/assignor/UniformAssignor.java | 10 +-- ...niformHeterogeneousAssignmentBuilder.java} | 46 ++++++++++-- ...> UniformHomogenousAssignmentBuilder.java} | 4 +- ...rmHeterogeneousAssignmentBuilderTest.java} | 2 +- 5 files changed, 48 insertions(+), 85 deletions(-) delete mode 100644 group-coordinator/src/main/java/org/apache/kafka/coordinator/group/assignor/AbstractUniformAssignmentBuilder.java rename group-coordinator/src/main/java/org/apache/kafka/coordinator/group/assignor/{GeneralUniformAssignmentBuilder.java => UniformHeterogeneousAssignmentBuilder.java} (95%) rename group-coordinator/src/main/java/org/apache/kafka/coordinator/group/assignor/{OptimizedUniformAssignmentBuilder.java => UniformHomogenousAssignmentBuilder.java} (98%) rename group-coordinator/src/test/java/org/apache/kafka/coordinator/group/assignor/{GeneralUniformAssignmentBuilderTest.java => UniformHeterogeneousAssignmentBuilderTest.java} (99%) diff --git a/group-coordinator/src/main/java/org/apache/kafka/coordinator/group/assignor/AbstractUniformAssignmentBuilder.java b/group-coordinator/src/main/java/org/apache/kafka/coordinator/group/assignor/AbstractUniformAssignmentBuilder.java deleted file mode 100644 index 2c1711330877e..0000000000000 --- a/group-coordinator/src/main/java/org/apache/kafka/coordinator/group/assignor/AbstractUniformAssignmentBuilder.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.kafka.coordinator.group.assignor; - -import org.apache.kafka.common.Uuid; -import org.apache.kafka.coordinator.group.api.assignor.GroupAssignment; -import org.apache.kafka.coordinator.group.api.assignor.MemberAssignment; -import org.apache.kafka.coordinator.group.api.assignor.SubscribedTopicDescriber; -import org.apache.kafka.server.common.TopicIdPartition; - -import java.util.Collection; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - -/** - * The assignment builder is used to construct the target assignment based on the members' subscriptions. - */ -public abstract class AbstractUniformAssignmentBuilder { - protected abstract GroupAssignment buildAssignment(); - - /** - * Adds the topic's partition to the member's target assignment. - */ - protected static void addPartitionToAssignment( - Map memberAssignments, - String memberId, - Uuid topicId, - int partition - ) { - memberAssignments.get(memberId) - .partitions() - .computeIfAbsent(topicId, __ -> new HashSet<>()) - .add(partition); - } - - /** - * Constructs a set of {@code TopicIdPartition} including all the given topic Ids based on their partition counts. - * - * @param topicIds Collection of topic Ids. - * @param subscribedTopicDescriber Describer to fetch partition counts for topics. - * - * @return Set of {@code TopicIdPartition} including all the provided topic Ids. - */ - protected static Set topicIdPartitions( - Collection topicIds, - SubscribedTopicDescriber subscribedTopicDescriber - ) { - return topicIds.stream() - .flatMap(topic -> IntStream - .range(0, subscribedTopicDescriber.numPartitions(topic)) - .mapToObj(i -> new TopicIdPartition(topic, i)) - ).collect(Collectors.toSet()); - } -} diff --git a/group-coordinator/src/main/java/org/apache/kafka/coordinator/group/assignor/UniformAssignor.java b/group-coordinator/src/main/java/org/apache/kafka/coordinator/group/assignor/UniformAssignor.java index 8ae76313676fa..6cfcc97179ffb 100644 --- a/group-coordinator/src/main/java/org/apache/kafka/coordinator/group/assignor/UniformAssignor.java +++ b/group-coordinator/src/main/java/org/apache/kafka/coordinator/group/assignor/UniformAssignor.java @@ -46,8 +46,8 @@ * * The appropriate strategy is automatically chosen based on the current members' topic subscriptions. * - * @see OptimizedUniformAssignmentBuilder - * @see GeneralUniformAssignmentBuilder + * @see UniformHomogenousAssignmentBuilder + * @see UniformHeterogeneousAssignmentBuilder */ public class UniformAssignor implements ConsumerGroupPartitionAssignor { private static final Logger LOG = LoggerFactory.getLogger(UniformAssignor.class); @@ -77,13 +77,13 @@ public GroupAssignment assign( if (groupSpec.subscriptionType().equals(HOMOGENEOUS)) { LOG.debug("Detected that all members are subscribed to the same set of topics, invoking the " + "optimized assignment algorithm"); - return new OptimizedUniformAssignmentBuilder(groupSpec, subscribedTopicDescriber) + return new UniformHomogenousAssignmentBuilder(groupSpec, subscribedTopicDescriber) .build(); } else { LOG.debug("Detected that the members are subscribed to different sets of topics, invoking the " + "general assignment algorithm"); - return new GeneralUniformAssignmentBuilder(groupSpec, subscribedTopicDescriber) - .buildAssignment(); + return new UniformHeterogeneousAssignmentBuilder(groupSpec, subscribedTopicDescriber) + .build(); } } } diff --git a/group-coordinator/src/main/java/org/apache/kafka/coordinator/group/assignor/GeneralUniformAssignmentBuilder.java b/group-coordinator/src/main/java/org/apache/kafka/coordinator/group/assignor/UniformHeterogeneousAssignmentBuilder.java similarity index 95% rename from group-coordinator/src/main/java/org/apache/kafka/coordinator/group/assignor/GeneralUniformAssignmentBuilder.java rename to group-coordinator/src/main/java/org/apache/kafka/coordinator/group/assignor/UniformHeterogeneousAssignmentBuilder.java index 46c4e363e568d..d355eb58bf663 100644 --- a/group-coordinator/src/main/java/org/apache/kafka/coordinator/group/assignor/GeneralUniformAssignmentBuilder.java +++ b/group-coordinator/src/main/java/org/apache/kafka/coordinator/group/assignor/UniformHeterogeneousAssignmentBuilder.java @@ -39,9 +39,10 @@ import java.util.Set; import java.util.TreeSet; import java.util.stream.Collectors; +import java.util.stream.IntStream; /** - * The general uniform assignment builder is used to generate the target assignment for a consumer group with + * The Heterogeneous uniform assignment builder is used to generate the target assignment for a consumer group with * at least one of its members subscribed to a different set of topics. * * Assignments are done according to the following principles: @@ -55,8 +56,8 @@ * This assignment builder prioritizes the above properties in the following order: * Balance > Stickiness. */ -public class GeneralUniformAssignmentBuilder extends AbstractUniformAssignmentBuilder { - private static final Logger LOG = LoggerFactory.getLogger(GeneralUniformAssignmentBuilder.class); +public class UniformHeterogeneousAssignmentBuilder { + private static final Logger LOG = LoggerFactory.getLogger(UniformHeterogeneousAssignmentBuilder.class); /** * The group metadata specification. @@ -113,7 +114,7 @@ public class GeneralUniformAssignmentBuilder extends AbstractUniformAssignmentBu */ private final PartitionMovements partitionMovements; - public GeneralUniformAssignmentBuilder(GroupSpec groupSpec, SubscribedTopicDescriber subscribedTopicDescriber) { + public UniformHeterogeneousAssignmentBuilder(GroupSpec groupSpec, SubscribedTopicDescriber subscribedTopicDescriber) { this.groupSpec = groupSpec; this.subscribedTopicDescriber = subscribedTopicDescriber; this.subscribedTopicIds = new HashSet<>(); @@ -148,8 +149,7 @@ public GeneralUniformAssignmentBuilder(GroupSpec groupSpec, SubscribedTopicDescr *
  • Allocate all the remaining unassigned partitions to the members in a balanced manner.
  • *
  • Iterate through the assignment until it is balanced.
  • */ - @Override - protected GroupAssignment buildAssignment() { + public GroupAssignment build() { if (subscribedTopicIds.isEmpty()) { LOG.info("The subscription list is empty, returning an empty assignment"); return new GroupAssignment(Collections.emptyMap()); @@ -462,6 +462,40 @@ private void processPartitionMovement(TopicIdPartition topicIdPartition, String assignmentManager.addPartitionToTargetAssignment(topicIdPartition, newMember); } + /** + * Adds the topic's partition to the member's target assignment. + */ + private static void addPartitionToAssignment( + Map memberAssignments, + String memberId, + Uuid topicId, + int partition + ) { + memberAssignments.get(memberId) + .partitions() + .computeIfAbsent(topicId, __ -> new HashSet<>()) + .add(partition); + } + + /** + * Constructs a set of {@code TopicIdPartition} including all the given topic Ids based on their partition counts. + * + * @param topicIds Collection of topic Ids. + * @param subscribedTopicDescriber Describer to fetch partition counts for topics. + * + * @return Set of {@code TopicIdPartition} including all the provided topic Ids. + */ + private static Set topicIdPartitions( + Collection topicIds, + SubscribedTopicDescriber subscribedTopicDescriber + ) { + return topicIds.stream() + .flatMap(topic -> IntStream + .range(0, subscribedTopicDescriber.numPartitions(topic)) + .mapToObj(i -> new TopicIdPartition(topic, i)) + ).collect(Collectors.toSet()); + } + /** * This class represents a pair of member Ids involved in a partition reassignment. * Each pair contains a source and a destination member Id. diff --git a/group-coordinator/src/main/java/org/apache/kafka/coordinator/group/assignor/OptimizedUniformAssignmentBuilder.java b/group-coordinator/src/main/java/org/apache/kafka/coordinator/group/assignor/UniformHomogenousAssignmentBuilder.java similarity index 98% rename from group-coordinator/src/main/java/org/apache/kafka/coordinator/group/assignor/OptimizedUniformAssignmentBuilder.java rename to group-coordinator/src/main/java/org/apache/kafka/coordinator/group/assignor/UniformHomogenousAssignmentBuilder.java index 8631b3ce9ae93..88d4858a62707 100644 --- a/group-coordinator/src/main/java/org/apache/kafka/coordinator/group/assignor/OptimizedUniformAssignmentBuilder.java +++ b/group-coordinator/src/main/java/org/apache/kafka/coordinator/group/assignor/UniformHomogenousAssignmentBuilder.java @@ -48,7 +48,7 @@ * The assignment builder prioritizes the properties in the following order: * Balance > Stickiness. */ -public class OptimizedUniformAssignmentBuilder { +public class UniformHomogenousAssignmentBuilder { private static final Class UNMODIFIABLE_MAP_CLASS = Collections.unmodifiableMap(new HashMap<>()).getClass(); private static final Class EMPTY_MAP_CLASS = Collections.emptyMap().getClass(); @@ -104,7 +104,7 @@ private static boolean isImmutableMap(Map map) { */ private int remainingMembersToGetAnExtraPartition; - OptimizedUniformAssignmentBuilder(GroupSpec groupSpec, SubscribedTopicDescriber subscribedTopicDescriber) { + UniformHomogenousAssignmentBuilder(GroupSpec groupSpec, SubscribedTopicDescriber subscribedTopicDescriber) { this.groupSpec = groupSpec; this.subscribedTopicDescriber = subscribedTopicDescriber; this.subscribedTopicIds = new HashSet<>(groupSpec.memberSubscription(groupSpec.memberIds().iterator().next()) diff --git a/group-coordinator/src/test/java/org/apache/kafka/coordinator/group/assignor/GeneralUniformAssignmentBuilderTest.java b/group-coordinator/src/test/java/org/apache/kafka/coordinator/group/assignor/UniformHeterogeneousAssignmentBuilderTest.java similarity index 99% rename from group-coordinator/src/test/java/org/apache/kafka/coordinator/group/assignor/GeneralUniformAssignmentBuilderTest.java rename to group-coordinator/src/test/java/org/apache/kafka/coordinator/group/assignor/UniformHeterogeneousAssignmentBuilderTest.java index d0275f8615a31..4e48de28d4815 100644 --- a/group-coordinator/src/test/java/org/apache/kafka/coordinator/group/assignor/GeneralUniformAssignmentBuilderTest.java +++ b/group-coordinator/src/test/java/org/apache/kafka/coordinator/group/assignor/UniformHeterogeneousAssignmentBuilderTest.java @@ -44,7 +44,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; -public class GeneralUniformAssignmentBuilderTest { +public class UniformHeterogeneousAssignmentBuilderTest { private final UniformAssignor assignor = new UniformAssignor(); private final Uuid topic1Uuid = Uuid.fromString("T1-A4s3VTwiI5CTbEp6POw"); private final Uuid topic2Uuid = Uuid.fromString("T2-B4s3VTwiI5YHbPp6YUe"); From bd5e77112142eb6cef3d5120fe1367b8f2792551 Mon Sep 17 00:00:00 2001 From: David Jacot Date: Thu, 6 Jun 2024 21:45:10 +0200 Subject: [PATCH 2/5] minor refactor --- .../UniformHeterogeneousAssignmentBuilder.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/group-coordinator/src/main/java/org/apache/kafka/coordinator/group/assignor/UniformHeterogeneousAssignmentBuilder.java b/group-coordinator/src/main/java/org/apache/kafka/coordinator/group/assignor/UniformHeterogeneousAssignmentBuilder.java index d355eb58bf663..0238f469ce0e4 100644 --- a/group-coordinator/src/main/java/org/apache/kafka/coordinator/group/assignor/UniformHeterogeneousAssignmentBuilder.java +++ b/group-coordinator/src/main/java/org/apache/kafka/coordinator/group/assignor/UniformHeterogeneousAssignmentBuilder.java @@ -39,7 +39,6 @@ import java.util.Set; import java.util.TreeSet; import java.util.stream.Collectors; -import java.util.stream.IntStream; /** * The Heterogeneous uniform assignment builder is used to generate the target assignment for a consumer group with @@ -134,7 +133,7 @@ public UniformHeterogeneousAssignmentBuilder(GroupSpec groupSpec, SubscribedTopi targetAssignment.put(memberId, new MemberAssignmentImpl(new HashMap<>())); }) ); - this.unassignedPartitions = new HashSet<>(topicIdPartitions(subscribedTopicIds, subscribedTopicDescriber)); + this.unassignedPartitions = topicIdPartitions(subscribedTopicIds, subscribedTopicDescriber); this.assignedStickyPartitions = new HashSet<>(); this.assignmentManager = new AssignmentManager(this.subscribedTopicDescriber); this.sortedMembersByAssignmentSize = assignmentManager.sortMembersByAssignmentSize(groupSpec.memberIds()); @@ -489,11 +488,14 @@ private static Set topicIdPartitions( Collection topicIds, SubscribedTopicDescriber subscribedTopicDescriber ) { - return topicIds.stream() - .flatMap(topic -> IntStream - .range(0, subscribedTopicDescriber.numPartitions(topic)) - .mapToObj(i -> new TopicIdPartition(topic, i)) - ).collect(Collectors.toSet()); + Set topicIdPartitions = new HashSet<>(); + for (Uuid topicId : topicIds) { + int numPartitions = subscribedTopicDescriber.numPartitions(topicId); + for (int partitionId = 0; partitionId < numPartitions; partitionId++) { + topicIdPartitions.add(new TopicIdPartition(topicId, partitionId)); + } + } + return topicIdPartitions; } /** From 09415cf87247949267b2391735aef839a9fecafe Mon Sep 17 00:00:00 2001 From: David Jacot Date: Thu, 6 Jun 2024 21:47:23 +0200 Subject: [PATCH 3/5] typo --- .../group/assignor/UniformHeterogeneousAssignmentBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/group-coordinator/src/main/java/org/apache/kafka/coordinator/group/assignor/UniformHeterogeneousAssignmentBuilder.java b/group-coordinator/src/main/java/org/apache/kafka/coordinator/group/assignor/UniformHeterogeneousAssignmentBuilder.java index 0238f469ce0e4..682dbbd677d00 100644 --- a/group-coordinator/src/main/java/org/apache/kafka/coordinator/group/assignor/UniformHeterogeneousAssignmentBuilder.java +++ b/group-coordinator/src/main/java/org/apache/kafka/coordinator/group/assignor/UniformHeterogeneousAssignmentBuilder.java @@ -41,7 +41,7 @@ import java.util.stream.Collectors; /** - * The Heterogeneous uniform assignment builder is used to generate the target assignment for a consumer group with + * The heterogeneous uniform assignment builder is used to generate the target assignment for a consumer group with * at least one of its members subscribed to a different set of topics. * * Assignments are done according to the following principles: From b23d312b83d395f6aae9481818a9acbf96385b4b Mon Sep 17 00:00:00 2001 From: David Jacot Date: Fri, 7 Jun 2024 13:15:34 +0200 Subject: [PATCH 4/5] address minor comments --- .../kafka/coordinator/group/assignor/UniformAssignor.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/group-coordinator/src/main/java/org/apache/kafka/coordinator/group/assignor/UniformAssignor.java b/group-coordinator/src/main/java/org/apache/kafka/coordinator/group/assignor/UniformAssignor.java index 6cfcc97179ffb..87860e721f424 100644 --- a/group-coordinator/src/main/java/org/apache/kafka/coordinator/group/assignor/UniformAssignor.java +++ b/group-coordinator/src/main/java/org/apache/kafka/coordinator/group/assignor/UniformAssignor.java @@ -35,11 +35,11 @@ * subscriptions across the group members: *
      *
    • - * Optimized Uniform Assignment Builder: This strategy is used when all members have subscribed + * Uniform Homogenous Assignment Builder: This strategy is used when all members have subscribed * to the same set of topics. *
    • *
    • - * General Uniform Assignment Builder: This strategy is used when members have varied topic + * Uniform Heterogeneous Assignment Builder: This strategy is used when members have varied topic * subscriptions. *
    • *
    @@ -76,12 +76,12 @@ public GroupAssignment assign( if (groupSpec.subscriptionType().equals(HOMOGENEOUS)) { LOG.debug("Detected that all members are subscribed to the same set of topics, invoking the " - + "optimized assignment algorithm"); + + "homogenous assignment algorithm"); return new UniformHomogenousAssignmentBuilder(groupSpec, subscribedTopicDescriber) .build(); } else { LOG.debug("Detected that the members are subscribed to different sets of topics, invoking the " - + "general assignment algorithm"); + + "heterogeneous assignment algorithm"); return new UniformHeterogeneousAssignmentBuilder(groupSpec, subscribedTopicDescriber) .build(); } From 11d29a27ad79565cc0ce088c9d3ad750b80986ad Mon Sep 17 00:00:00 2001 From: David Jacot Date: Fri, 7 Jun 2024 15:34:58 +0200 Subject: [PATCH 5/5] fix typo --- .../kafka/coordinator/group/assignor/UniformAssignor.java | 8 ++++---- ...lder.java => UniformHomogeneousAssignmentBuilder.java} | 6 +++--- .../kafka/jmh/assignor/ClientSideAssignorBenchmark.java | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) rename group-coordinator/src/main/java/org/apache/kafka/coordinator/group/assignor/{UniformHomogenousAssignmentBuilder.java => UniformHomogeneousAssignmentBuilder.java} (97%) diff --git a/group-coordinator/src/main/java/org/apache/kafka/coordinator/group/assignor/UniformAssignor.java b/group-coordinator/src/main/java/org/apache/kafka/coordinator/group/assignor/UniformAssignor.java index 87860e721f424..61f7d3aec4049 100644 --- a/group-coordinator/src/main/java/org/apache/kafka/coordinator/group/assignor/UniformAssignor.java +++ b/group-coordinator/src/main/java/org/apache/kafka/coordinator/group/assignor/UniformAssignor.java @@ -35,7 +35,7 @@ * subscriptions across the group members: *
      *
    • - * Uniform Homogenous Assignment Builder: This strategy is used when all members have subscribed + * Uniform Homogeneous Assignment Builder: This strategy is used when all members have subscribed * to the same set of topics. *
    • *
    • @@ -46,7 +46,7 @@ * * The appropriate strategy is automatically chosen based on the current members' topic subscriptions. * - * @see UniformHomogenousAssignmentBuilder + * @see UniformHomogeneousAssignmentBuilder * @see UniformHeterogeneousAssignmentBuilder */ public class UniformAssignor implements ConsumerGroupPartitionAssignor { @@ -76,8 +76,8 @@ public GroupAssignment assign( if (groupSpec.subscriptionType().equals(HOMOGENEOUS)) { LOG.debug("Detected that all members are subscribed to the same set of topics, invoking the " - + "homogenous assignment algorithm"); - return new UniformHomogenousAssignmentBuilder(groupSpec, subscribedTopicDescriber) + + "homogeneous assignment algorithm"); + return new UniformHomogeneousAssignmentBuilder(groupSpec, subscribedTopicDescriber) .build(); } else { LOG.debug("Detected that the members are subscribed to different sets of topics, invoking the " diff --git a/group-coordinator/src/main/java/org/apache/kafka/coordinator/group/assignor/UniformHomogenousAssignmentBuilder.java b/group-coordinator/src/main/java/org/apache/kafka/coordinator/group/assignor/UniformHomogeneousAssignmentBuilder.java similarity index 97% rename from group-coordinator/src/main/java/org/apache/kafka/coordinator/group/assignor/UniformHomogenousAssignmentBuilder.java rename to group-coordinator/src/main/java/org/apache/kafka/coordinator/group/assignor/UniformHomogeneousAssignmentBuilder.java index 88d4858a62707..e69f2a4d82b55 100644 --- a/group-coordinator/src/main/java/org/apache/kafka/coordinator/group/assignor/UniformHomogenousAssignmentBuilder.java +++ b/group-coordinator/src/main/java/org/apache/kafka/coordinator/group/assignor/UniformHomogeneousAssignmentBuilder.java @@ -34,7 +34,7 @@ import java.util.Set; /** - * The homogenous uniform assignment builder is used to generate the target assignment for a consumer group with + * The homogeneous uniform assignment builder is used to generate the target assignment for a consumer group with * all its members subscribed to the same set of topics. * * Assignments are done according to the following principles: @@ -48,7 +48,7 @@ * The assignment builder prioritizes the properties in the following order: * Balance > Stickiness. */ -public class UniformHomogenousAssignmentBuilder { +public class UniformHomogeneousAssignmentBuilder { private static final Class UNMODIFIABLE_MAP_CLASS = Collections.unmodifiableMap(new HashMap<>()).getClass(); private static final Class EMPTY_MAP_CLASS = Collections.emptyMap().getClass(); @@ -104,7 +104,7 @@ private static boolean isImmutableMap(Map map) { */ private int remainingMembersToGetAnExtraPartition; - UniformHomogenousAssignmentBuilder(GroupSpec groupSpec, SubscribedTopicDescriber subscribedTopicDescriber) { + UniformHomogeneousAssignmentBuilder(GroupSpec groupSpec, SubscribedTopicDescriber subscribedTopicDescriber) { this.groupSpec = groupSpec; this.subscribedTopicDescriber = subscribedTopicDescriber; this.subscribedTopicIds = new HashSet<>(groupSpec.memberSubscription(groupSpec.memberIds().iterator().next()) diff --git a/jmh-benchmarks/src/main/java/org/apache/kafka/jmh/assignor/ClientSideAssignorBenchmark.java b/jmh-benchmarks/src/main/java/org/apache/kafka/jmh/assignor/ClientSideAssignorBenchmark.java index 636f2a9e8a7c0..9cee98371a7b8 100644 --- a/jmh-benchmarks/src/main/java/org/apache/kafka/jmh/assignor/ClientSideAssignorBenchmark.java +++ b/jmh-benchmarks/src/main/java/org/apache/kafka/jmh/assignor/ClientSideAssignorBenchmark.java @@ -76,7 +76,7 @@ public ConsumerPartitionAssignor assignor() { /** * The subscription pattern followed by the members of the group. * - * A subscription model is considered homogenous if all the members of the group + * A subscription model is considered homogeneous if all the members of the group * are subscribed to the same set of topics, it is heterogeneous otherwise. */ public enum SubscriptionModel {