From 5eaf3d83ac6661e3ac227849e997f7c20b948bf1 Mon Sep 17 00:00:00 2001 From: Andy Bavier Date: Mon, 21 Jan 2008 19:19:07 +0000 Subject: [PATCH] Clean up code for setting rlimits --- python/vserver.py | 58 ++++++++++++-------------------------------- python/vserverimpl.c | 37 ++++++++++------------------ scripts/vuseradd | 2 +- util-vserver-pl.spec | 2 +- 4 files changed, 30 insertions(+), 69 deletions(-) diff --git a/python/vserver.py b/python/vserver.py index 39275de..2dd8525 100644 --- a/python/vserver.py +++ b/python/vserver.py @@ -137,7 +137,6 @@ class VServer: 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)): @@ -163,55 +162,30 @@ class VServer: 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)) @@ -424,7 +398,6 @@ class VServer: def start(self, wait, runlevel = 3): self.vm_running = True - self.rlimits_changed = False child_pid = os.fork() if child_pid == 0: @@ -507,7 +480,6 @@ class VServer: def stop(self, signal = signal.SIGKILL): vserverimpl.killall(self.ctx, signal) self.vm_running = False - self.rlimits_changed = False diff --git a/python/vserverimpl.c b/python/vserverimpl.c index eef6f8e..9d4a503 100644 --- a/python/vserverimpl.c +++ b/python/vserverimpl.c @@ -145,9 +145,10 @@ vserver_get_rlimit(PyObject *self, PyObject *args) { 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; @@ -157,30 +158,18 @@ vserver_set_rlimit(PyObject *self, PyObject *args) { 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< $DIR/apps/init/mark - echo 1000 > $DIR/rlimits/nproc + echo 1000 > $DIR/rlimits/nproc.hard # Set persistent for the network context echo persistent > $DIR/nflags diff --git a/util-vserver-pl.spec b/util-vserver-pl.spec index a159432..3583844 100644 --- a/util-vserver-pl.spec +++ b/util-vserver-pl.spec @@ -4,7 +4,7 @@ %define url $URL$ %define name util-vserver-pl -%define version 0.2 +%define version 0.3 %define taglevel 1 %define release %{taglevel}%{?pldistro:.%{pldistro}}%{?date:.%{date}} -- 2.43.0