[tor-commits] [sbws/master] fix: Store the error when there is not destination

juga at torproject.org juga at torproject.org
Wed Mar 27 09:59:23 UTC 2019


commit e835710e4a59c7255211e5a67a4e2a3b5c831371
Author: juga0 <juga at riseup.net>
Date:   Fri Mar 22 16:15:56 2019 +0000

    fix: Store the error when there is not destination
---
 sbws/core/scanner.py   | 27 ++++++++++++++++-----------
 sbws/lib/resultdump.py |  9 +++++++++
 2 files changed, 25 insertions(+), 11 deletions(-)

diff --git a/sbws/core/scanner.py b/sbws/core/scanner.py
index d82aaca..5b28637 100644
--- a/sbws/core/scanner.py
+++ b/sbws/core/scanner.py
@@ -13,7 +13,7 @@ from ..lib.circuitbuilder import GapsCircuitBuilder as CB
 from ..lib.resultdump import ResultDump
 from ..lib.resultdump import (
     ResultSuccess, ResultErrorCircuit, ResultErrorStream,
-    ResultErrorSecondRelay,  ResultError,  # ResultErrorDestination
+    ResultErrorSecondRelay,  ResultError, ResultErrorDestination
     )
 from ..lib.relaylist import RelayList
 from ..lib.relayprioritizer import RelayPrioritizer
@@ -261,20 +261,25 @@ def measure_relay(args, conf, destinations, cb, rl, relay):
                 ]
     # Pick a destionation
     dest = destinations.next()
-    # If there is no any destination at this point, it can not continue.
+    # When there're no any functional destinations.
     if not dest:
-        # XXX: this should return a ResultError
-        # instead of stopping the scanner once a destination can be recovered.
+        # NOTE: When there're still functional destinations but only one of
+        # them fail, the error will be included in `ResultErrorStream`.
+        # Since this is being executed in a thread, the scanner can not
+        # be stop here, but the `end_event` signal can be set so that the
+        # main thread stop the scanner.
+        # It might be useful to store the fact that the destinations fail,
+        # so store here the error, and set the signal once the error is stored
+        # (in `resultump`).
         log.critical("There are not any functional destinations.\n"
                      "It is recommended to set several destinations so that "
                      "the scanner can continue if one fails.")
-        # NOTE: Because this is executed in a thread, stop_threads can not
-        # be call from here, it has to be call from the main thread.
-        # Instead set the singleton end event, that will call stop_threads
-        # from the main process.
-        # Errors with only one destination are set in ResultErrorStream.
-        settings.end_event.set()
-        return None
+        reason = "No functional destinations"
+        # Resultdump will set end_event after storing the error
+        return [
+            ResultErrorDestination(relay, [], '', our_nick, msg=reason),
+        ]
+
     # Pick a relay to help us measure the given relay. If the given relay is an
     # exit, then pick a non-exit. Otherwise pick an exit.
     helper = None
diff --git a/sbws/lib/resultdump.py b/sbws/lib/resultdump.py
index 2ebfa20..f7ec55b 100644
--- a/sbws/lib/resultdump.py
+++ b/sbws/lib/resultdump.py
@@ -776,6 +776,15 @@ class ResultDump:
                   "destination {}: {}".format(
                     result.fingerprint, result.nickname, result.circ,
                     result.dest_url, result.msg)
+        # When the error is that there are not more functional destinations.
+        if result.type == "error-destination":
+            log.info("Shutting down because there are not functional "
+                     "destinations.")
+            # NOTE: Because this is executed in a thread, stop_threads can not
+            # be call from here, it has to be call from the main thread.
+            # Instead set the singleton end event, that will call stop_threads
+            # from the main process.
+            settings.end_event.set()
         log.info(msg)
 
     def enter(self):





More information about the tor-commits mailing list