[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