From: Marco Yuen Date: Mon, 5 Mar 2012 18:37:19 +0000 (-0500) Subject: Fixes for F16. X-Git-Tag: nodemanager-2.1-1~10 X-Git-Url: http://git.onelab.eu/?p=nodemanager.git;a=commitdiff_plain;h=feab150b206313174a1e4c9fc2fa4a9b11bf18e4 Fixes for F16. cgroup is now mounted automatcially by systemd and the way is mounted is very different from before. Hence, cgroups.py needs to be changed to reflect the new mount point, and it doesn't use inotify to monitor the FS anymore. Everything is done dynamically at runtime. Changes for Coresched are cgroups related. Since /var is mounted on tmpfs, os.rename doesn't work across partition, so shutil.move is used instead. --- diff --git a/cgroups.py b/cgroups.py index cf6ca98..ebd4b56 100644 --- a/cgroups.py +++ b/cgroups.py @@ -8,7 +8,8 @@ import pyinotify import logger # Base dir for libvirt -BASE_DIR = '/cgroup/libvirt/' +BASE_DIR = '/sys/fs/cgroup' +SUB_SYSTEMS = ['blkio', 'freezer', 'devices', 'memory', 'cpu,cpuacct', 'cpuset'] VIRT_TECHS = ['lxc'] # Global cgroup mapping. @@ -31,36 +32,41 @@ class CgroupWatch(pyinotify.ProcessEvent): (event.name, event.path)) -logger.verbose("Cgroups: Recognizing already existing cgroups...") -for virt in VIRT_TECHS: - filenames = os.listdir(os.path.join(BASE_DIR, virt)) - for filename in filenames: - path = os.path.join(BASE_DIR, virt, filename) - if os.path.isdir(path): - CGROUPS[filename] = path +#logger.verbose("Cgroups: Recognizing already existing cgroups...") +#for virt in VIRT_TECHS: +# filenames = os.listdir(os.path.join(BASE_DIR, virt)) +# for filename in filenames: +# path = os.path.join(BASE_DIR, virt, filename) +# if os.path.isdir(path): +# CGROUPS[filename] = path -logger.verbose("Cgroups: Initializing watchers...") -wm = pyinotify.WatchManager() -notifier = pyinotify.ThreadedNotifier(wm, CgroupWatch()) -for virt in VIRT_TECHS: - wdd = wm.add_watch(os.path.join(BASE_DIR, virt), - pyinotify.IN_DELETE | pyinotify.IN_CREATE, - rec=False) -notifier.daemon = True -notifier.start() +#logger.verbose("Cgroups: Initializing watchers...") +#wm = pyinotify.WatchManager() +#notifier = pyinotify.ThreadedNotifier(wm, CgroupWatch()) +#for virt in VIRT_TECHS: +# wdd = wm.add_watch(os.path.join(BASE_DIR, virt), +# pyinotify.IN_DELETE | pyinotify.IN_CREATE, +# rec=False) +#notifier.daemon = True +#notifier.start() + +def get_cgroup_paths(): + cpusetBase = os.path.join(BASE_DIR, 'cpuset', 'libvirt', 'lxc') + return filter(os.path.isdir, + map(lambda f: os.path.join(cpusetBase, f), + os.listdir(cpusetBase))) def get_cgroup_path(name): - """ Returns the base path for the cgroup with a specific name """ - assert CGROUPS.has_key(name), \ - "No sliver %s managed by libvirt through cgroup!" % name - return CGROUPS[name] + """ Returns the base path for the cgroup with a specific name or None.""" + return reduce(lambda a, b: b if os.path.basename(b) == name else a, + get_cgroup_paths(), None) def get_base_path(): return BASE_DIR def get_cgroups(): """ Returns the list of cgroups active at this moment on the node """ - return CGROUPS.keys() + return map(os.path.basename, get_cgroup_paths()) def write(name, key, value): """ Writes a value to the file key with the cgroup with name """ @@ -72,4 +78,4 @@ def append(name, key, value): """ Appends a value to the file key with the cgroup with name """ base_path = get_cgroup_path(name) with open(os.path.join(base_path, key), 'a') as f: - print >>f, value + print >>f, value diff --git a/coresched.py b/coresched.py index 3959e48..7c91fba 100644 --- a/coresched.py +++ b/coresched.py @@ -10,6 +10,7 @@ import os import cgroups glo_coresched_simulate = False +joinpath = os.path.join class CoreSched: """ Whole-core scheduler @@ -33,7 +34,7 @@ class CoreSched: self.mems_map={} self.cpu_siblings={} - def get_cgroup_var(self, name=None, filename=None): + def get_cgroup_var(self, name=None, subsys=None, filename=None): """ decode cpuset.cpus or cpuset.mems into a list of units that can be reserved. """ @@ -42,7 +43,9 @@ class CoreSched: if filename==None: # filename="/dev/cgroup/" + name - filename=cgroups.get_base_path() + name + filename = reduce(lambda a, b: joinpath(a, b) if b else a, [subsys, name], + cgroups.get_base_path()) + data = open(filename).readline().strip() if not data: @@ -72,7 +75,7 @@ class CoreSched: if self.cpus!=[]: return self.cpus - self.cpus = self.get_cgroup_var(self.cgroup_var_name) + self.cpus = self.get_cgroup_var(self.cgroup_var_name, 'cpuset') self.cpu_siblings = {} for item in self.cpus: @@ -275,7 +278,7 @@ class CoreSched: if self.mems!=[]: return self.mems - self.mems = self.get_cgroup_var(self.cgroup_mem_name) + self.mems = self.get_cgroup_var(self.cgroup_mem_name, 'cpuset') # build a mapping from memory nodes to the cpus they can be used with @@ -337,7 +340,9 @@ class CoreSched: return [] siblings = [] - x = int(open(fn,"rt").readline().strip(),16) + x = open(fn, 'rt').readline().strip().split(',')[-1] + x = int(x, 16) + cpuid = 0 while (x>0): if (x&1)!=0: diff --git a/tools.py b/tools.py index 99e6dac..9aee6a4 100644 --- a/tools.py +++ b/tools.py @@ -10,6 +10,7 @@ import fcntl import errno import threading import subprocess +import shutil import logger @@ -111,7 +112,7 @@ The return value is the pid of the other running process, or None otherwise.""" def write_file(filename, do_write, **kw_args): """Write file atomically by opening a temporary file, using to write that file, and then renaming the temporary file.""" - os.rename(write_temp_file(do_write, **kw_args), filename) + shutil.move(write_temp_file(do_write, **kw_args), filename) def write_temp_file(do_write, mode=None, uidgid=None): fd, temporary_filename = tempfile.mkstemp() @@ -148,7 +149,7 @@ def replace_file_with_string (target, new_contents, chmod=None, remove_if_empty= os.close(fd) if os.path.exists(target): os.unlink(target) - os.rename(name,target) + shutil.move(name,target) if chmod: os.chmod(target,chmod) return True