[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[or-cvs] r19577: {torflow} Add timer to work around Tor exit node stream hang bug. (in torflow/trunk/NetworkScanners/BwAuthority: . scanner.1)



Author: mikeperry
Date: 2009-05-28 08:21:01 -0400 (Thu, 28 May 2009)
New Revision: 19577

Modified:
   torflow/trunk/NetworkScanners/BwAuthority/bwauthority.py
   torflow/trunk/NetworkScanners/BwAuthority/scanner.1/bwauthority.cfg
Log:

Add timer to work around Tor exit node stream hang bug.



Modified: torflow/trunk/NetworkScanners/BwAuthority/bwauthority.py
===================================================================
--- torflow/trunk/NetworkScanners/BwAuthority/bwauthority.py	2009-05-28 11:50:55 UTC (rev 19576)
+++ torflow/trunk/NetworkScanners/BwAuthority/bwauthority.py	2009-05-28 12:21:01 UTC (rev 19577)
@@ -67,8 +67,10 @@
   save_every = config.getint('BwAuthority', 'save_every')
   circs_per_node = config.getint('BwAuthority', 'circs_per_node')
   out_dir = config.get('BwAuthority', 'out_dir')
+  max_fetch_time = config.getint('BwAuthority', 'max_fetch_time')
 
-  return (start_pct,stop_pct,nodes_per_slice,save_every,circs_per_node,out_dir)
+  return (start_pct,stop_pct,nodes_per_slice,save_every,
+            circs_per_node,out_dir,max_fetch_time)
 
 def choose_url(percentile):
   for (pct, url) in urls:
@@ -170,6 +172,18 @@
     cond.wait()
     cond.release()
 
+  def close_streams(self, reason):
+    cond = threading.Condition()
+    def notlambda(this):
+      cond.acquire()
+      this.close_all_streams(reason)
+      cond.notify()
+      cond.release()
+    cond.acquire()
+    self.schedule_low_prio(notlambda)
+    cond.wait()
+    cond.release()
+
   def new_exit(self):
     cond = threading.Condition()
     def notlambda(this):
@@ -254,7 +268,8 @@
     traceback.print_exc()
     return 0 
 
-def speedrace(hdlr, start_pct, stop_pct, circs_per_node, save_every, out_dir):
+def speedrace(hdlr, start_pct, stop_pct, circs_per_node, save_every, out_dir, 
+              max_fetch_time):
   hdlr.set_pct_rstr(start_pct, stop_pct)
 
   attempt = 0
@@ -265,10 +280,16 @@
     attempt += 1
     
     t0 = time()
+    # XXX: This noise is due to a difficult to find Tor bug that
+    # causes some exits to hang forever on streams :(
+    timer = threading.Timer(max_fetch_time, lambda: hdlr.close_streams(7))
+    timer.start()
     ret = http_request(choose_url(start_pct))
+    timer.cancel()
+
     delta_build = time() - t0
-    if delta_build >= 550.0:
-      plog('NOTICE', 'Timer exceeded limit: ' + str(delta_build) + '\n')
+    if delta_build >= max_fetch_time:
+      plog('WARN', 'Timer exceeded limit: ' + str(delta_build) + '\n')
 
     build_exit = hdlr.get_exit_node()
     if ret == 1:
@@ -291,7 +312,7 @@
 def main(argv):
   TorUtil.read_config(argv[1]) 
   (start_pct,stop_pct,nodes_per_slice,save_every,
-         circs_per_node,out_dir) = read_config(argv[1])
+         circs_per_node,out_dir,max_fetch_time) = read_config(argv[1])
  
   try:
     (c,hdlr) = setup_handler()
@@ -315,7 +336,8 @@
       hdlr.commit()
       plog('DEBUG', 'Reset stats')
 
-      speedrace(hdlr, pct, pct+pct_step, circs_per_node, save_every, out_dir)
+      speedrace(hdlr, pct, pct+pct_step, circs_per_node, save_every, out_dir,
+                max_fetch_time)
 
       plog('DEBUG', 'speedroced')
       hdlr.commit()

Modified: torflow/trunk/NetworkScanners/BwAuthority/scanner.1/bwauthority.cfg
===================================================================
--- torflow/trunk/NetworkScanners/BwAuthority/scanner.1/bwauthority.cfg	2009-05-28 11:50:55 UTC (rev 19576)
+++ torflow/trunk/NetworkScanners/BwAuthority/scanner.1/bwauthority.cfg	2009-05-28 12:21:01 UTC (rev 19577)
@@ -15,4 +15,5 @@
 stop_pct = 15
 save_every = 10
 nodes_per_slice = 50
-circs_per_node = 7
+circs_per_node = 2
+max_fetch_time = 1800