diff --git a/group-coordinator/src/main/java/org/apache/kafka/coordinator/group/modern/Assignment.java b/group-coordinator/src/main/java/org/apache/kafka/coordinator/group/modern/Assignment.java index 9338f63a7de4f..5efa3c807fdca 100644 --- a/group-coordinator/src/main/java/org/apache/kafka/coordinator/group/modern/Assignment.java +++ b/group-coordinator/src/main/java/org/apache/kafka/coordinator/group/modern/Assignment.java @@ -42,6 +42,8 @@ public class Assignment implements MemberAssignment { public Assignment( Map> partitions ) { + // Assignments are used as input to assignors, which expect to receive immutable + // assignment maps, otherwise they will be modified in place. this.partitions = Collections.unmodifiableMap(Objects.requireNonNull(partitions)); } diff --git a/group-coordinator/src/test/java/org/apache/kafka/coordinator/group/modern/AssignmentTest.java b/group-coordinator/src/test/java/org/apache/kafka/coordinator/group/modern/AssignmentTest.java index 77ce2601095ca..43e28bbe751a2 100644 --- a/group-coordinator/src/test/java/org/apache/kafka/coordinator/group/modern/AssignmentTest.java +++ b/group-coordinator/src/test/java/org/apache/kafka/coordinator/group/modern/AssignmentTest.java @@ -17,12 +17,14 @@ package org.apache.kafka.coordinator.group.modern; import org.apache.kafka.common.Uuid; +import org.apache.kafka.coordinator.group.assignor.AssignorHelpers; import org.apache.kafka.coordinator.group.generated.ConsumerGroupTargetAssignmentMemberValue; import org.junit.jupiter.api.Test; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -31,6 +33,7 @@ import static org.apache.kafka.coordinator.group.AssignmentTestUtil.mkTopicAssignment; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; public class AssignmentTest { @@ -39,6 +42,16 @@ public void testPartitionsCannotBeNull() { assertThrows(NullPointerException.class, () -> new Assignment(null)); } + @Test + public void testPartitionsImmutable() { + // Assignments are used as input to assignors, which expect to receive immutable + // assignment maps, otherwise they will be modified in place. + Map> partitions = new HashMap<>(); + partitions.put(Uuid.randomUuid(), Set.of(1, 2, 3)); + Assignment assignment = new Assignment(partitions); + assertTrue(AssignorHelpers.isImmutableMap(assignment.partitions())); + } + @Test public void testAttributes() { Map> partitions = mkAssignment(