Stores last values reported by NM. Uses cached vals if NM stops responding instead of
authorFaiyaz Ahmed <faiyaza@cs.princeton.edu>
Mon, 10 Jul 2006 15:19:35 +0000 (15:19 +0000)
committerFaiyaz Ahmed <faiyaza@cs.princeton.edu>
Mon, 10 Jul 2006 15:19:35 +0000 (15:19 +0000)
global defaults.

bwmon.py
pl_mom.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 \
index 51cb34e..0c05740 100644 (file)
--- a/pl_mom.py
+++ b/pl_mom.py
@@ -5,7 +5,7 @@
 # Mark Huang <mlhuang@cs.princeton.edu>
 # Copyright (C) 2006 The Trustees of Princeton University
 #
-# $Id: pl_mom.py,v 1.3 2006/05/09 03:22:25 mlhuang Exp $
+# $Id: pl_mom.py,v 1.4 2006/06/02 04:00:00 mlhuang Exp $
 #
 
 import os
@@ -167,11 +167,10 @@ class NM:
     Simple interface to local Node Manager API
     """
 
-    def __init__(self, url = "http://localhost:812/", timeout = 10):
+    def __init__(self, url = "http://localhost:812/", timeout = 30):
         """
         Open a new connection to the local Node Manager
         """
-
         socket.setdefaulttimeout(timeout)
         try:
             self.nm = xmlrpclib.ServerProxy(url)
@@ -190,8 +189,7 @@ class NM:
         values = [attribute[1] for attribute in attributes]
 
         if self.nm is not None:
-            try:
-                # Read rspec (the NM hash code for the slice)
+               # Read rspec (the NM hash code for the slice)
                 rcap = open("/var/run/pl_nm/%s.vm_rcap" % slice, "r")
                 rspec = rcap.readline().strip()
                 rcap.close()
@@ -199,7 +197,4 @@ class NM:
                 (rc, result) = self.nm.nm_inspect(rspec, attributes)
                if rc == 0 and type(result) == list and len(result) == len(values):
                    values = result
-            except Exception, err:
-                print "Warning: Exception received while querying Node Manager:", err
-
         return values