From e69eb09c11bcfb647c16b4534a4fcd89f909a565 Mon Sep 17 00:00:00 2001 From: Steve Muir Date: Thu, 10 Nov 2005 23:41:00 +0000 Subject: [PATCH] Port changes to release branch --- python/bwlimit.py | 10 ++++++---- python/vduimpl.c | 1 + python/vserver.py | 39 ++++++++++++++++++++++----------------- python/vserverimpl.c | 22 ++++++++++++++++++++++ scripts/vuseradd | 7 +------ util-vserver.spec | 10 +++++++++- 6 files changed, 61 insertions(+), 28 deletions(-) diff --git a/python/bwlimit.py b/python/bwlimit.py index b408caa..bfab4f7 100644 --- a/python/bwlimit.py +++ b/python/bwlimit.py @@ -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 diff --git a/python/vduimpl.c b/python/vduimpl.c index fb219ff..2191826 100644 --- a/python/vduimpl.c +++ b/python/vduimpl.c @@ -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); diff --git a/python/vserver.py b/python/vserver.py index 9f1bb09..7132cd1 100644 --- a/python/vserver.py +++ b/python/vserver.py @@ -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 diff --git a/python/vserverimpl.c b/python/vserverimpl.c index 7ecaec8..9048e24 100644 --- a/python/vserverimpl.c +++ b/python/vserverimpl.c @@ -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, diff --git a/scripts/vuseradd b/scripts/vuseradd index 8023aa6..a04b349 100755 --- a/scripts/vuseradd +++ b/scripts/vuseradd @@ -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 diff --git a/util-vserver.spec b/util-vserver.spec index d528fd7..5f7e6f5 100644 --- a/util-vserver.spec +++ b/util-vserver.spec @@ -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 +- add support for removing resource limits e.g., when a slice is deleted + +* Mon Nov 7 2005 Steve Muir +- 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 - fix Python modules to handling scheduling parameters correctly -- 2.43.0