You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by bu...@apache.org on 2016/10/17 01:19:09 UTC

svn commit: r1765200 - in /uima/uima-ducc/trunk: uima-ducc-duccdocs/src/site/tex/duccbook/part2/cli/ uima-ducc-duccdocs/src/site/tex/duccbook/part4/ uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/

Author: burn
Date: Mon Oct 17 01:19:09 2016
New Revision: 1765200

URL: http://svn.apache.org/viewvc?rev=1765200&view=rev
Log:
UIMA-5086 Go back to adding the overage to the request before rounding up. Update the jobs-by-order tables when the order changes

Modified:
    uima/uima-ducc/trunk/uima-ducc-duccdocs/src/site/tex/duccbook/part2/cli/ducc-reserve.tex
    uima/uima-ducc/trunk/uima-ducc-duccdocs/src/site/tex/duccbook/part4/rm.tex
    uima/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/NodePool.java
    uima/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/ResourceClass.java
    uima/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/Scheduler.java
    uima/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/User.java

Modified: uima/uima-ducc/trunk/uima-ducc-duccdocs/src/site/tex/duccbook/part2/cli/ducc-reserve.tex
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-duccdocs/src/site/tex/duccbook/part2/cli/ducc-reserve.tex?rev=1765200&r1=1765199&r2=1765200&view=diff
==============================================================================
--- uima/uima-ducc/trunk/uima-ducc-duccdocs/src/site/tex/duccbook/part2/cli/ducc-reserve.tex (original)
+++ uima/uima-ducc/trunk/uima-ducc-duccdocs/src/site/tex/duccbook/part2/cli/ducc-reserve.tex Mon Oct 17 01:19:09 2016
@@ -93,6 +93,7 @@
     Reservations must be for entire machines, in a job class implementing the RESERVE scheduling
     policy. The default DUCC distribution configures class {\em reserve} for entire machine
     reservations.  A reservation request will be queued if there is no available machine in that
-    class matching the requested size (after rounding up), or up to {\em ducc.rm.reserve\_overage} larger.
+    class matching the requested size (after rounding up), or up to {\em ducc.rm.reserve\_overage}
+    larger than the request (after rounding up).
     The user may cancel the request with {\em ducc\_unreserve} 
     or with CTRL-C if $--$cancel\_on\_interrupt was specified.

Modified: uima/uima-ducc/trunk/uima-ducc-duccdocs/src/site/tex/duccbook/part4/rm.tex
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-duccdocs/src/site/tex/duccbook/part4/rm.tex?rev=1765200&r1=1765199&r2=1765200&view=diff
==============================================================================
--- uima/uima-ducc/trunk/uima-ducc-duccdocs/src/site/tex/duccbook/part4/rm.tex (original)
+++ uima/uima-ducc/trunk/uima-ducc-duccdocs/src/site/tex/duccbook/part4/rm.tex Mon Oct 17 01:19:09 2016
@@ -203,8 +203,10 @@
           restricted to a single machine per request.  Usually the memory size
           of the machine must match the size specified in the reservation 
           exactly, after rounding up to the next highest multiple of the quantum.
-          But if {\em ducc.rm.reserve\_overage} is positive, DUCC can assign a
-          machine up to this many GB larger.
+          But if {\em ducc.rm.reserve\_overage} is greater than 0 it is added to a reservation 
+          request size to determine the largest possible machine to reserve. 
+          Quantum rounding is done on both the original request size and the overage adjusted size
+          to define the minimum and maximum machine sizes which are targets for the reservation request.
           A reservation that does not adequately match any
           machine remains pending until resources are made available or it is 
           canceled by the user or an administrator. Reservations may be

