X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sliver_vs.py;h=ce7a5cb732c5afde44d44a1bc5cbd47fe3ad65c9;hb=8f71408c6f62df2073767b0a4d51ed881641dee6;hp=f93a4f057c6088ed30e1b23a32eb502692530ebf;hpb=d99180f837ae3fcd754a5cdc0a17a9efbe16a2fe;p=nodemanager.git diff --git a/sliver_vs.py b/sliver_vs.py index f93a4f0..ce7a5cb 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 = '' @@ -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)