Port changes to release branch
authorSteve Muir <smuir@cs.princeton.edu>
Thu, 10 Nov 2005 23:41:00 +0000 (23:41 +0000)
committerSteve Muir <smuir@cs.princeton.edu>
Thu, 10 Nov 2005 23:41:00 +0000 (23:41 +0000)
python/bwlimit.py
python/vduimpl.c
python/vserver.py
python/vserverimpl.c
scripts/vuseradd
util-vserver.spec

index b408caa..bfab4f7 100644 (file)
@@ -80,7 +80,7 @@ def get_defaults(cap_file="/etc/planetlab/bwcap", default_cap="10mbit"):
     return cap, cburst, share, quantum
 
 
-def init(eth):
+def init(eth = "eth0"):
     global TC, OPS
 
     cap, cburst, share, quantum = get_defaults()
@@ -115,16 +115,18 @@ def init(eth):
               (TC, op, eth)
         if run(cmd): break
 
-def on(xid, eth, bwlimit, cap, minrate, maxrate):
+def on(xid, eth, share, minrate, maxrate = None):
     global TC, OPS
 
     default_cap, default_cburst, default_share, default_quantum = get_defaults()
-    quantum = bwlimit * default_quantum
+    if maxrate == None:
+        maxrate = default_cap
+    quantum = share * default_quantum
 
     # Set up the per-vserver token bucket
     for op in OPS:
         cmd = "%s class %s dev %s parent 1:1 classid 1:%d htb rate %s ceil %s quantum %d cburst %d" % \
-              (TC, op, eth, xid, minrate, cap, quantum, default_cburst)
+              (TC, op, eth, xid, minrate, maxrate, quantum, default_cburst)
         if run(cmd): break
 
     # The next command appears to throttle back processes that are
index fb219ff..2191826 100644 (file)
@@ -549,6 +549,7 @@ do_vdu(PyObject *self, PyObject *args)
        cwd_fd = open(".", O_RDONLY);
        res = vdu_onedir(&tbl, &s, path);
        fchdir(cwd_fd);
+       close(cwd_fd);
 
        /* deallocate whatever has been added to tbl */
        Dispose(&tbl);
index 9f1bb09..7132cd1 100644 (file)
@@ -35,7 +35,7 @@ class VServer:
     INITSCRIPTS = [('/etc/rc.vinit', 'start'),
                    ('/etc/rc.d/rc', '%(runlevel)d')]
 
-    def __init__(self, name, vm_running = False, resources = {}):
+    def __init__(self, name, vm_id, vm_running = False, resources = {}):
 
         self.name = name
         self.config_file = "/etc/vservers/%s.conf" % name
@@ -43,16 +43,15 @@ class VServer:
         if not (os.path.isdir(self.dir) and
                 os.access(self.dir, os.R_OK | os.W_OK | os.X_OK)):
             raise Exception, "no such vserver: " + name
-        self.config = self.__read_config_file("/etc/vservers.conf")
-        self.config.update(self.__read_config_file(self.config_file))
-        self.flags = 0
-        flags = self.config["S_FLAGS"].split(" ")
-        if "lock" in flags:
-            self.flags |= FLAGS_LOCK
-        if "nproc" in flags:
-            self.flags |= FLAGS_NPROC
+        self.config = {}
+        for config_file in ["/etc/vservers.conf", self.config_file]:
+            try:
+                self.config.update(self.__read_config_file(config_file))
+            except IOError, ex:
+                if ex.errno != errno.ENOENT:
+                    raise
         self.remove_caps = ~vserverimpl.CAP_SAFE;
-        self.ctx = int(self.config["S_CONTEXT"])
+        self.ctx = vm_id
         self.vm_running = vm_running
         self.resources = resources
 
@@ -114,6 +113,10 @@ class VServer:
     def set_disklimit(self, block_limit):
 
         # block_limit is in kB
+        if block_limit == 0:
+            vserverimpl.unsetdlimit(self.dir, self.ctx)
+            return
+
         if self.vm_running:
             block_usage = vserverimpl.DLIMIT_KEEP
             inode_usage = vserverimpl.DLIMIT_KEEP
@@ -136,9 +139,10 @@ class VServer:
             blocksused, blocktotal, inodesused, inodestotal, reserved = \
                         vserverimpl.getdlimit(self.dir, self.ctx)
         except OSError, ex:
