add optional besteffort flag to core scheduler
authorsmbaker <smbaker@gmail.com>
Tue, 5 Apr 2011 23:50:10 +0000 (16:50 -0700)
committersmbaker <smbaker@gmail.com>
Tue, 5 Apr 2011 23:50:10 +0000 (16:50 -0700)
coresched.py
slivermanager.py

index cc0282b..dd6dd04 100644 (file)
@@ -60,6 +60,24 @@ class CoreSched:
                 cgroups.append(filename)
         return cgroups
 
+    def decodeCoreSpec (self, cores):
+        """ Decode the value of the core attribute. It's a number, followed by
+            an optional letter "b" to indicate besteffort cores should also
+            be supplied.
+        """
+        bestEffort = False
+
+        if cores.endswith("b"):
+           cores = cores[:-1]
+           bestEffort = True
+
+        try:
+            cores = int(cores)
+        except ValueError:
+            cores = 0
+
+        return (cores, bestEffort)
+
     def adjustCores (self, slivers):
         """ slivers is a dict of {sliver_name: rec}
                 rec is a dict of attributes
@@ -72,9 +90,12 @@ class CoreSched:
 
         reservations = {}
 
+        # allocate the cores to the slivers that have them reserved
         for name, rec in slivers.iteritems():
             rspec = rec["_rspec"]
             cores = rspec.get("cpu_cores", 0)
+            (cores, bestEffort) = self.decodeCoreSpec(cores)
+
             while (cores>0):
                 # one cpu core reserved for best effort and system slices
                 if len(cpus)<=1:
@@ -90,6 +111,22 @@ class CoreSched:
         logger.log("CoreSched: allocating cpus " + str(cpus) + " to _default")
         reservations["_default"] = cpus[:]
 
+        # now check and see if any of our reservations had the besteffort flag
+        # set
+        for name, rec in slivers.iteritems():
+            rspec = rec["_rspec"]
+            cores = rspec.get("cpu_cores", 0)
+            (cores, bestEffort) = self.decodeCoreSpec(cores)
+
+            if not (reservations.get(name,[])):
+                # if there is no reservation for this slice, then it's already
+                # besteffort by default.
+                continue
+
+            if bestEffort:
+                reservations[name] = reservations[name] + reservations["_default"]
+                logger.log("CoreSched: adding besteffort cores to " + name + ". new cores = " + str(reservations[name]))
+
         self.reserveCores(reservations)
 
     def reserveCores (self, reservations):
index 70c2186..383379e 100644 (file)
@@ -29,7 +29,7 @@ DEFAULT_ALLOCATION = {
     # CPU parameters
     'cpu_pct': 0, # percent CPU reserved
     'cpu_share': 1, # proportional share
-    'cpu_cores': 0, # reserved cpu cores
+    'cpu_cores': "0b", # reserved cpu cores <num_cores>[b]
     # bandwidth parameters
     'net_min_rate': bwmin / 1000, # kbps
     'net_max_rate': bwmax / 1000, # kbps