def __init__(self, name, vm_id = None, vm_running = None, logfile=None):
self.name = name
- self.rlimits_changed = False
self.dir = "%s/%s" % (vserverimpl.VSERVER_BASEDIR, name)
if not (os.path.isdir(self.dir) and
os.access(self.dir, os.R_OK | os.W_OK | os.X_OK)):
except:
print '%s: (%s failed to open) %s'%(time.asctime(time.gmtime()),self.logfile,msg)
- def have_limits_changed(self):
- return self.rlimits_changed
-
- def set_rlimit_limit(self,type,hard,soft,minimum):
+ def set_rlimit(self, type, hard, soft, min):
"""Generic set resource limit function for vserver"""
global RLIMITS
- changed = False
- try:
- old_hard, old_soft, old_minimum = self.get_rlimit_limit(type)
- if old_hard != VC_LIM_KEEP and old_hard <> hard: changed = True
- if old_soft != VC_LIM_KEEP and old_soft <> soft: changed = True
- if old_minimum != VC_LIM_KEEP and old_minimum <> minimum: changed = True
- self.rlimits_changed = self.rlimits_changed or changed
- except OSError, e:
- if self.is_running(): self.log("Unexpected error with getrlimit for running context %d" % self.ctx)
-
- resource_type = RLIMITS[type]
- try:
- ret = vserverimpl.setrlimit(self.ctx,resource_type,hard,soft,minimum)
- except OSError, e:
- if self.is_running(): self.log("Unexpected error with setrlimit for running context %d" % self.ctx)
+ update = False
- def set_rlimit_config(self,type,hard,soft,minimum):
- """Generic set resource limit function for vserver"""
if hard <> VC_LIM_KEEP:
self.config.update('rlimits/%s.hard' % type.lower(), hard)
+ update = True
if soft <> VC_LIM_KEEP:
self.config.update('rlimits/%s.soft' % type.lower(), soft)
- if minimum <> VC_LIM_KEEP:
- self.config.update('rlimits/%s.min' % type.lower(), minimum)
- self.set_rlimit_limit(type,hard,soft,minimum)
+ update = True
+ if min <> VC_LIM_KEEP:
+ self.config.update('rlimits/%s.min' % type.lower(), min)
+ update = True
- def get_rlimit_limit(self,type):
- """Generic get resource configuration function for vserver"""
- global RLIMITS
- resource_type = RLIMITS[type]
- try:
- ret = vserverimpl.getrlimit(self.ctx,resource_type)
- except OSError, e:
- self.log("Unexpected error with getrlimit for context %d" % self.ctx)
- ret = self.get_rlimit_config(type)
- return ret
+ if self.is_running() and update:
+ resource_type = RLIMITS[type]
+ try:
+ vserverimpl.setrlimit(self.ctx, resource_type, hard, soft, min)
+ except OSError, e:
+ self.log("Error: setrlimit(%d, %s, %d, %d, %d): %s"
+ % (self.ctx, type.lower(), hard, soft, min))
- def get_rlimit_config(self,type):
- """Generic get resource configuration function for vserver"""
- hard = int(self.config.get("rlimits/%s.hard"%type.lower(),VC_LIM_KEEP))
- soft = int(self.config.get("rlimits/%s.soft"%type.lower(),VC_LIM_KEEP))
- minimum = int(self.config.get("rlimits/%s.min"%type.lower(),VC_LIM_KEEP))
- return (hard,soft,minimum)
+ return update
def set_capabilities(self, capabilities):
return vserverimpl.setbcaps(self.ctx, vserverimpl.text2bcaps(capabilities))
def start(self, wait, runlevel = 3):
self.vm_running = True
- self.rlimits_changed = False
child_pid = os.fork()
if child_pid == 0:
def stop(self, signal = signal.SIGKILL):
vserverimpl.killall(self.ctx, signal)
self.vm_running = False
- self.rlimits_changed = False
static PyObject *
vserver_set_rlimit(PyObject *self, PyObject *args) {
struct vc_rlimit limits;
- struct rlimit lim;
+ struct vc_rlimit_mask mask;
+ uint32_t bitmask;
xid_t xid;
- int resource, lresource;
+ int resource;
PyObject *ret;
limits.min = VC_LIM_KEEP;
if (!PyArg_ParseTuple(args, "IiLLL", &xid, &resource, &limits.hard, &limits.soft, &limits.min))
return NULL;
- lresource = resource;
- switch (resource) {
- case VC_VLIMIT_NSOCK:
- case VC_VLIMIT_ANON:
- case VC_VLIMIT_SHMEM:
- goto do_vc_set_rlimit;
- case VC_VLIMIT_OPENFD:
- lresource = RLIMIT_NOFILE;
- break;
- default:
- break;
- }
-
- getrlimit(lresource,&lim);
- if (adjust_lim(&limits,&lim)) {
- setrlimit(lresource, &lim);
- }
-
- do_vc_set_rlimit:
errno = 0;
- if (vc_set_rlimit(xid, resource, &limits)==-1)
+
+ if (vc_get_rlimit_mask(xid, &mask)==-1) {
ret = PyErr_SetFromErrno(PyExc_OSError);
- else
- ret = __vserver_get_rlimit(xid, resource);
+ } else {
+ bitmask = (1<<resource);
+ if ((mask.min|mask.soft|mask.hard) & bitmask)
+ if (vc_set_rlimit(xid, resource, &limits)==-1)
+ ret = PyErr_SetFromErrno(PyExc_OSError);
+ else
+ ret = __vserver_get_rlimit(xid, resource);
+ }
return ret;
}