From 2b420a3877996b1c77c22e88cf0cb60228837d29 Mon Sep 17 00:00:00 2001 From: Meet Jain <56895638+meetjain74@users.noreply.github.com> Date: Mon, 25 May 2026 14:45:54 +0530 Subject: [PATCH] Add secondary and tertiary sort for hosts in Isolation Scheduler --- .../storm/scheduler/IsolationScheduler.java | 31 +++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/storm-server/src/main/java/org/apache/storm/scheduler/IsolationScheduler.java b/storm-server/src/main/java/org/apache/storm/scheduler/IsolationScheduler.java index 2ebd4bd89c..4aad446771 100644 --- a/storm-server/src/main/java/org/apache/storm/scheduler/IsolationScheduler.java +++ b/storm-server/src/main/java/org/apache/storm/scheduler/IsolationScheduler.java @@ -303,7 +303,12 @@ private Map> hostToUsedSlots(Cluster cluster) { return hostUsedSlots; } - // returns list of list of slots, reverse sorted by number of slots + // Returns list of hosts with their assignable slots, sorted by: + // 1. (primary) total assignable slots, descending — same as before + // 2. (secondary) currently free slots, descending — prefer hosts that + // need fewer evictions + // 3. (tertiary) host name, ascending — deterministic order + // for testability private LinkedList hostAssignableSlots(Cluster cluster) { List assignableSlots = cluster.getAssignableSlots(); Map> hostAssignableSlots = new HashMap>(); @@ -316,6 +321,16 @@ private LinkedList hostAssignableSlots(Cluster cluster) { } slots.add(slot); } + + final Map hostFreeSlotCount = new HashMap(); + for (WorkerSlot slot : cluster.getAvailableSlots()) { + String host = cluster.getHost(slot.getNodeId()); + if (hostAssignableSlots.containsKey(host)) { + Integer count = hostFreeSlotCount.get(host); + hostFreeSlotCount.put(host, (count == null ? 0 : count) + 1); + } + } + List sortHostAssignSlots = new ArrayList(); for (Map.Entry> entry : hostAssignableSlots.entrySet()) { sortHostAssignSlots.add(new HostAssignableSlots(entry.getKey(), entry.getValue())); @@ -323,7 +338,19 @@ private LinkedList hostAssignableSlots(Cluster cluster) { Collections.sort(sortHostAssignSlots, new Comparator() { @Override public int compare(HostAssignableSlots o1, HostAssignableSlots o2) { - return o2.getWorkerSlots().size() - o1.getWorkerSlots().size(); + int bySlots = o2.getWorkerSlots().size() - o1.getWorkerSlots().size(); + if (bySlots != 0) { + return bySlots; + } + int free1 = hostFreeSlotCount.containsKey(o1.getHostName()) + ? hostFreeSlotCount.get(o1.getHostName()) : 0; + int free2 = hostFreeSlotCount.containsKey(o2.getHostName()) + ? hostFreeSlotCount.get(o2.getHostName()) : 0; + int byFree = free2 - free1; + if (byFree != 0) { + return byFree; + } + return o1.getHostName().compareTo(o2.getHostName()); } });