# Faiyaz Ahmed <faiyaza@cs.princeton.edu>
# Copyright (C) 2004-2006 The Trustees of Princeton University
#
-# $Id: bwmon.py,v 1.12 2007/03/06 20:46:54 faiyaza Exp $
+# $Id: bwmon.py,v 1.18 2007/04/25 22:19:59 faiyaza Exp $
#
import os
return self.name
def updateSliceAttributes(self, rspec):
-
# Get attributes
# Sanity check plus policy decision for MinRate:
MinRate = int(.25 * default_MaxRate)
if MinRate != self.MinRate:
self.MinRate = MinRate
- logger.log("bwmon: Updating %s. Min Rate = %s" %(self.name, self.MinRate))
+ logger.log("bwmon: Updating %s: Min Rate = %s" %(self.name, self.MinRate))
MaxRate = int(rspec.get('net_max_rate', bwlimit.get_bwcap() / 1000))
if MaxRate != self.MaxRate:
self.MaxRate = MaxRate
- logger.log("bwmon: Updating %s. Max Rate = %s" %(self.name, self.MaxRate))
+ logger.log("bwmon: Updating %s: Max Rate = %s" %(self.name, self.MaxRate))
Mini2Rate = int(rspec.get('net_i2_min_rate', default_Mini2Rate))
if Mini2Rate != self.Mini2Rate:
self.Mini2Rate = Mini2Rate
- logger.log("bwmon: Updating %s. Min i2 Rate = %s" %(self.name, self.Mini2Rate))
+ logger.log("bwmon: Updating %s: Min i2 Rate = %s" %(self.name, self.Mini2Rate))
Maxi2Rate = int(rspec.get('net_i2_max_rate', bwlimit.bwmax / 1000))
if Maxi2Rate != self.Maxi2Rate:
self.Maxi2Rate = Maxi2Rate
- logger.log("bwmon: Updating %s. Max i2 Rate = %s" %(self.name, self.Maxi2Rate))
+ logger.log("bwmon: Updating %s: Max i2 Rate = %s" %(self.name, self.Maxi2Rate))
MaxKByte = int(rspec.get('net_max_kbyte', default_MaxKByte))
if MaxKByte != self.MaxKByte:
self.MaxKByte = MaxKByte
- logger.log("bwmon: Updating %s. Max KByte lim = %s" %(self.name, self.MaxKByte))
+ logger.log("bwmon: Updating %s: Max KByte lim = %s" %(self.name, self.MaxKByte))
Maxi2KByte = int(rspec.get('net_i2_max_kbyte', default_Maxi2KByte))
if Maxi2KByte != self.Maxi2KByte:
self.Maxi2KByte = Maxi2KByte
- logger.log("bwmon: Updating %s. Max i2 KByte = %s" %(self.name, self.Maxi2KByte))
+ logger.log("bwmon: Updating %s: Max i2 KByte = %s" %(self.name, self.Maxi2KByte))
ThreshKByte = int(rspec.get('net_thresh_kbyte', default_ThreshKByte))
if ThreshKByte != self.ThreshKByte:
self.ThreshKByte = ThreshKByte
- logger.log("bwmon: Updating %s. Thresh KByte = %s" %(self.name, self.ThreshKByte))
+ logger.log("bwmon: Updating %s: Thresh KByte = %s" %(self.name, self.ThreshKByte))
Threshi2KByte = int(rspec.get('net_i2_thresh_kbyte', default_Threshi2KByte))
if Threshi2KByte != self.Threshi2KByte:
self.Threshi2KByte = Threshi2KByte
- logger.log("bwmon: Updating %s. i2 Thresh KByte = %s" %(self.name, self.Threshi2KByte))
+ logger.log("bwmon: Updating %s: i2 Thresh KByte = %s" %(self.name, self.Threshi2KByte))
Share = int(rspec.get('net_share', default_Share))
if Share != self.Share:
self.Share = Share
- logger.log("bwmon: Updating %s. Net Share = %s" %(self.name, self.Share))
+ logger.log("bwmon: Updating %s: Net Share = %s" %(self.name, self.Share))
Sharei2 = int(rspec.get('net_i2_share', default_Share))
if Sharei2 != self.Sharei2:
self.Sharei2 = Sharei2
- logger.log("bwmon: Updating %s. Net i2 Share = %s" %(self.name, self.i2Share))
+ logger.log("bwmon: Updating %s: Net i2 Share = %s" %(self.name, self.i2Share))
def reset(self, runningmaxrate, runningmaxi2rate, usedbytes, usedi2bytes, rspec):
'period': format_period(period)}
if usedbytes >= (self.bytes + (self.ThreshKByte * 1024)):
+ if verbose:
+ logger.log("bwmon: %s over thresh %s" \
+ % (self.name, format_bytes(self.ThreshKByte * 1024)))
sum = self.bytes + (self.ThreshKByte * 1024)
maxbyte = self.MaxKByte * 1024
bytesused = usedbytes - self.bytes
params['class'] = "low bandwidth"
params['bytes'] = format_bytes(usedbytes - self.bytes)
params['limit'] = format_bytes(self.MaxKByte * 1024)
+ params['thresh'] = format_bytes(self.ThreshKByte * 1024)
params['new_maxrate'] = bwlimit.format_tc_rate(new_maxrate)
if verbose:
logger.log("bwmon: %(slice)s %(class)s " \
- "%(bytes)s of %(limit)s (%(new_maxrate)s/s maxrate)" % \
+ "%(bytes)s of %(limit)s max %(thresh)s thresh (%(new_maxrate)s/s maxrate)" % \
params)
# Cap low bandwidth burst rate
(version, slices) = pickle.load(f)
f.close()
# Check version of data file
- if version != "$Id: bwmon.py,v 1.12 2007/03/06 20:46:54 faiyaza Exp $":
+ if version != "$Id: bwmon.py,v 1.18 2007/04/25 22:19:59 faiyaza Exp $":
logger.log("bwmon: Not using old version '%s' data file %s" % (version, datafile))
raise Exception
except Exception:
- version = "$Id: bwmon.py,v 1.12 2007/03/06 20:46:54 faiyaza Exp $"
+ version = "$Id: bwmon.py,v 1.18 2007/04/25 22:19:59 faiyaza Exp $"
slices = {}
# Get/set special slice IDs
live[bwlimit.get_xid(sliver)] = sliver
# Setup new slices.
- # live.xids - runing.xids = new.xids
- newslicesxids = Set(live.keys()) - Set(slices.keys())
+ # live.xids - runing(slices).xids = new.xids
+ newslicesxids = []
+ for plcxid in live.keys():
+ if plcxid not in slices.keys():
+ newslicesxids.append(plcxid)
+
+ #newslicesxids = Set(live.keys()) - Set(slices.keys())
for newslicexid in newslicesxids:
# Delegated slices dont have xids (which are uids) since they haven't been
# instantiated yet.
slices[newslicexid].reset(0, 0, 0, 0, rspec)
else:
logger.log("bwmon Slice %s doesn't have xid. Must be delegated. Skipping." % live[newslicexid])
+
+ # ...mlhuang's abortion....
# Get actual running values from tc.
# Update slice totals and bandwidth.
for params in bwlimit.get():
#xid is populated from bwlimit (read from /etc/passwd)
if slices.has_key(xid):
slice = slices[xid]
+ # Old slices werent being instanciated correctly because
+ # the HTBs were still pleasent, but the slice in bwmon would
+ # have the byte counts set to 0. The next time update was run
+ # the real byte count would be sent to update, causing the bw cap.
+
if time.time() >= (slice.time + period) or \
- usedbytes < slice.bytes or usedi2bytes < slice.i2bytes:
+ usedbytes < slice.bytes or \
+ usedi2bytes < slice.i2bytes or \
+ xid in newslicesxids:
# Reset to defaults every 24 hours or if it appears
# that the byte counters have overflowed (or, more
# likely, the node was restarted or the HTB buckets
else:
# Just in case. Probably (hopefully) this will never happen.
# New slice, initialize state
- logger.log("bwmon: New Slice %s" % name)
- slice = slices[xid] = Slice(xid, name, db[slice.name]['_rspec'])
- slice.reset(maxrate, \
- maxexemptrate, \
- usedbytes, \
- usedi2bytes, \
- db[slice.name]['_rspec'])
+ logger.log("bwmon: Deleting orphaned slice xid %s" % xid)
+ bwlimit.off(xid)
# Delete dead slices
dead = Set(slices.keys()) - Set(live.keys())