cleaned up cgroups, updated for recent libvirts,
authorThierry Parmentelat <thierry.parmentelat@inria.fr>
Fri, 13 Mar 2015 15:35:09 +0000 (16:35 +0100)
committerThierry Parmentelat <thierry.parmentelat@inria.fr>
Fri, 13 Mar 2015 15:35:09 +0000 (16:35 +0100)
used in coresched - at least the part that keeps on sending messages;
don't know how to check the reservation part

cgroups.py
coresched_lxc.py

index b665889..b1635c0 100644 (file)
@@ -51,31 +51,37 @@ class CgroupWatch(pyinotify.ProcessEvent):
 #notifier.start()
 
 def get_cgroup_paths(subsystem="cpuset"):
-    cpusetBases = [ 
+    subsystem_bases = [ 
         # observed on f16-f18
         os.path.join(BASE_DIR, subsystem, 'libvirt', 'lxc'),
         # as observed on f20
         os.path.join(BASE_DIR, subsystem ),
+        # f21
+        os.path.join(BASE_DIR, subsystem, 'machine.slice'),
         # as observed on f16 libvirt 1.2.1
         os.path.join(BASE_DIR, subsystem, 'machine'),
         ]
     # try several locations and return all the results
     # get_cgroup_path will sort it out
-    def merge(l1,l2): return l1+l2
-    return reduce (lambda l1,l2: l1+l2, 
-                   [ [ dir for dir in 
-                       [ os.path.join(cpusetBase, f) for f in os.listdir(cpusetBase) ]
-                       if os.path.isdir(dir) ]
-                     for cpusetBase in cpusetBases if os.path.isdir (cpusetBase) ])
+    
+    # just return all the subdirs in the listed bases 
+    return [ subdir
+                 # scan the bases
+                 for subsystem_base in subsystem_bases if os.path.isdir(subsystem_base)
+                     # in each base search the immediate sons that are also dirs
+                     for subdir in [ os.path.join(subsystem_base, f) for f in os.listdir(subsystem_base) ]
+                         if os.path.isdir(subdir) ]
 
 def get_cgroup_path(name, subsystem="cpuset"):
-    """ Returns the base path for the cgroup with a specific name or None."""
-    result = reduce(lambda a, b: b if os.path.basename(b) == name else a,
+    """
+    Returns the base path for the cgroup with a specific name or None.
+    """
+    result = reduce(lambda a, b: b if name in os.path.basename(b) else a,
                     get_cgroup_paths(subsystem), None)
 
     if result is None:
         name = name + ".libvirt-lxc"
-        result = reduce(lambda a, b: b if os.path.basename(b) == name else a,
+        result = reduce(lambda a, b: b if name in os.path.basename(b) else a,
                       get_cgroup_paths(subsystem), None)
 
     return result
@@ -98,3 +104,16 @@ def append(name, key, value, subsystem="cpuset"):
     base_path = get_cgroup_path(name, subsystem)
     with open(os.path.join(base_path, key), 'a') as f:
         print >>f, value
+
+if __name__ == '__main__':
+
+    # goes with the system tests
+    name='inri_sl1' 
+
+    subsystems = 'blkio cpu cpu,cpuacct cpuacct cpuset devices freezer memory net_cls perf_event systemd'.split()
+
+    for subsystem in subsystems:
+        print 'get_cgroup_path({}, {}) =  {}'.\
+            format(name, subsystem, get_cgroup_path(name, subsystem))
+
+#        print 'get_cgroup_paths = {}'.format(get_cgroup_paths(subsystem))
index 2aa81e7..d48e2bb 100644 (file)
@@ -238,27 +238,19 @@ class CoreSched:
         self.freezeUnits("freezer.state", freezeList)
 
     def freezeUnits (self, var_name, freezeList):
-        for (cgroup, freeze) in freezeList.items():
+        for (slicename, freeze) in freezeList.items():
             try:
-                logger.verbose("CoreSched: setting freezer for " + cgroup + " to " + freeze)
-                attempts = []
-#                attempts.append("/dev/cgroup/{}/var_name".format(cgroup, var_name))
-                attempts.append("/sys/fs/cgroup/freezer/libvirt/lxc/{}/{}".format(cgroup, var_name))
-                attempts.append("/sys/fs/cgroup/freezer/machine.slice/machine-lxc\\x2d{}.scope/{}".format(cgroup, var_name))
+                logger.verbose("CoreSched: setting freezer for " + slicename + " to " + freeze)
+                cgroup_path = cgroups.get_cgroup_path(slicename, 'freezer')
+                cgroup = os.path.join(cgroup_path, var_name)
+
                 if glo_coresched_simulate:
-                    for attempt in attempts: print "F", attempt
+                        print "F", cgroup
                 else:
-                    ok = False
-                    for attempt in attempts:
-                        if os.path.exists(attempt):
-                            file(attempt, "w").write(freeze)
-                            ok = True
-                            break
-                    if not ok:
-                        logger.log("CoreSched: could not freezeUnits with {}".format(cgroup))
+                    file(cgroup, "w").write(freeze)
             except Exception as e:
                 # the cgroup probably didn't exit...
-                logger.log("CoreSched: exception while setting freeze for {} ({})".format(cgroup, e))
+                logger.log("CoreSched: exception while setting freeze for {} ({})".format(slicename, e))
 
     def reserveUnits (self, var_name, reservations):
         """ 
@@ -286,10 +278,9 @@ class CoreSched:
                 cpus = default
 
             if glo_coresched_simulate:
-                print "R", "/dev/cgroup/" + cgroup + "/" + var_name, self.listToRange(cpus)
+                print "R", cgroup + "/" + var_name, self.listToRange(cpus)
             else:
                 cgroups.write(cgroup, var_name, self.listToRange(cpus))
-                #file("/dev/cgroup/" + cgroup + "/" + var_name, "w").write( self.listToRange(cpus) + "\n" )
 
     def reserveDefault (self, var_name, cpus):
         #if not os.path.exists("/etc/vservers/.defaults/cgroup"):