lucasbru commented on code in PR #20486:
URL: https://github.com/apache/kafka/pull/20486#discussion_r2324756475


##########
group-coordinator/src/main/java/org/apache/kafka/coordinator/group/streams/assignor/StickyTaskAssignor.java:
##########
@@ -296,9 +302,13 @@ private boolean hasUnfulfilledQuota(final Member member) {
         return 
localState.processIdToState.get(member.processId).memberToTaskCounts().get(member.memberId)
 < localState.tasksPerMember;
     }
 
-    private void assignStandby(final Set<TaskId> standbyTasks, final int 
numStandbyReplicas) {
+    private void assignStandby(final LinkedList<TaskId> standbyTasks, int 
numStandbyReplicas) {
         final ArrayList<StandbyToAssign> toLeastLoaded = new 
ArrayList<>(standbyTasks.size() * numStandbyReplicas);
-        for (final TaskId task : standbyTasks) {
+
+        // Assuming our current assignment is range-based, we want to sort by 
partition first.
+        
standbyTasks.sort(Comparator.comparing(TaskId::partition).thenComparing(TaskId::subtopologyId).reversed());

Review Comment:
   We want to assign standby tasks in reverse.
   
   The reason why we want to traverse standby tasks in reverse is the example 
that I added in the unit tests of both LegacyStickTaskAssignor and the new 
StickyTaskAssignor.
   
   Assume we have
   Node 1: Active task 0,1, Standby task 2,3
   Node 2: Active task 2,3, Standby task 0,1
   Node 3: - (new)
   
   Then we don't want to assign active tasks and standby tasks in the same 
order.
   Suppose we try to assign active tasks in increasing order, we will get:
   
   Node 1: Active task 0,1
   Node 2: Active task 2
   Node 3: Active task 3
   
   Since task 3 is the last task we will assign, and at that point, the quota 
for active tasks is 1, so it can only be assigned to Node 3.
   
   Suppose now we assign standby tasks in the same order, we will get this:
   
   Node 1: Active task 0,1, Standby task 2, 3
   Node 2: Active task 2, Standby task 0, 1
   Node 3: Active task 3
   
   The reason is that we first assign tasks 0,1,2, which all can be assigned to 
the previous member that owned it. Finally, we want to assign standby task 3, 
but it cannot be assigned to Node 3, so we have to assign it to Node 1 or Node 
2. Using reverse order means, when I have new nodes, they will get the 
numerically last few active tasks, and the numerically first standby tasks, 
which should avoid this problem.



-- 
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