Modified: uima/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/NodePool.java
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/NodePool.java?rev=1765200&r1=1765199&r2=1765200&view=diff
==============================================================================
--- uima/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/NodePool.java (original)
+++ uima/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/NodePool.java Mon Oct 17 01:19:09 2016
@@ -1325,7 +1325,7 @@ class NodePool
     int countReservables(IRmJob j)
     {
         int order = j.getShareOrder();
-        int max_order = order + getReserveOverage(j);
+        int max_order = getMaxShareOrder(j);
         do {
             if (machinesByOrder.containsKey(order) && machinesByOrder.get(order).size() > 0) {
                 return machinesByOrder.get(order).size();
@@ -1351,16 +1351,17 @@ class NodePool
     }
 
     /*
-     * Convert the GB overage to shares (rounding down) 
+     * Add the allowable overage to the request and convert to shares
      * But only for unmanaged reservations
      * UIMA-5086
      */
-    private int getReserveOverage(IRmJob j) {
+    private int getMaxShareOrder(IRmJob j) {
         if (j.getDuccType() != DuccType.Reservation || reserve_overage <= 0) {
-            return 0;
+            return j.getShareOrder();
         }
-        int share_quantum = j.getShareQuantum() >> 20;   // why is share quantum in KB?
-        return reserve_overage / share_quantum; 
+        long mem = (j.getMemory() + reserve_overage) << 20;              // GB -> KB
+        int share_quantum = j.getShareQuantum();                         // share quantum is in KB! 
+        return (int) ((mem + share_quantum - 1) / share_quantum);        // round UP
     }
     
     /**
@@ -1394,7 +1395,7 @@ class NodePool
         // as it then might find a free machine more than reserve-overage above the original request.
         if (! j.shareOrderUpgraded() ) {
             actual_order = 0;   // Not yet known
-            max_share_order = share_order + getReserveOverage(j);
+            max_share_order = getMaxShareOrder(j);
         } else {
             actual_order = share_order;      // Additional machines must match this
             max_share_order = share_order;   // Restrict search to just the (possibly adjusted) actual order.
@@ -1452,11 +1453,20 @@ class NodePool
                 logger.info(methodName, j.getId(), "Bypass because machine", m.getId(), "is not freeable");
                 continue;
             }
+            
+            // Found a free or freeable machine
             given++;
-            if (actual_order == 0) {
-                actual_order = m.getShareOrder();
-                j.upgradeShareOrder(actual_order);
-            }
+			if (actual_order == 0) {
+				actual_order = m.getShareOrder();
+				j.upgradeShareOrder(actual_order);
+				if (actual_order > share_order) {    // Need to adjust the user & class jobs-by-order tables
+					User user = j.getUser();
+					user.upgrade(j, share_order, actual_order);
+					ResourceClass rc = j.getResourceClass();
+					rc.upgrade(j, share_order, actual_order);
+					logger.info(methodName, j.getId(), "Increased order of RESERVE job to", actual_order);
+				}
+			}
         }
         
         // Remember how many full machines we need to free up when we get to preemption stage.

Modified: uima/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/ResourceClass.java
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/ResourceClass.java?rev=1765200&r1=1765199&r2=1765200&view=diff
==============================================================================
--- uima/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/ResourceClass.java (original)
+++ uima/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/ResourceClass.java Mon Oct 17 01:19:09 2016
@@ -503,6 +503,21 @@ public class ResourceClass
         }
     }
 
+    /*
+     * Update the jobs-by-order table when a reservation is upgraded
+     */
+	void upgrade(IRmJob j, int old_order, int new_order) {
+		HashMap<IRmJob, IRmJob> jbo = jobsByOrder.get(old_order);
+        jbo.remove(j);
+		jbo = jobsByOrder.get(new_order);
+		if (jbo == null) {
+			jbo = new HashMap<IRmJob, IRmJob>();
+			jobsByOrder.put(new_order, jbo);
+			max_job_order = Math.max(max_job_order, new_order);
+		}
+		jbo.put(j, j);
+	}
+    
     int countJobs()
     {
         return allJobs.size();

Modified: uima/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/Scheduler.java
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/Scheduler.java?rev=1765200&r1=1765199&r2=1765200&view=diff
==============================================================================
--- uima/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/Scheduler.java (original)
+++ uima/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/Scheduler.java Mon Oct 17 01:19:09 2016
@@ -1686,6 +1686,9 @@ public class Scheduler
                     // (the share's share_order should be correct but perhaps the machine has become larger!)
                     share_order = s.getMachineOrder();
                     s.setShareOrder(share_order);
+                    if (share_order > j.getShareOrder()) {
+                    	logger.info(methodName, j.getId(), "Increased order of RESERVE job to", share_order);
+                    }
                     j.upgradeShareOrder(share_order);
                     if ( j.isService() && !compatibleNodepool(s, j) ) {       // UIMA-4142
                         sharesToShrink.add(s);   // nodepool reconfig snafu, SM will reallocate the process

Modified: uima/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/User.java
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/User.java?rev=1765200&r1=1765199&r2=1765200&view=diff
==============================================================================
--- uima/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/User.java (original)
+++ uima/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/User.java Mon Oct 17 01:19:09 2016
@@ -115,6 +115,23 @@ public class User
         }
         ojobs.put(j, j);
     }
+    
+    /* 
+     * Update the jobs-by-order table when the reservation is upgraded
+     */
+    		
+    void upgrade(IRmJob j, int oldOrder, int newOrder) {
+    	Map<IRmJob, IRmJob> ojobs;
+    	ojobs = jobsByOrder.get(oldOrder);
+    	ojobs.remove(j);
+    	
+        ojobs = jobsByOrder.get(newOrder);
+        if (ojobs == null) {
+            ojobs = new HashMap<IRmJob, IRmJob>();
+            jobsByOrder.put(newOrder, ojobs);
+        }
+        ojobs.put(j, j);
+    }
 
     /**
      * Remove a job from the list and return how many jobs remain.