[tor-commits] [stem/master] Timeout stalled queries and installation

atagar at torproject.org atagar at torproject.org
Sun Aug 23 23:49:53 UTC 2020


commit a331ee334b5fa6ffcf5895a30c0f81e9ef7a2c13
Author: Damian Johnson <atagar at torproject.org>
Date:   Sun Aug 23 16:43:35 2020 -0700

    Timeout stalled queries and installation
    
    Couple good timeout suggestions from...
    
      https://github.com/torproject/stem/issues/61
---
 stem/control.py            | 7 ++++++-
 test/integ/installation.py | 8 +++++++-
 2 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/stem/control.py b/stem/control.py
index 7578f2b5..79d5881d 100644
--- a/stem/control.py
+++ b/stem/control.py
@@ -360,6 +360,7 @@ IMMUTABLE_CONFIG_OPTIONS = set(map(stem.util.str_tools._to_unicode, map(str.lowe
 ))))
 
 LOG_CACHE_FETCHES = True  # provide trace level logging for cache hits
+MSG_TIMEOUT = 5  # seconds to await a response from tor
 
 # Configuration options that are fetched by a special key. The keys are
 # lowercase to make case insensitive lookups easier.
@@ -693,7 +694,11 @@ class BaseController(Synchronous):
 
       try:
         await self._socket.send(message)
-        response = await self._reply_queue.get()
+
+        try:
+          response = await asyncio.wait_for(self._reply_queue.get(), MSG_TIMEOUT)
+        except asyncio.TimeoutError:
+          raise stem.ControllerError('%s failed to receive a reply within %i seconds' % (message, MSG_TIMEOUT))
 
         # If the message we received back had an exception then re-raise it to the
         # caller. Otherwise return the response.
diff --git a/test/integ/installation.py b/test/integ/installation.py
index 57618cc2..d78cdc2f 100644
--- a/test/integ/installation.py
+++ b/test/integ/installation.py
@@ -18,6 +18,7 @@ import test
 
 from stem.util.test_tools import asynchronous
 
+INSTALLATION_TIMEOUT = 20  # usually takes ~5s
 BASE_INSTALL_PATH = '/tmp/stem_test'
 PYTHON_EXE = sys.executable if sys.executable else 'python'
 INSTALL_MISMATCH_MSG = "Running 'python setup.py sdist' doesn't match our git contents in the following way. The manifest in our setup.py may need to be updated...\n\n"
@@ -131,8 +132,13 @@ class TestInstallation(unittest.TestCase):
     meant to test that our MANIFEST.in is up to date.
     """
 
+    started_at = time.time()
+
     while stem.util.system.is_running(dependency_pid):
-      time.sleep(0.1)  # we need to run these tests serially
+      if time.time() > started_at + INSTALLATION_TIMEOUT:
+        raise AssertionError('Stem failed to install within %i seconds' % INSTALLATION_TIMEOUT)
+
+      time.sleep(0.1)  # these tests must run serially
 
     git_dir = os.path.join(test.STEM_BASE, '.git')
 



More information about the tor-commits mailing list