[or-cvs] r19536: {torctl} Implement ExactUniformGenerator. Replace usage of UniformGen (torctl/trunk/python/TorCtl)

mikeperry at seul.org mikeperry at seul.org
Tue May 19 09:55:10 UTC 2009


Author: mikeperry
Date: 2009-05-19 05:55:10 -0400 (Tue, 19 May 2009)
New Revision: 19536

Modified:
   torctl/trunk/python/TorCtl/PathSupport.py
   torctl/trunk/python/TorCtl/StatsSupport.py
   torctl/trunk/python/TorCtl/TorCtl.py
Log:

Implement ExactUniformGenerator. Replace usage of UniformGenerator with
ExactUniformGenerator.



Modified: torctl/trunk/python/TorCtl/PathSupport.py
===================================================================
--- torctl/trunk/python/TorCtl/PathSupport.py	2009-05-18 20:45:37 UTC (rev 19535)
+++ torctl/trunk/python/TorCtl/PathSupport.py	2009-05-19 09:55:10 UTC (rev 19536)
@@ -624,7 +624,34 @@
     while not self.all_chosen():
       yield random.choice(self.routers)
      
+class ExactUniformGenerator(NodeGenerator):
+  """NodeGenerator that produces nodes randomly, yet strictly uniformly 
+     over time"""
+  def __init__(self, sorted_r, rstr_list, position=0):
+    self.position = position
+    NodeGenerator.__init__(self, sorted_r, rstr_list)  
 
+  def generate(self):
+    min_gen = min(map(lambda r: r._generated[self.position], self.routers))
+    choices = filter(lambda r: r._generated[self.position]==min_gen, 
+                       self.routers)
+    while not self.all_chosen():
+      r = random.choice(choices)
+      yield r
+      
+  def mark_chosen(self, r):
+    r._generated[self.position] += 1
+    NodeGenerator.mark_chosen(self, r)
+
+  def rebuild(self, sorted_r=None):
+    NodeGenerator.rebuild(self, sorted_r)
+    for r in self.rstr_routers:
+      lgen = len(r._generated)
+      if lgen < self.position+1:
+        for i in xrange(lgen, self.position+1):
+          r._generated.append(0)
+
+
 class OrderedExitGenerator(NodeGenerator):
   """NodeGenerator that produces exits in an ordered fashion for a 
      specific port"""
@@ -1054,14 +1081,14 @@
         exitgen = self.__ordered_exit_gen = \
           OrderedExitGenerator(80, sorted_r, self.exit_rstr)
     elif self.uniform:
-      exitgen = UniformGenerator(sorted_r, self.exit_rstr)
+      exitgen = ExactUniformGenerator(sorted_r, self.exit_rstr)
     else:
       exitgen = BwWeightedGenerator(sorted_r, self.exit_rstr, self.pathlen, exit=True)
 
     if self.uniform:
       self.path_selector = PathSelector(
-         UniformGenerator(sorted_r, entry_rstr),
-         UniformGenerator(sorted_r, mid_rstr),
+         ExactUniformGenerator(sorted_r, entry_rstr),
+         ExactUniformGenerator(sorted_r, mid_rstr),
          exitgen, self.path_rstr)
     else:
       # Remove ConserveExitsRestrictions for entry and middle positions
@@ -1213,7 +1240,7 @@
   schedule_* functions to schedule work to be done in the thread
   of the EventHandler.
   """
-  def __init__(self, c, selmgr, RouterClass):
+  def __init__(self, c, selmgr, RouterClass=TorCtl.Router):
     """Constructor. 'c' is a Connection, 'selmgr' is a SelectionManager,
     and 'RouterClass' is a class that inherits from Router and is used
     to create annotated Routers."""
@@ -1245,6 +1272,15 @@
     """
     self.low_prio_jobs.put(job)
 
+  def reset(self):
+    """
+    Resets accumulated state. Currently only clears the 
+    ExactUniformGenerator state.
+    """
+    for r in self.routers.itervalues():
+      for g in xrange(0, len(r._generated)):
+        r._generated[g] = 0
+
   def schedule_selmgr(self, job):
     """
     Schedules an immediate job to be run before the next event is

Modified: torctl/trunk/python/TorCtl/StatsSupport.py
===================================================================
--- torctl/trunk/python/TorCtl/StatsSupport.py	2009-05-18 20:45:37 UTC (rev 19535)
+++ torctl/trunk/python/TorCtl/StatsSupport.py	2009-05-19 09:55:10 UTC (rev 19536)
@@ -654,6 +654,10 @@
 
     # FIXME: sort+print by circ extend time
 
+  def reset(self):
+    PathSupport.PathBuilder.reset(self)
+    self.reset_stats()
+
   def reset_stats(self):
     plog("DEBUG", "Resetting stats")
     self.circ_count = 0

Modified: torctl/trunk/python/TorCtl/TorCtl.py
===================================================================
--- torctl/trunk/python/TorCtl/TorCtl.py	2009-05-18 20:45:37 UTC (rev 19535)
+++ torctl/trunk/python/TorCtl/TorCtl.py	2009-05-19 09:55:10 UTC (rev 19536)
@@ -294,6 +294,7 @@
     self.contact = contact
     self.rate_limited = rate_limited
     self.orhash = orhash
+    self._generated = [] # For ExactUniformGenerator
 
   def __str__(self):
     s = self.idhex, self.nickname



More information about the tor-commits mailing list