frankvicky commented on code in PR #17549:
URL: https://github.com/apache/kafka/pull/17549#discussion_r1809943339


##########
group-coordinator/src/test/java/org/apache/kafka/coordinator/group/GroupMetadataManagerTest.java:
##########
@@ -10225,53 +10251,61 @@ public void 
testConsumerGroupHeartbeatToClassicGroupFromExistingStaticMember() {
             .setClassicMemberMetadata(null)
             .build();
 
-        List<CoordinatorRecord> expectedRecords = Arrays.asList(
-            // The existing classic group tombstone.
-            
GroupCoordinatorRecordHelpers.newGroupMetadataTombstoneRecord(groupId),
-
-            // Create the new consumer group with the static member.
-            
GroupCoordinatorRecordHelpers.newConsumerGroupMemberSubscriptionRecord(groupId, 
expectedClassicMember),
-            GroupCoordinatorRecordHelpers.newConsumerGroupEpochRecord(groupId, 
0),
-            
GroupCoordinatorRecordHelpers.newConsumerGroupTargetAssignmentRecord(groupId, 
memberId, expectedClassicMember.assignedPartitions()),
-            
GroupCoordinatorRecordHelpers.newConsumerGroupTargetAssignmentEpochRecord(groupId,
 0),
-            
GroupCoordinatorRecordHelpers.newConsumerGroupCurrentAssignmentRecord(groupId, 
expectedClassicMember),
-
-            // Remove the static member because the rejoining member replaces 
it.
-            
GroupCoordinatorRecordHelpers.newConsumerGroupCurrentAssignmentTombstoneRecord(groupId,
 memberId),
-            
GroupCoordinatorRecordHelpers.newConsumerGroupTargetAssignmentTombstoneRecord(groupId,
 memberId),
-            
GroupCoordinatorRecordHelpers.newConsumerGroupMemberSubscriptionTombstoneRecord(groupId,
 memberId),
-
-            // Create the new static member.
-            
GroupCoordinatorRecordHelpers.newConsumerGroupMemberSubscriptionRecord(groupId, 
expectedReplacingConsumerMember),
-            
GroupCoordinatorRecordHelpers.newConsumerGroupTargetAssignmentRecord(groupId, 
newMemberId, mkAssignment(mkTopicAssignment(fooTopicId, 0))),
-            
GroupCoordinatorRecordHelpers.newConsumerGroupCurrentAssignmentRecord(groupId, 
expectedReplacingConsumerMember),
-
-            // The static member rejoins the new consumer group.
-            
GroupCoordinatorRecordHelpers.newConsumerGroupMemberSubscriptionRecord(groupId, 
expectedFinalConsumerMember),
-
-            // The subscription metadata hasn't been updated during the 
conversion, so a new one is computed.
-            
GroupCoordinatorRecordHelpers.newConsumerGroupSubscriptionMetadataRecord(groupId,
 new HashMap<String, TopicMetadata>() {
-                {
-                    put(fooTopicName, new TopicMetadata(fooTopicId, 
fooTopicName, 1));
-                }
-            }),
+        List<CoordinatorRecord> expectedRecords = new ArrayList<>();
+        // The existing classic group tombstone.
+        
expectedRecords.add(GroupCoordinatorRecordHelpers.newGroupMetadataTombstoneRecord(groupId));
+
+        // Create the new consumer group with the static member.
+        
expectedRecords.add(GroupCoordinatorRecordHelpers.newConsumerGroupMemberSubscriptionRecord(groupId,
 expectedClassicMember));
+        
expectedRecords.add(GroupCoordinatorRecordHelpers.newConsumerGroupEpochRecord(groupId,
 0));
+        
expectedRecords.add(GroupCoordinatorRecordHelpers.newConsumerGroupTargetAssignmentRecord(groupId,
 memberId,
+            expectedClassicMember.assignedPartitions()));
+        
expectedRecords.add(GroupCoordinatorRecordHelpers.newConsumerGroupTargetAssignmentEpochRecord(groupId,
 0));
+        
expectedRecords.add(GroupCoordinatorRecordHelpers.newConsumerGroupCurrentAssignmentRecord(groupId,
 expectedClassicMember));
+
+        // Remove the static member because the rejoining member replaces it.
+        
expectedRecords.add(GroupCoordinatorRecordHelpers.newConsumerGroupCurrentAssignmentTombstoneRecord(groupId,
 memberId));
+        
expectedRecords.add(GroupCoordinatorRecordHelpers.newConsumerGroupTargetAssignmentTombstoneRecord(groupId,
 memberId));
+        
expectedRecords.add(GroupCoordinatorRecordHelpers.newConsumerGroupMemberSubscriptionTombstoneRecord(groupId,
 memberId));
+
+        // Create the new static member.
+        
expectedRecords.add(GroupCoordinatorRecordHelpers.newConsumerGroupMemberSubscriptionRecord(groupId,
 expectedReplacingConsumerMember));
+        
expectedRecords.add(GroupCoordinatorRecordHelpers.newConsumerGroupTargetAssignmentRecord(groupId,
 newMemberId,
+            mkAssignment(mkTopicAssignment(fooTopicId, 0))));
+        
expectedRecords.add(GroupCoordinatorRecordHelpers.newConsumerGroupCurrentAssignmentRecord(groupId,
 expectedReplacingConsumerMember));
+
+        // The static member rejoins the new consumer group.
+        
expectedRecords.add(GroupCoordinatorRecordHelpers.newConsumerGroupMemberSubscriptionRecord(groupId,
 expectedFinalConsumerMember));
+
+        // The subscription metadata hasn't been updated during the 
conversion, so a new one is computed.
+        
expectedRecords.add(GroupCoordinatorRecordHelpers.newConsumerGroupSubscriptionMetadataRecord(groupId,
+            Map.of(fooTopicName, new TopicMetadata(fooTopicId, fooTopicName, 
1))));
+
+        // Newly joining static member bumps the group epoch. A new target 
assignment is computed.
+        
expectedRecords.add(GroupCoordinatorRecordHelpers.newConsumerGroupEpochRecord(groupId,
 1));
+
+        // If the memberId is generated by the consumer itself, the consumer 
should retain this memberId.
+        // As a result, the record won't contain a new target assignment 
record.
+        // If the memberId is not consumer-generated, add a new target 
assignment record to the expected records,
+        // since a different memberId will be considered as a new member.
+        if (!isConsumerGeneratedMemberId) {
+            
expectedRecords.add(GroupCoordinatorRecordHelpers.newConsumerGroupTargetAssignmentRecord(groupId,
 newMemberId,
+                mkAssignment(mkTopicAssignment(fooTopicId, 0))));
+        }

Review Comment:
   Got it. 
   I will try to simulate this behavior and update the test case accordingly.👍🏼 



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to