You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by ch...@apache.org on 2013/08/02 14:39:49 UTC

svn commit: r1509662 - in /uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler: NodePool.java NodepoolScheduler.java

Author: challngr
Date: Fri Aug  2 12:39:49 2013
New Revision: 1509662

URL: http://svn.apache.org/r1509662
Log:
UIMA-3138 Bound defrag loop for non-preemptables using all-or-nothing policy.

Modified:
    uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/NodePool.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/NodepoolScheduler.java

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/NodePool.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/NodePool.java?rev=1509662&r1=1509661&r2=1509662&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/NodePool.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/NodePool.java Fri Aug  2 12:39:49 2013
@@ -947,7 +947,9 @@ class NodePool
                     j.shrinkByOne(s);
                     nPendingByOrder[order]++;
                 } else {
-                    logger.warn(methodName, null, "Found non-preemptable share on machine that should be clearable:", s);
+                    // This is 99.44% caused by fragmentation.  We could force the issue here, but instead will
+                    // defer to the defrag code which will try to find better candidates for eviction.
+                    logger.warn(methodName, null, "Found non-preemptable share on machine that should be clearable (possible fragmentation):", s);
                 }
             }
             given++;

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/NodepoolScheduler.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/NodepoolScheduler.java?rev=1509662&r1=1509661&r2=1509662&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/NodepoolScheduler.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/NodepoolScheduler.java Fri Aug  2 12:39:49 2013
@@ -1618,16 +1618,21 @@ public class NodepoolScheduler
                 logger.trace(methodName, nj.getId(), "Not a candidate, insufficient rich jobs:", m.getId());
             }
         }
-        if ( logger.isDebug() ) {
-            // print under debug, but don't do the log leader for each machine
-            logger.debug(methodName, nj.getId(), "Found", eligibleMachines.size(), "machines to be searched in this order:");
-            StringBuffer buf = new StringBuffer();
-            for ( Machine m : eligibleMachines.keySet() ) {
-                buf.append(m.getId());
-                buf.append(" ");
-            }
-            logger.debug(methodName, nj.getId(), "Eligible machines:", buf.toString());
+
+        if ( nj.isReservation() && ( eligibleMachines.size() < needed ) ) {
+            // if we can't clear enough for the reservation we have to wait.  Very unlikely, but not impossible.
+            logger.info(methodName, nj.getId(), "Found insufficient machines (", eligibleMachines.size(), "for reservation. Not clearing.");
+            return 0;
         }
+
+        logger.info(methodName, nj.getId(), "Found", eligibleMachines.size(), "machines to be searched in this order:");
+        StringBuffer buf = new StringBuffer();
+        for ( Machine m : eligibleMachines.keySet() ) {
+            buf.append(m.getId());
+            buf.append(" ");
+            }
+        logger.info(methodName, nj.getId(), "Eligible machines:", buf.toString());
+
         // first part done
 
         // Now just bop through the machines until either we can't find anything, or we find everything.
@@ -1704,7 +1709,7 @@ public class NodepoolScheduler
                 given = given + (g / orderNeeded);    // at least one,or else we have a bug 
                 logger.debug(methodName, nj.getId(), "LOOPEND: given[", given, "] g[", g, "] orderNeeded[", orderNeeded, "]");
             }
-
+            logger.debug(methodName, nj.getId(), "Given_per_round", given_per_round, "given", given, "needed", needed);
         } while ( (given_per_round > 0) && ( given < needed ));
         
         return given;
@@ -1732,28 +1737,33 @@ public class NodepoolScheduler
 
                 HashMap<IRmJob, IRmJob> jobs = rc.getAllJobs();
                 for ( IRmJob j : jobs.values() ) {
-                    if ( needy.containsKey(j) ) {                            // if needy it's not a candidate
-                        logger.debug(methodName, nj.getId(), "Job", j.getId(), "is not a candidate because it's needy.");
-                        continue;
-                    }
-
-                    if ( ! j.isInitialized() ) {
-                        logger.debug(methodName, nj.getId(), "Job", j.getId(), "is not a candidate because it's not initialized yet.");
-                        continue;                                            // if not initialized its not a candidate
-                    }
-
-                    //
-                    // Need at least one potential candidate of worse or equal priority
-                    //
-                    
-                    if ( j.getSchedulingPriority() < nj.getSchedulingPriority() ) {
-                        logger.debug(methodName, nj.getId(), "Job", j.getId(), "is not a candidate because it has better priority.");
-                        continue;
-                    }
-
-                    if ( ! compatibleNodepools(j, nj) ) {
-                        logger.debug(methodName, nj.getId(), "Job", j.getId(), "is not a candidate because of incompatible nodepools.");
-                        continue;
+                    if ( nj.isReservation() && (nj.getSchedulingPriority() > j.getSchedulingPriority()) ) {
+                            // We could end up evictin really needy stuff - hopefully not, but these guys are Top Men so there.
+                            logger.debug(methodName, nj.getId(), "Reservation priority override on candidate selection.");
+                    } else {
+                        if ( needy.containsKey(j) ) {                            // if needy it's not a candidate
+                            logger.debug(methodName, nj.getId(), "Job", j.getId(), "is not a candidate because it's needy.");
+                            continue;
+                        }
+                        
+                        if ( ! j.isInitialized() ) {
+                            logger.debug(methodName, nj.getId(), "Job", j.getId(), "is not a candidate because it's not initialized yet.");
+                            continue;                                            // if not initialized its not a candidate
+                        }
+                        
+                        //
+                        // Need at least one potential candidate of worse or equal priority
+                        //
+                        
+                        if ( j.getSchedulingPriority() < nj.getSchedulingPriority() ) {
+                            logger.debug(methodName, nj.getId(), "Job", j.getId(), "is not a candidate because it has better priority.");
+                            continue;
+                        }
+                        
+                        if ( ! compatibleNodepools(j, nj) ) {
+                            logger.debug(methodName, nj.getId(), "Job", j.getId(), "is not a candidate because of incompatible nodepools.");
+                            continue;
+                        }
                     }
 
                     int nshares = j.countNShares();