Clean up code for setting rlimits
authorAndy Bavier <acb@cs.princeton.edu>
Mon, 21 Jan 2008 19:19:07 +0000 (19:19 +0000)
committerAndy Bavier <acb@cs.princeton.edu>
Mon, 21 Jan 2008 19:19:07 +0000 (19:19 +0000)
python/vserver.py
python/vserverimpl.c
scripts/vuseradd
util-vserver-pl.spec

index 39275de..2dd8525 100644 (file)
@@ -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
 
 
 
index eef6f8e..9d4a503 100644 (file)
@@ -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<<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;
 }
index 0e2c8a0..fa58015 100755 (executable)
@@ -88,7 +88,7 @@ if [ ! -d $__CONFDIR/$NAME ] ; then
     fi
     mkdir -p $DIR/apps/init $DIR/rlimits $DIR/sched $DIR/dlimits/0
     echo default > $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
index a159432..3583844 100644 (file)
@@ -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}}