[tor-commits] [ooni-probe/master] * Need to fix the Deferred class decorator timeout.

isis at torproject.org isis at torproject.org
Thu Oct 4 14:41:15 UTC 2012


commit 365bd5a1a631191808a110ded51f520806ab342e
Author: Isis Lovecruft <isis at torproject.org>
Date:   Fri Sep 28 05:37:49 2012 +0000

    * Need to fix the Deferred class decorator timeout.
---
 ooni/plugins/bridget.py |   20 +++++++++++---------
 ooni/utils/timer.py     |   31 +++++++++++++++++++++----------
 2 files changed, 32 insertions(+), 19 deletions(-)

diff --git a/ooni/plugins/bridget.py b/ooni/plugins/bridget.py
index 208b4c3..538e2f3 100644
--- a/ooni/plugins/bridget.py
+++ b/ooni/plugins/bridget.py
@@ -282,6 +282,7 @@ class BridgetTest(OONITest):
             from ooni.utils.onion   import start_tor, remove_public_relays
             from ooni.utils.onion   import setup_done, setup_fail
             from ooni.utils.onion   import CustomCircuit
+            from ooni.utils.timer   import timeout
             from ooni.lib.txtorcon  import TorConfig, TorState
         except ImportError:
             raise TxtorconImportError
@@ -365,19 +366,19 @@ class BridgetTest(OONITest):
             log.err("Attaching custom circuit builder failed: %s" % state)
 
 
-        log.msg("Bridget: initiating test ... ") ## Start the experiment
-        all_of_the_bridges = self.bridges['all']
-        all_of_the_relays  = self.relays['all']  ## Local copy of orginal lists
+        log.msg("Bridget: initiating test ... ")  ## Start the experiment
 
-        if self.bridges['remaining']() >= 1 and not 'Bridge' in self.config.config:
+        if self.bridges['remaining']() >= 1 \
+                and not 'Bridge' in self.config.config:
             self.bridges['current'] = self.bridges['all'][0]
             self.config.Bridge = self.bridges['current']
-                                                 ## avoid starting several
-            self.config.save()                   ## processes 
+                                                  ## avoid starting several
+            self.config.save()                    ## processes 
             assert self.config.config.has_key('Bridge'), "NO BRIDGE"
 
-            state = start_tor(reactor, self.config, self.control_port, 
-                              self.tor_binary, self.data_directory)
+            state = timeout(self.circuit_timeout)(start_tor(
+                    reactor, self.config, self.control_port, 
+                    self.tor_binary, self.data_directory))
             state.addCallbacks(setup_done, setup_fail)
             state.addCallback(remove_public_relays, self.bridges)
 
@@ -396,7 +397,8 @@ class BridgetTest(OONITest):
             all = []
             for bridge in self.bridges['all'][1:]:
                 self.bridges['current'] = bridge
-                new = defer.Deferred()
+                #new = defer.Deferred()
+                new = defer.waitForDeferred(state)
                 new.addCallback(reconfigure_bridge, state, self.bridges)
                 all.append(new)
 
diff --git a/ooni/utils/timer.py b/ooni/utils/timer.py
index 8ad9b79..24074f9 100644
--- a/ooni/utils/timer.py
+++ b/ooni/utils/timer.py
@@ -9,28 +9,39 @@
 # :copyright: copyright (c) 2012, Isis Lovecruft, The Tor Project Inc.
 # 
 
-
 class TimeoutError(Exception):
     """Raised when a timer runs out."""
     pass
 
-def timeout(secs, e=None):
+def timeout(seconds, e=None):
     """
-    A decorator for blocking methods to cause them to timeout.
+    A decorator for blocking methods to cause them to timeout. Can be used
+    like this: 
+        @timeout(30)
+        def foo():
+            for x in xrange(1000000000):
+                print x
+    or like this:
+        ridiculous = timeout(30)(foo)
+
+    :param seconds:
+        Number of seconds to wait before raising :class:`TimeoutError`.
+    :param e:
+        Error message to pass to :class:`TimeoutError`. Default None.
     """
-    import signal
-    import functools.wraps
+    from signal    import alarm, signal, SIGALRM
+    from functools import wraps
+
     def decorator(func):
         def _timeout(signum, frame):
             raise TimeoutError, e
-
         def wrapper(*args, **kwargs):
-            signal.signal(signal.SIGALRM, _timeout)
-            signal.alarm(secs)
+            signal(SIGALRM, _timeout)
+            alarm(seconds)
             try:
                 res = func(*args, **kwargs)
             finally:
-                signal.alarm(0)
+                alarm(0)
             return res
-        return functools.wraps(func)(wrapper)
+        return wraps(func)(wrapper)
     return decorator





More information about the tor-commits mailing list