[tor-commits] [sbws/master] chg: scanner: Add function to finish the results

juga at torproject.org juga at torproject.org
Thu Mar 21 18:30:42 UTC 2019


commit dd9cb438f3c271d1b4fff0004c3a8c49512712cf
Author: juga0 <juga at riseup.net>
Date:   Mon Mar 4 18:53:29 2019 +0000

    chg: scanner: Add function to finish the results
---
 sbws/core/scanner.py | 30 ++++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)

diff --git a/sbws/core/scanner.py b/sbws/core/scanner.py
index 484a440..2e88b53 100644
--- a/sbws/core/scanner.py
+++ b/sbws/core/scanner.py
@@ -7,6 +7,8 @@ import threading
 import traceback
 import uuid
 
+from multiprocessing.context import TimeoutError
+
 from ..lib.circuitbuilder import GapsCircuitBuilder as CB
 from ..lib.resultdump import ResultDump
 from ..lib.resultdump import ResultSuccess, ResultErrorCircuit
@@ -508,6 +510,34 @@ def wait_for_results(time_to_sleep, pending_results):
         dumpstacks()
 
 
+def force_get_results(pending_results):
+    """Try to get either the result or an exception, which is logged.
+
+    Get call by ``wait_for_results`` when the time waiting was already long.
+    To get either the Result or an exception, call `get` with timeout.
+    Timeout is low since we already waited.
+    `get` is not call before, because it blocks and the callbacks are not call.
+    """
+    for r in pending_results:
+        try:
+            result = r.get(timeout=0.1)
+            log.warning("Result %s was not stored, it took too long.",
+                        result)
+        # TimeoutError is raised when the result is not ready, ie. has not
+        # been processed yet
+        except TimeoutError:
+            log.warning("A result was not stored, it was not ready.")
+        # If the result raised an exception, get returns it,
+        # so, log any exception so that it can be fixed.
+        # This should not happen, since callback_err would have been call first
+        except Exception as e:
+            log.critical(FILLUP_TICKET_MSG)
+            log.exception("exception %s", e)
+            # if the exception happened in the threads:
+            log.warning("traceback %s",
+                        traceback.print_exception(type(e), e, e.__traceback__))
+
+
 def run_speedtest(args, conf):
     """Initializes all the data and threads needed to measure the relays.
 





More information about the tor-commits mailing list