@@ -312,6 +312,7 @@ private Map<String, Set<WorkerSlot>> hostToUsedSlots(Cluster cluster) {
312312 private LinkedList <HostAssignableSlots > hostAssignableSlots (Cluster cluster ) {
313313 List <WorkerSlot > assignableSlots = cluster .getAssignableSlots ();
314314 Map <String , List <WorkerSlot >> hostAssignableSlots = new HashMap <String , List <WorkerSlot >>();
315+ Map <String , Integer > hostFreeSlotCounts = new HashMap <String , Integer >();
315316 for (WorkerSlot slot : assignableSlots ) {
316317 String host = cluster .getHost (slot .getNodeId ());
317318 List <WorkerSlot > slots = hostAssignableSlots .get (host );
@@ -320,20 +321,16 @@ private LinkedList<HostAssignableSlots> hostAssignableSlots(Cluster cluster) {
320321 hostAssignableSlots .put (host , slots );
321322 }
322323 slots .add (slot );
323- }
324-
325- final Map <String , Integer > hostFreeSlotCount = new HashMap <String , Integer >();
326- for (WorkerSlot slot : cluster .getAvailableSlots ()) {
327- String host = cluster .getHost (slot .getNodeId ());
328- if (hostAssignableSlots .containsKey (host )) {
329- Integer count = hostFreeSlotCount .get (host );
330- hostFreeSlotCount .put (host , (count == null ? 0 : count ) + 1 );
324+ if (!cluster .isSlotOccupied (slot )) {
325+ Integer count = hostFreeSlotCounts .get (host );
326+ hostFreeSlotCounts .put (host , count == null ? 1 : count + 1 );
331327 }
332328 }
333-
334329 List <HostAssignableSlots > sortHostAssignSlots = new ArrayList <HostAssignableSlots >();
335330 for (Map .Entry <String , List <WorkerSlot >> entry : hostAssignableSlots .entrySet ()) {
336- sortHostAssignSlots .add (new HostAssignableSlots (entry .getKey (), entry .getValue ()));
331+ Integer free = hostFreeSlotCounts .get (entry .getKey ());
332+ sortHostAssignSlots .add (new HostAssignableSlots (entry .getKey (), entry .getValue (),
333+ free != null ? free .intValue () : 0 ));
337334 }
338335 Collections .sort (sortHostAssignSlots , new Comparator <HostAssignableSlots >() {
339336 @ Override
@@ -342,14 +339,12 @@ public int compare(HostAssignableSlots o1, HostAssignableSlots o2) {
342339 if (bySlots != 0 ) {
343340 return bySlots ;
344341 }
345- int free1 = hostFreeSlotCount .containsKey (o1 .getHostName ())
346- ? hostFreeSlotCount .get (o1 .getHostName ()) : 0 ;
347- int free2 = hostFreeSlotCount .containsKey (o2 .getHostName ())
348- ? hostFreeSlotCount .get (o2 .getHostName ()) : 0 ;
349- int byFree = free2 - free1 ;
342+
343+ int byFree = o2 .getFreeSlots () - o1 .getFreeSlots ();
350344 if (byFree != 0 ) {
351345 return byFree ;
352346 }
347+
353348 return o1 .getHostName ().compareTo (o2 .getHostName ());
354349 }
355350 });
@@ -427,10 +422,12 @@ public Set<ExecutorDetails> getExecutors() {
427422 class HostAssignableSlots {
428423 private String hostName ;
429424 private List <WorkerSlot > workerSlots ;
425+ private final int freeSlots ;
430426
431- HostAssignableSlots (String hostName , List <WorkerSlot > workerSlots ) {
427+ HostAssignableSlots (String hostName , List <WorkerSlot > workerSlots , int freeSlots ) {
432428 this .hostName = hostName ;
433429 this .workerSlots = workerSlots ;
430+ this .freeSlots = freeSlots ;
434431 }
435432
436433 public String getHostName () {
@@ -441,5 +438,9 @@ public List<WorkerSlot> getWorkerSlots() {
441438 return workerSlots ;
442439 }
443440
441+ public int getFreeSlots () {
442+ return freeSlots ;
443+ }
444+
444445 }
445446}
0 commit comments