X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sliver_vs.py;h=e2e77f83bda018c2aa9f6cd1b6d1e0dae3ea77d5;hb=708b207674f8665b95df579e0e54181a7e557118;hp=f93a4f057c6088ed30e1b23a32eb502692530ebf;hpb=5d1c312313ab66ef85f65963b6ac3bed7a4c3c00;p=nodemanager.git diff --git a/sliver_vs.py b/sliver_vs.py index f93a4f0..e2e77f8 100644 --- a/sliver_vs.py +++ b/sliver_vs.py @@ -18,6 +18,7 @@ don't have to guess if there is a running process or not. import errno import os +import threading import time import vserver @@ -31,12 +32,18 @@ class Sliver_VS(accounts.Account, vserver.VServer): SHELL = '/bin/vsh' TYPE = 'sliver.VServer' + _init_disk_info_sem = threading.Semaphore(1) def __init__(self, rec): try: vserver.VServer.__init__(self, rec['name']) - except vserver.NoSuchVServer: - self.create(rec['name'], rec['type']) + except Exception, err: + if not isinstance(err, vserver.NoSuchVServer): + # Probably a bad vserver or vserver configuration file + logger.log_exc() + logger.log('%s: recreating bad vserver' % rec['name']) + self.destroy(rec['name']) + self.create(rec['name'], rec['vref']) vserver.VServer.__init__(self, rec['name']) self.keys = '' @@ -78,11 +85,11 @@ class Sliver_VS(accounts.Account, vserver.VServer): def start(self, delay=0): if self.rspec['enabled']: logger.log('%s: starting in %d seconds' % (self.name, delay)) + time.sleep(delay) child_pid = os.fork() if child_pid == 0: # VServer.start calls fork() internally, so just close the nonstandard fds and fork once to avoid creating zombies tools.close_nonstandard_fds() - time.sleep(delay) vserver.VServer.start(self, True) os._exit(0) else: os.waitpid(child_pid, 0) @@ -98,22 +105,31 @@ class Sliver_VS(accounts.Account, vserver.VServer): try: # if the sliver is over quota, .set_disk_limit will throw an exception if not self.disk_usage_initialized: self.vm_running = False - logger.log('%s: computing disk usage' % self.name) - self.init_disk_info() + logger.log('%s: computing disk usage: beginning' % self.name) + Sliver_VS._init_disk_info_sem.acquire() + try: self.init_disk_info() + finally: Sliver_VS._init_disk_info_sem.release() + logger.log('%s: computing disk usage: ended' % self.name) self.disk_usage_initialized = True vserver.VServer.set_disklimit(self, disk_max) except OSError: logger.log('%s: failed to set max disk usage' % self.name) logger.log_exc() - net_limits = (self.rspec['net_min'], self.rspec['net_max'], self.rspec['net2_min'], self.rspec['net2_max'], self.rspec['net_share']) - logger.log('%s: setting net limits to %s bps' % (self.name, net_limits[:-1])) - logger.log('%s: setting net share to %d' % (self.name, net_limits[-1])) - self.set_bwlimit(*net_limits) + # N.B. net_*_rate are in kbps because of XML-RPC maxint + # limitations, convert to bps which is what bwlimit.py expects. +# net_limits = (self.rspec['net_min_rate'] * 1000, +# self.rspec['net_max_rate'] * 1000, +# self.rspec['net_i2_min_rate'] * 1000, +# self.rspec['net_i2_max_rate'] * 1000, +# self.rspec['net_share']) +# logger.log('%s: setting net limits to %s bps' % (self.name, net_limits[:-1])) +# logger.log('%s: setting net share to %d' % (self.name, net_limits[-1])) +# self.set_bwlimit(*net_limits) cpu_min = self.rspec['cpu_min'] cpu_share = self.rspec['cpu_share'] - if self.rspec['enabled']: + if self.rspec['enabled'] > 0: if cpu_min >= 50: # at least 5%: keep people from shooting themselves in the foot logger.log('%s: setting cpu share to %d%% guaranteed' % (self.name, cpu_min/10.0)) self.set_sched_config(cpu_min, vserver.SCHED_CPU_GUARANTEED)