-            if ex.errno == errno.ESRCH:
-                # get here if no vserver disk limit has been set for xid
-                blocktotal = -1
+            if ex.errno != errno.ESRCH:
+                raise
+            # get here if no vserver disk limit has been set for xid
+            blocktotal = -1
 
         return blocktotal
 
@@ -171,11 +175,12 @@ class VServer:
         ret = vserverimpl.getrlimit(self.ctx,6)
         return ret
 
-    def set_bwlimit(self, eth, limit, cap, minrate, maxrate):
-        if cap == "-1":
-            bwlimit.off(self.ctx,eth)
+    def set_bwlimit(self, share, minrate = 1, maxrate = None, dev = "eth0"):
+
+        if share:
+            bwlimit.on(self.ctx, dev, share, minrate, maxrate)
         else:
-            bwlimit.on(self.ctx, eth, limit, cap, minrate, maxrate)
+            bwlimit.off(self.ctx, dev)
 
     def get_bwlimit(self, eth):
         # not implemented yet
index 7ecaec8..9048e24 100644 (file)
@@ -213,6 +213,26 @@ vserver_set_dlimit(PyObject *self, PyObject *args)
        return Py_None; 
 }
 
+static PyObject *
+vserver_unset_dlimit(PyObject *self, PyObject *args)
+{
+  char  *path;
+  unsigned  xid;
+  struct vcmd_ctx_dlimit_base_v0  init;
+
+  if (!PyArg_ParseTuple(args, "si", &path, &xid))
+    return NULL;
+
+  memset(&init, 0, sizeof(init));
+  init.name = path;
+  init.flags = 0;
+
+  if (vserver(VCMD_rem_dlimit, xid, &init) && errno != ESRCH)
+    return PyErr_SetFromErrno(PyExc_OSError);
+
+  return Py_None;      
+}
+
 static PyMethodDef  methods[] = {
   { "chcontext", vserver_chcontext, METH_VARARGS,
     "chcontext to vserver with provided flags" },
@@ -220,6 +240,8 @@ static PyMethodDef  methods[] = {
     "Change vserver scheduling attributes for given vserver context" },
   { "setdlimit", vserver_set_dlimit, METH_VARARGS,
     "Set disk limits for given vserver context" },
+  { "unsetdlimit", vserver_unset_dlimit, METH_VARARGS,
+    "Remove disk limits for given vserver context" },
   { "getdlimit", vserver_get_dlimit, METH_VARARGS,
     "Get disk limits for given vserver context" },
   { "setrlimit", vserver_set_rlimit, METH_VARARGS,
index 8023aa6..a04b349 100755 (executable)
@@ -4,7 +4,7 @@
 #
 # Copyright (c) 2004  The Trustees of Princeton University (Trustees).
 #
-# $Id: vuseradd,v 1.23 2005/08/21 21:41:03 mlhuang Exp $
+# $Id: vuseradd,v 1.25 2005/11/08 00:22:59 smuir Exp $
 #
 
 : ${UTIL_VSERVER_VARS:=/usr/lib/util-vserver/util-vserver-vars}
@@ -93,8 +93,3 @@ if [ -d "$__DEFAULT_VSERVERDIR/$NAME" ] ; then
        echo "$NAME     ALL=(ALL)       ALL" >> "$__DEFAULT_VSERVERDIR/$NAME/etc/sudoers"
     fi
 fi
-
-# turn resource management on for vserver $NAME
-chkconfig resman && service resman start $NAME
-# XXX - resman doesn't print a trailing newline
-echo
index d528fd7..5f7e6f5 100644 (file)
@@ -17,7 +17,7 @@
 
 %define name util-vserver
 %define version 0.30.208
-%define release 4.planetlab%{?date:.%{date}}
+%define release 6.planetlab%{?date:.%{date}}
 
 %define _without_dietlibc 1
 %define _without_xalan 1
@@ -381,6 +381,14 @@ done
 
 
 %changelog
+* Wed Nov  9 2005 Steve Muir <smuir@cs.princeton.edu>
+- add support for removing resource limits e.g., when a slice is deleted
+
+* Mon Nov  7 2005 Steve Muir <smuir@cs.princeton.edu>
+- fix file descriptor leak in vduimpl
+- clean up handling of network parameters
+- don't rely upon /etc/vservers/foo.conf to initialise vserver object
+
 * Wed Nov  2 2005 Steve Muir <smuir@cs.princeton.edu>
 - fix Python modules to handling scheduling parameters correctly