[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[or-cvs] r19628: {torctl} Fix infinite loop that can be caused by ExactUniformGenerato (torctl/trunk/python/TorCtl)
Author: mikeperry
Date: 2009-06-04 21:31:16 -0400 (Thu, 04 Jun 2009)
New Revision: 19628
Modified:
torctl/trunk/python/TorCtl/PathSupport.py
Log:
Fix infinite loop that can be caused by ExactUniformGenerator.
Modified: torctl/trunk/python/TorCtl/PathSupport.py
===================================================================
--- torctl/trunk/python/TorCtl/PathSupport.py 2009-06-04 23:16:29 UTC (rev 19627)
+++ torctl/trunk/python/TorCtl/PathSupport.py 2009-06-05 01:31:16 UTC (rev 19628)
@@ -646,6 +646,7 @@
class UniformGenerator(NodeGenerator):
"""NodeGenerator that produces nodes in the uniform distribution"""
def generate(self):
+ # XXX: hrmm.. this is not really the right thing to check
while not self.all_chosen():
yield random.choice(self.routers)
@@ -660,10 +661,17 @@
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():
+ while choices:
r = random.choice(choices)
yield r
-
+ choices.remove(r)
+
+ choices = filter(lambda r: r._generated[self.position]==min_gen,
+ self.routers)
+ plog("NOTICE", "Ran out of choices in ExactUniformGenerator. Incrementing nodes")
+ for r in choices:
+ r._generated[self.position] += 1
+
def mark_chosen(self, r):
r._generated[self.position] += 1
NodeGenerator.mark_chosen(self, r)
@@ -868,9 +876,12 @@
entry = self.entry_gen.generate()
mid = self.mid_gen.generate()
ext = self.exit_gen.generate()
+
+ plog("DEBUG", "Selecting path..")
while True:
path = []
+ plog("DEBUG", "Building path..")
try:
if pathlen == 1:
path = [ext.next()]
@@ -884,15 +895,18 @@
for i in xrange(1, pathlen-1):
self.mid_gen.mark_chosen(path[i])
self.exit_gen.mark_chosen(path[pathlen-1])
+ plog("DEBUG", "Marked path.")
break
+ else:
+ plog("DEBUG", "Path rejected by path restrictions.")
except StopIteration:
plog("NOTICE", "Ran out of routers during buildpath..");
self.entry_gen.rewind()
self.mid_gen.rewind()
self.exit_gen.rewind()
entry = self.entry_gen.generate()
- mid = self.entry_gen.generate()
- ext = self.entry_gen.generate()
+ mid = self.mid_gen.generate()
+ ext = self.exit_gen.generate()
for r in path:
r.refcount += 1
plog("DEBUG", "Circ refcount "+str(r.refcount)+" for "+r.idhex)