Skip to content

Commit 26fe84f

Browse files
committed
Use more readable comparator chaining
1 parent a335258 commit 26fe84f

File tree

1 file changed

+13
-48
lines changed

1 file changed

+13
-48
lines changed

helix-core/src/main/java/org/apache/helix/cloud/topology/FaultZoneBasedVirtualGroupAssignmentAlgorithm.java

Lines changed: 13 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -20,20 +20,14 @@
2020
*/
2121

2222
import java.util.ArrayList;
23-
import java.util.Collections;
2423
import java.util.Comparator;
2524
import java.util.HashMap;
2625
import java.util.HashSet;
27-
import java.util.Iterator;
2826
import java.util.List;
2927
import java.util.Map;
3028
import java.util.PriorityQueue;
3129
import java.util.Queue;
3230
import java.util.Set;
33-
import java.util.TreeSet;
34-
import java.util.stream.Collectors;
35-
36-
import org.apache.commons.math3.util.Pair;
3731

3832
import static org.apache.helix.util.VirtualTopologyUtil.computeVirtualGroupId;
3933

@@ -128,35 +122,23 @@ private void distributeUnassignedZones(
128122

129123
// Priority queue sorted by current load of the virtual group
130124
// We always assign new zones to the group with the smallest load to keep them balanced.
131-
Queue<String> minHeap = new PriorityQueue<>((o1, o2) -> {
132-
int load1 = computeGroupLoad(virtualGroupToZoneMapping, o1, zoneMapping);
133-
int load2 = computeGroupLoad(virtualGroupToZoneMapping, o2, zoneMapping);
134-
135-
int loadDiff = Integer.compare(load1, load2);
136-
137-
// If the loads are not equal, return the difference
138-
if (loadDiff != 0) {
139-
return loadDiff;
140-
}
141-
142-
// When loads are equal, sort by group name to ensure consistent ordering
143-
return o1.compareTo(o2);
144-
});
125+
// If loads are equal, sort by zone name to ensure consistent ordering
126+
Queue<String> minHeap = new PriorityQueue<>(
127+
Comparator.<String>comparingInt(vg ->
128+
virtualGroupToZoneMapping.get(vg).stream()
129+
.map(zoneMapping::get)
130+
.mapToInt(Set::size)
131+
.sum()
132+
).thenComparing(String::compareTo)
133+
);
145134
// Seed the min-heap with existing groups
146135
minHeap.addAll(virtualGroupToZoneMapping.keySet());
147136

148137
// Sort unassigned zones by descending number of unassigned instances, assigning "heavier" zones first.
149-
unassignedZones.sort((o1, o2) -> {
150-
int zone1Size = zoneMapping.get(o1).size();
151-
int zone2Size = zoneMapping.get(o2).size();
152-
153-
if (zone1Size != zone2Size) {
154-
return Integer.compare(zone2Size, zone1Size); // Sort by size descending
155-
}
156-
157-
// If sizes are equal, sort by zone name to ensure consistent ordering
158-
return o1.compareTo(o2);
159-
});
138+
// If sizes are equal, sort by zone name to ensure consistent ordering
139+
unassignedZones.sort(Comparator.<String>comparingInt(zone -> zoneMapping.get(zone).size())
140+
.reversed()
141+
.thenComparing(String::compareTo));
160142

161143
// Assign each zone to the least-loaded group
162144
for (String zone : unassignedZones) {
@@ -185,21 +167,4 @@ private Map<String, Set<String>> constructResult(Map<String, Set<String>> vgToZo
185167
}
186168
return result;
187169
}
188-
189-
/**
190-
* Computes the load of a virtual group based on the number of instances across all zones in that group.
191-
*
192-
* @param virtualGroupToZoneMapping Mapping of virtual group -> set of zones.
193-
* @param group The virtual group for which to compute the load.
194-
* @param zoneMapping Mapping of zone -> set of instances.
195-
* @return The total number of instances across all zones in the specified virtual group.
196-
*/
197-
private int computeGroupLoad(
198-
Map<String, Set<String>> virtualGroupToZoneMapping, String group,
199-
Map<String, Set<String>> zoneMapping) {
200-
// The load of a group is defined as the total number of instances across all zones in that group.
201-
return virtualGroupToZoneMapping.getOrDefault(group, Collections.emptySet()).stream()
202-
.mapToInt(zone -> zoneMapping.getOrDefault(zone, Collections.emptySet()).size())
203-
.sum();
204-
}
205170
}

0 commit comments

Comments
 (0)