[ https://issues.apache.org/jira/browse/KAFKA-14386?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Andrew Grant resolved KAFKA-14386. ---------------------------------- Resolution: Fixed > Change ReplicaPlacer place method to return a class instead of list of list > of integers > --------------------------------------------------------------------------------------- > > Key: KAFKA-14386 > URL: https://issues.apache.org/jira/browse/KAFKA-14386 > Project: Kafka > Issue Type: Improvement > Reporter: Andrew Grant > Assignee: Andrew Grant > Priority: Major > > In KRaft mode, a new interface was introduced, > [ReplicaPlacer|https://github.com/apache/kafka/blob/trunk/metadata/src/main/java/org/apache/kafka/metadata/placement/ReplicaPlacer.java], > that is used by ReplicationControlManager to create partition assignments > during both CreateTopics and CreatePartitions RPCs. Right now it has one > implementation, StripedReplicaPlacer. > Currently, it has a method called place that returns a list of list of > integers: > {code:java} > List<List<Integer>> place( > PlacementSpec placement, > ClusterDescriber cluster > ) throws InvalidReplicationFactorException;{code} > The index corresponds to the partition ID and the integers are the replicas > of the assignment. The suggestion is to update the interface so that it > models topic and partitions more explicitly. I'm thinking something like: > {code:java} > TopicAssignment place( > PlacementSpec placement, > ClusterDescriber cluster > ) throws InvalidReplicationFactorException;{code} > where we have > {code:java} > public class TopicAssignment { > private List<PartitionAssignment> assignments; > public TopicAssignment(List<PartitionAssignment> assignments) { > this.assignments = assignments; > } > public List<PartitionAssignment> assignments() { > return assignments; > } > }{code} > and > {code:java} > public class PartitionAssignment { > private List<Integer> replicas; > public PartitionAssignment(List<Integer> replicas) { > this.replicas = replicas; > } > public List<Integer> replicas() { > return replicas; > } > }{code} > There are two reasons for the suggestion. First, as mentioned above, it will > make the interface, arguably, a bit more readable and understandable by > explicitly modeling the idea of topic and partition. Second and more > importantly, it makes the interface more extendable in the future. Right now > it would be challenging to add more metadata to the response. By having > classes, we can easily add fields to them without breaking/changing the > interface. For example, in the CreatePartitions RPC we are adding partitions > to an existing topic and we might want to add some metadata to response > making it clear which partition the assignment starts at which could look > something like: > {code:java} > public class TopicAssignment { > private List<PartitionAssignment> assignments; > private Integer firstPartitionId; > > public TopicAssignment(List<PartitionAssignment> assignments, Integer > firstPartitionId) { > this.assignments = assignments; > this.firstPartitionId = firstPartitionId; > } > public List<PartitionAssignment> assignments() { > return assignments; > } > ... > } > {code} > > Curious to hear other folks thoughts on this. -- This message was sent by Atlassian Jira (v8.20.10#820010)