return cap, cburst, share, quantum
-def init(eth):
+def init(eth = "eth0"):
global TC, OPS
cap, cburst, share, quantum = get_defaults()
(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
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);
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
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
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
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
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
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" },
"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,
#
# 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}
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
%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
%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