@@ -10239,6 +10239,10 @@ memberId2, new MemberAssignmentImpl(mkAssignment(
10239
10239
10240
10240
// Create the new consumer group with member 1.
10241
10241
GroupCoordinatorRecordHelpers.newConsumerGroupMemberSubscriptionRecord(groupId, expectedMember1),
10242
+ GroupCoordinatorRecordHelpers.newConsumerGroupSubscriptionMetadataRecord(groupId, Map.of(
10243
+ fooTopicName, new TopicMetadata(fooTopicId, fooTopicName, 1),
10244
+ barTopicName, new TopicMetadata(barTopicId, barTopicName, 1)
10245
+ )),
10242
10246
GroupCoordinatorRecordHelpers.newConsumerGroupEpochRecord(groupId, 0, 0),
10243
10247
GroupCoordinatorRecordHelpers.newConsumerGroupTargetAssignmentRecord(groupId, memberId1, expectedMember1.assignedPartitions()),
10244
10248
GroupCoordinatorRecordHelpers.newConsumerGroupTargetAssignmentEpochRecord(groupId, 0),
@@ -10247,12 +10251,6 @@ memberId2, new MemberAssignmentImpl(mkAssignment(
10247
10251
// Member 2 joins the new consumer group.
10248
10252
GroupCoordinatorRecordHelpers.newConsumerGroupMemberSubscriptionRecord(groupId, expectedMember2),
10249
10253
10250
- // The subscription metadata hasn't been updated during the conversion, so a new one is computed.
10251
- GroupCoordinatorRecordHelpers.newConsumerGroupSubscriptionMetadataRecord(groupId, Map.of(
10252
- fooTopicName, new TopicMetadata(fooTopicId, fooTopicName, 1),
10253
- barTopicName, new TopicMetadata(barTopicId, barTopicName, 1)
10254
- )),
10255
-
10256
10254
// Newly joining member 2 bumps the group epoch. A new target assignment is computed.
10257
10255
GroupCoordinatorRecordHelpers.newConsumerGroupEpochRecord(groupId, 1, 0),
10258
10256
GroupCoordinatorRecordHelpers.newConsumerGroupTargetAssignmentRecord(groupId, memberId2, assignor.targetPartitions(memberId2)),
@@ -10454,6 +10452,11 @@ memberId3, new MemberAssignmentImpl(mkAssignment(
10454
10452
GroupCoordinatorRecordHelpers.newConsumerGroupMemberSubscriptionRecord(groupId, expectedMember1),
10455
10453
GroupCoordinatorRecordHelpers.newConsumerGroupMemberSubscriptionRecord(groupId, expectedMember2),
10456
10454
10455
+ GroupCoordinatorRecordHelpers.newConsumerGroupSubscriptionMetadataRecord(groupId, Map.of(
10456
+ fooTopicName, new TopicMetadata(fooTopicId, fooTopicName, 2),
10457
+ barTopicName, new TopicMetadata(barTopicId, barTopicName, 1)
10458
+ )),
10459
+
10457
10460
GroupCoordinatorRecordHelpers.newConsumerGroupEpochRecord(groupId, 0, 0),
10458
10461
GroupCoordinatorRecordHelpers.newConsumerGroupTargetAssignmentRecord(groupId, memberId1, expectedMember1.assignedPartitions()),
10459
10462
GroupCoordinatorRecordHelpers.newConsumerGroupTargetAssignmentRecord(groupId, memberId2, expectedMember2.assignedPartitions()),
@@ -10466,12 +10469,6 @@ memberId3, new MemberAssignmentImpl(mkAssignment(
10466
10469
// Member 3 joins the new consumer group.
10467
10470
GroupCoordinatorRecordHelpers.newConsumerGroupMemberSubscriptionRecord(groupId, expectedMember3),
10468
10471
10469
- // The subscription metadata hasn't been updated during the conversion, so a new one is computed.
10470
- GroupCoordinatorRecordHelpers.newConsumerGroupSubscriptionMetadataRecord(groupId, Map.of(
10471
- fooTopicName, new TopicMetadata(fooTopicId, fooTopicName, 2),
10472
- barTopicName, new TopicMetadata(barTopicId, barTopicName, 1)
10473
- )),
10474
-
10475
10472
// Newly joining member 3 bumps the group epoch. A new target assignment is computed.
10476
10473
GroupCoordinatorRecordHelpers.newConsumerGroupEpochRecord(groupId, 1, 0),
10477
10474
GroupCoordinatorRecordHelpers.newConsumerGroupTargetAssignmentRecord(groupId, memberId1, assignor.targetPartitions(memberId1)),
@@ -10659,7 +10656,7 @@ public void testConsumerGroupHeartbeatToClassicGroupFromExistingStaticMember() {
10659
10656
);
10660
10657
10661
10658
group.transitionTo(PREPARING_REBALANCE);
10662
- group.transitionTo(COMPLETING_REBALANCE );
10659
+ group.initNextGeneration( );
10663
10660
group.transitionTo(STABLE);
10664
10661
10665
10662
context.replay(GroupCoordinatorRecordHelpers.newGroupMetadataRecord(group, assignments));
@@ -10681,8 +10678,8 @@ public void testConsumerGroupHeartbeatToClassicGroupFromExistingStaticMember() {
10681
10678
10682
10679
ConsumerGroupMember expectedClassicMember = new ConsumerGroupMember.Builder(memberId)
10683
10680
.setInstanceId(instanceId)
10684
- .setMemberEpoch(0 )
10685
- .setPreviousMemberEpoch(0 )
10681
+ .setMemberEpoch(group.generationId() )
10682
+ .setPreviousMemberEpoch(group.generationId() )
10686
10683
.setClientId(DEFAULT_CLIENT_ID)
10687
10684
.setClientHost(DEFAULT_CLIENT_ADDRESS.toString())
10688
10685
.setSubscribedTopicNames(List.of(fooTopicName))
@@ -10718,7 +10715,7 @@ public void testConsumerGroupHeartbeatToClassicGroupFromExistingStaticMember() {
10718
10715
.build();
10719
10716
10720
10717
ConsumerGroupMember expectedFinalConsumerMember = new ConsumerGroupMember.Builder(expectedReplacingConsumerMember)
10721
- .setMemberEpoch(1 )
10718
+ .setMemberEpoch(group.generationId() )
10722
10719
.setServerAssignorName(NoOpPartitionAssignor.NAME)
10723
10720
.setRebalanceTimeoutMs(5000)
10724
10721
.setClassicMemberMetadata(null)
@@ -10730,9 +10727,10 @@ public void testConsumerGroupHeartbeatToClassicGroupFromExistingStaticMember() {
10730
10727
10731
10728
// Create the new consumer group with the static member.
10732
10729
GroupCoordinatorRecordHelpers.newConsumerGroupMemberSubscriptionRecord(groupId, expectedClassicMember),
10733
- GroupCoordinatorRecordHelpers.newConsumerGroupEpochRecord(groupId, 0, 0),
10730
+ GroupCoordinatorRecordHelpers.newConsumerGroupSubscriptionMetadataRecord(groupId, Map.of(fooTopicName, new TopicMetadata(fooTopicId, fooTopicName, 1))),
10731
+ GroupCoordinatorRecordHelpers.newConsumerGroupEpochRecord(groupId, group.generationId(), 0),
10734
10732
GroupCoordinatorRecordHelpers.newConsumerGroupTargetAssignmentRecord(groupId, memberId, expectedClassicMember.assignedPartitions()),
10735
- GroupCoordinatorRecordHelpers.newConsumerGroupTargetAssignmentEpochRecord(groupId, 0 ),
10733
+ GroupCoordinatorRecordHelpers.newConsumerGroupTargetAssignmentEpochRecord(groupId, group.generationId() ),
10736
10734
GroupCoordinatorRecordHelpers.newConsumerGroupCurrentAssignmentRecord(groupId, expectedClassicMember),
10737
10735
10738
10736
// Remove the static member because the rejoining member replaces it.
@@ -10745,17 +10743,10 @@ public void testConsumerGroupHeartbeatToClassicGroupFromExistingStaticMember() {
10745
10743
GroupCoordinatorRecordHelpers.newConsumerGroupTargetAssignmentRecord(groupId, newMemberId, mkAssignment(mkTopicAssignment(fooTopicId, 0))),
10746
10744
GroupCoordinatorRecordHelpers.newConsumerGroupCurrentAssignmentRecord(groupId, expectedReplacingConsumerMember),
10747
10745
10748
- // The static member rejoins the new consumer group.
10746
+ // The static member rejoins the new consumer group with the same instance id and
10747
+ // takes the assignment of the previous member. No new target assignment is computed.
10749
10748
GroupCoordinatorRecordHelpers.newConsumerGroupMemberSubscriptionRecord(groupId, expectedFinalConsumerMember),
10750
10749
10751
- // The subscription metadata hasn't been updated during the conversion, so a new one is computed.
10752
- GroupCoordinatorRecordHelpers.newConsumerGroupSubscriptionMetadataRecord(groupId, Map.of(fooTopicName, new TopicMetadata(fooTopicId, fooTopicName, 1))),
10753
-
10754
- // Newly joining static member bumps the group epoch. A new target assignment is computed.
10755
- GroupCoordinatorRecordHelpers.newConsumerGroupEpochRecord(groupId, 1, 0),
10756
- GroupCoordinatorRecordHelpers.newConsumerGroupTargetAssignmentRecord(groupId, newMemberId, mkAssignment(mkTopicAssignment(fooTopicId, 0))),
10757
- GroupCoordinatorRecordHelpers.newConsumerGroupTargetAssignmentEpochRecord(groupId, 1),
10758
-
10759
10750
// The newly created static member takes the assignment from the existing member.
10760
10751
// Bump its member epoch and transition to STABLE.
10761
10752
GroupCoordinatorRecordHelpers.newConsumerGroupCurrentAssignmentRecord(groupId, expectedFinalConsumerMember)
@@ -10856,6 +10847,10 @@ public void testConsumerGroupHeartbeatToClassicGroupWithEmptyAssignmentMember()
10856
10847
10857
10848
// Create the new consumer group with member 1.
10858
10849
GroupCoordinatorRecordHelpers.newConsumerGroupMemberSubscriptionRecord(groupId, expectedMember1),
10850
+ GroupCoordinatorRecordHelpers.newConsumerGroupSubscriptionMetadataRecord(groupId, Map.of(
10851
+ fooTopicName, new TopicMetadata(fooTopicId, fooTopicName, 1),
10852
+ barTopicName, new TopicMetadata(barTopicId, barTopicName, 1)
10853
+ )),
10859
10854
GroupCoordinatorRecordHelpers.newConsumerGroupEpochRecord(groupId, 1, 0),
10860
10855
GroupCoordinatorRecordHelpers.newConsumerGroupTargetAssignmentRecord(groupId, memberId1, expectedMember1.assignedPartitions()),
10861
10856
GroupCoordinatorRecordHelpers.newConsumerGroupTargetAssignmentEpochRecord(groupId, 1),
@@ -10864,12 +10859,6 @@ public void testConsumerGroupHeartbeatToClassicGroupWithEmptyAssignmentMember()
10864
10859
// Member 2 joins the new consumer group.
10865
10860
GroupCoordinatorRecordHelpers.newConsumerGroupMemberSubscriptionRecord(groupId, expectedMember2),
10866
10861
10867
- // The subscription metadata hasn't been updated during the conversion, so a new one is computed.
10868
- GroupCoordinatorRecordHelpers.newConsumerGroupSubscriptionMetadataRecord(groupId, Map.of(
10869
- fooTopicName, new TopicMetadata(fooTopicId, fooTopicName, 1),
10870
- barTopicName, new TopicMetadata(barTopicId, barTopicName, 1)
10871
- )),
10872
-
10873
10862
// Newly joining member 2 bumps the group epoch. A new target assignment is computed.
10874
10863
GroupCoordinatorRecordHelpers.newConsumerGroupEpochRecord(groupId, 2, 0),
10875
10864
GroupCoordinatorRecordHelpers.newConsumerGroupTargetAssignmentRecord(groupId, memberId2, Map.of()),
@@ -11241,6 +11230,11 @@ memberId3, new MemberAssignmentImpl(mkAssignment(
11241
11230
GroupCoordinatorRecordHelpers.newConsumerGroupMemberSubscriptionRecord(groupId, expectedMember1),
11242
11231
GroupCoordinatorRecordHelpers.newConsumerGroupMemberSubscriptionRecord(groupId, expectedMember2),
11243
11232
11233
+ GroupCoordinatorRecordHelpers.newConsumerGroupSubscriptionMetadataRecord(groupId, Map.of(
11234
+ fooTopicName, new TopicMetadata(fooTopicId, fooTopicName, 2),
11235
+ barTopicName, new TopicMetadata(barTopicId, barTopicName, 1)
11236
+ )),
11237
+
11244
11238
GroupCoordinatorRecordHelpers.newConsumerGroupEpochRecord(groupId, 1, 0),
11245
11239
GroupCoordinatorRecordHelpers.newConsumerGroupTargetAssignmentRecord(groupId, memberId1, expectedMember1.assignedPartitions()),
11246
11240
GroupCoordinatorRecordHelpers.newConsumerGroupTargetAssignmentRecord(groupId, memberId2, expectedMember2.assignedPartitions()),
@@ -11253,12 +11247,6 @@ memberId3, new MemberAssignmentImpl(mkAssignment(
11253
11247
// Member 3 joins the new consumer group.
11254
11248
GroupCoordinatorRecordHelpers.newConsumerGroupMemberSubscriptionRecord(groupId, expectedMember3),
11255
11249
11256
- // The subscription metadata hasn't been updated during the conversion, so a new one is computed.
11257
- GroupCoordinatorRecordHelpers.newConsumerGroupSubscriptionMetadataRecord(groupId, Map.of(
11258
- fooTopicName, new TopicMetadata(fooTopicId, fooTopicName, 2),
11259
- barTopicName, new TopicMetadata(barTopicId, barTopicName, 1)
11260
- )),
11261
-
11262
11250
// Newly joining member 3 bumps the group epoch. A new target assignment is computed.
11263
11251
GroupCoordinatorRecordHelpers.newConsumerGroupEpochRecord(groupId, 2, 0),
11264
11252
GroupCoordinatorRecordHelpers.newConsumerGroupTargetAssignmentRecord(groupId, memberId1, assignor.targetPartitions(memberId1)),
0 commit comments