[tor-commits] [stem/master] Making the tor launching timeout an arg

atagar at torproject.org atagar at torproject.org
Thu Oct 27 03:30:03 UTC 2011


commit 8293c518d02f879110d45e0cff074e7d31d2fbfb
Author: Damian Johnson <atagar at torproject.org>
Date:   Fri Oct 21 07:28:27 2011 -0700

    Making the tor launching timeout an arg
    
    Moving the timeout for launching a tor process from being a constant to being
    an argument of the function.
---
 stem/process.py     |   27 +++++++++++++++++----------
 stem/util/system.py |    4 ++--
 2 files changed, 19 insertions(+), 12 deletions(-)

diff --git a/stem/process.py b/stem/process.py
index f049610..75e8f6f 100644
--- a/stem/process.py
+++ b/stem/process.py
@@ -8,17 +8,24 @@ import signal
 import subprocess
 
 # number of seconds before we time out our attempt to start a tor instance
-TOR_INIT_TIMEOUT = 90
+DEFAULT_INIT_TIMEOUT = 90
 
-def launch_tor(torrc_path, init_msg_handler = None):
+def launch_tor(torrc_path, init_msg_handler = None, timeout = DEFAULT_INIT_TIMEOUT):
   """
   Initializes a tor process. This blocks until initialization completes or we
   error out.
   
+  If tor's data directory is missing or stale then bootstrapping will include
+  making several requests to the directory authorities which can take a little
+  while. Usually this is done in 50 seconds or so, but occasionally calls seem
+  to get stuck, taking well over the default timeout.
+  
   Arguments:
     torrc_path (str)           - location of the torrc for us to use
     init_msg_handler (functor) - optional functor that will be provided with
                                  tor's initialization stdout as we get it
+    timeout (int)              - time after which the attempt to start tor is
+                                 aborted, no timeouts are applied if None
   
   Returns:
     subprocess.Popen instance for the tor subprocess
@@ -35,14 +42,14 @@ def launch_tor(torrc_path, init_msg_handler = None):
   # starts a tor subprocess, raising an OSError if it fails
   tor_process = subprocess.Popen(["tor", "-f", torrc_path], stdout = subprocess.PIPE, stderr = subprocess.PIPE)
   
-  # time ourselves out if we reach TOR_INIT_TIMEOUT
-  def timeout_handler(signum, frame):
-    # terminates the uninitialized tor process and raise on timeout
-    tor_process.kill()
-    raise OSError("reached a %i second timeout without success" % TOR_INIT_TIMEOUT)
-  
-  signal.signal(signal.SIGALRM, timeout_handler)
-  signal.alarm(TOR_INIT_TIMEOUT)
+  if timeout:
+    def timeout_handler(signum, frame):
+      # terminates the uninitialized tor process and raise on timeout
+      tor_process.kill()
+      raise OSError("reached a %i second timeout without success" % timeout)
+    
+    signal.signal(signal.SIGALRM, timeout_handler)
+    signal.alarm(timeout)
   
   while True:
     init_line = tor_process.stdout.readline().strip()
diff --git a/stem/util/system.py b/stem/util/system.py
index 5f7e9ca..a27c265 100644
--- a/stem/util/system.py
+++ b/stem/util/system.py
@@ -272,7 +272,7 @@ def call(command, suppress_exc = True):
   """
   Issues a command in a subprocess, blocking until completion and returning the
   results. This is not actually ran in a shell so pipes and other shell syntax
-  aren't permitted.
+  are not permitted.
   
   Arguments:
     command (str)       - command to be issued
@@ -280,7 +280,7 @@ def call(command, suppress_exc = True):
                           this raises the exception
   
   Returns:
-    List with the lines of output from the command, None in case of failure if
+    list with the lines of output from the command, None in case of failure if
     suppress_exc is True
   
   Raises:





More information about the tor-commits mailing list