Stores last values reported by NM. Uses cached vals if NM stops responding instead of
[mom.git] / bwmon.py
index b1b18e6..3f34b12 100755 (executable)
--- a/bwmon.py
+++ b/bwmon.py
@@ -12,6 +12,7 @@
 #
 # Mark Huang <mlhuang@cs.princeton.edu>
 # Andy Bavier <acb@cs.princeton.edu>
+# Faiyaz Ahmed <faiyaza@cs.princeton.edu>
 # Copyright (C) 2004-2006 The Trustees of Princeton University
 #
 # $Id: bwmon.py,v 1.4 2006/06/02 04:00:00 mlhuang Exp $
@@ -84,14 +85,22 @@ class Slice:
     name - slice name
     time - beginning of recording period in UNIX seconds
     bytes - low bandwidth bytes transmitted at the beginning of the recording period
-    exemptbytes - high bandwidth bytes transmitted at the beginning of the recording period
+    exemptbytes - high bandwidth bytes transmitted at the beginning of the recording period (for I2 -F)
     avgrate - average low bandwidth rate to enforce over the recording period
-    avgexemptrate - average high bandwidth rate to enforce over the recording period 
+    avgexemptrate - average high bandwidth rate to enforce over the recording period (for I2 -F)
+    last_avgrate - last recorded avgrate from NM
+    last_maxrate - last recorded maxrate from NM
+    last_avgexemptrate - last recorded avgexemptrate from NM
+    last_maxexemptrate - last recorded maxexemptrate from NM
     """
 
     def __init__(self, xid, name, maxrate, maxexemptrate, bytes, exemptbytes):
         self.xid = xid
         self.name = name
+       self.last_maxrate = default_maxrate
+       self.last_avgrate = default_avgrate
+       self.last_avgexemptrate = default_avgexemptrate 
+       self.last_maxexemptrate = default_maxexemptrate 
         self.reset(maxrate, maxexemptrate, bytes, exemptbytes)
 
     def __repr__(self):
@@ -111,11 +120,19 @@ class Slice:
         self.exemptbytes = exemptbytes
 
         # Query Node Manager for max rate overrides
-        (new_maxrate, new_maxexemptrate) = nm.query(self.name, [('nm_net_max_rate', -1), ('nm_net_max_exempt_rate', -1)])
-        if new_maxrate == -1:
-            new_maxrate = default_maxrate
-        if new_maxexemptrate == -1:
-            new_maxexemptrate = default_maxexemptrate
+       try:
+               vals = nm.query(self.name, [('nm_net_max_rate', self.last_maxrate),
+                               ('nm_net_max_exempt_rate', self.last_maxexemptrate),
+                               ('nm_net_avg_rate', self.last_avgrate),
+                               ('nm_net_avg_exempt_rate', self.last_avgexemptrate)])
+               (new_maxrate, new_maxexemptrate, 
+                       self.last_avgrate, self.last_avgexemptrate) = vals 
+               #If NM is alive, and there is a cap, update new
+               self.last_maxrate = new_maxrate
+               self.last_maxexemptrate = new_maxexemptrate
+
+       except Exception, err:
+               print "Warning: Exception received while querying NM:", err
 
         if new_maxrate != maxrate or new_maxexemptrate != maxexemptrate:
             print "%s reset to %s/%s" % \
@@ -136,13 +153,17 @@ class Slice:
         """
 
         # Query Node Manager for max average rate overrides
-        (self.avgrate, self.avgexemptrate) = nm.query(self.name, [('nm_net_avg_rate', -1), ('nm_net_avg_exempt_rate', -1)])
-        if self.avgrate == -1:
-            self.avgrate = default_avgrate
-        if self.avgexemptrate == -1:
-            self.avgexemptrate = default_avgexemptrate
-
-        # Prepare message parameters from the template
+       try:
+               (self.avgrate, self.avgexemptrate) = nm.query(self.name, 
+                       [('nm_net_avg_rate', self.last_avgrate), 
+                       ('nm_net_avg_exempt_rate', self.last_avgexemptrate)])
+               #If NM is alive, and there is a cap, update new
+               self.last_avgexemptrate = self.avgexemptrate
+               self.last_avgrate = self.avgrate
+        except Exception, err:
+                print "Warning: Exception received while querying NM:", err
+       # Prepare message parameters from the template
         message = ""
         params = {'slice': self.name, 'hostname': socket.gethostname(),
                   'since': time.asctime(time.gmtime(self.time)) + " GMT",
@@ -166,7 +187,7 @@ class Slice:
 
         if verbose:
             print "%(slice)s %(class)s " \
-                  "%(bytes)s/%(limit)s (%(maxrate)s/%(avgrate)s)" % \
+                  "%(bytes)s, %(limit)s (%(maxrate)s max/%(avgrate)s avg)" % \
                   params
 
         # Cap low bandwidth burst rate
@@ -190,7 +211,7 @@ class Slice:
 
         if verbose:
             print "%(slice)s %(class)s " \
-                  "%(bytes)s/%(limit)s (%(maxrate)s/%(avgrate)s)" % \
+                  "%(bytes)s, %(limit)s (%(maxrate)s max /%(avgrate)s avg)" % \
                   params
 
         # Cap high bandwidth burst rate
@@ -280,7 +301,7 @@ def main():
     root_xid = bwlimit.get_xid("root")
     default_xid = bwlimit.get_xid("default")
 
-    # Open connection to Node Manager
+    #Open connection to Node Manager
     nm = NM()
 
     live = []
@@ -304,6 +325,8 @@ def main():
         if names and name not in names:
             continue
 
+       #slices is populated from the pickle file
+       #xid is populated from bwlimit (read from /etc/passwd) 
         if slices.has_key(xid):
             slice = slices[xid]
             if time.time() >= (slice.time + period) or \