[tor-commits] [tor/master] Avoid an error in the fallback script when a fallback doesn't have any uptime

nickm at torproject.org nickm at torproject.org
Tue Dec 20 23:38:54 UTC 2016


commit 53ec0874504133f089ec422f6a97b2b3f58ae8db
Author: teor <teor2345 at gmail.com>
Date:   Sun Dec 11 22:47:00 2016 +1100

    Avoid an error in the fallback script when a fallback doesn't have any uptime
    
    Sometimes, the fallback generation script doesn't add attributes to the
    fallbacks in the list. If this happens, log an error, and avoid selecting
    that fallback.
    
    This is a rare issue: it should not change selection behaviour.
    
    Fixes issue #20945.
---
 changes/fallbacks-201612            |  2 ++
 scripts/maint/updateFallbackDirs.py | 67 ++++++++++++++++++++-----------------
 2 files changed, 38 insertions(+), 31 deletions(-)

diff --git a/changes/fallbacks-201612 b/changes/fallbacks-201612
index 03d9843..d9a67fd 100644
--- a/changes/fallbacks-201612
+++ b/changes/fallbacks-201612
@@ -33,3 +33,5 @@
       OnionOO. When a relay operator has multiple relays, this prioritises
       relays that are up over relays that are down.
       Closes ticket #20926; bugfix on 0.2.8.3-alpha.
+    - Stop failing when a relay has no uptime data in updateFallbackDirs.py.
+      Closes ticket 20945; bugfix on tor-0.2.8.1-alpha.
diff --git a/scripts/maint/updateFallbackDirs.py b/scripts/maint/updateFallbackDirs.py
index 4f60fd4..e0bc939 100755
--- a/scripts/maint/updateFallbackDirs.py
+++ b/scripts/maint/updateFallbackDirs.py
@@ -862,37 +862,42 @@ class Candidate(object):
       self._badexit = self._avg_generic_history(badexit) / ONIONOO_SCALE_ONE
 
   def is_candidate(self):
-    if (MUST_BE_RUNNING_NOW and not self.is_running()):
-      logging.info('%s not a candidate: not running now, unable to check ' +
-                   'DirPort consensus download', self._fpr)
-      return False
-    if (self._data['last_changed_address_or_port'] >
-        self.CUTOFF_ADDRESS_AND_PORT_STABLE):
-      logging.info('%s not a candidate: changed address/port recently (%s)',
-                   self._fpr, self._data['last_changed_address_or_port'])
-      return False
-    if self._running < CUTOFF_RUNNING:
-      logging.info('%s not a candidate: running avg too low (%lf)',
-                   self._fpr, self._running)
-      return False
-    if self._v2dir < CUTOFF_V2DIR:
-      logging.info('%s not a candidate: v2dir avg too low (%lf)',
-                   self._fpr, self._v2dir)
-      return False
-    if self._badexit is not None and self._badexit > PERMITTED_BADEXIT:
-      logging.info('%s not a candidate: badexit avg too high (%lf)',
-                   self._fpr, self._badexit)
-      return False
-    # this function logs a message depending on which check fails
-    if not self.is_valid_version():
-      return False
-    if self._guard < CUTOFF_GUARD:
-      logging.info('%s not a candidate: guard avg too low (%lf)',
-                   self._fpr, self._guard)
-      return False
-    if (not self._data.has_key('consensus_weight')
-        or self._data['consensus_weight'] < 1):
-      logging.info('%s not a candidate: consensus weight invalid', self._fpr)
+    try:
+      if (MUST_BE_RUNNING_NOW and not self.is_running()):
+        logging.info('%s not a candidate: not running now, unable to check ' +
+                     'DirPort consensus download', self._fpr)
+        return False
+      if (self._data['last_changed_address_or_port'] >
+          self.CUTOFF_ADDRESS_AND_PORT_STABLE):
+        logging.info('%s not a candidate: changed address/port recently (%s)',
+                     self._fpr, self._data['last_changed_address_or_port'])
+        return False
+      if self._running < CUTOFF_RUNNING:
+        logging.info('%s not a candidate: running avg too low (%lf)',
+                     self._fpr, self._running)
+        return False
+      if self._v2dir < CUTOFF_V2DIR:
+        logging.info('%s not a candidate: v2dir avg too low (%lf)',
+                     self._fpr, self._v2dir)
+        return False
+      if self._badexit is not None and self._badexit > PERMITTED_BADEXIT:
+        logging.info('%s not a candidate: badexit avg too high (%lf)',
+                     self._fpr, self._badexit)
+        return False
+      # this function logs a message depending on which check fails
+      if not self.is_valid_version():
+        return False
+      if self._guard < CUTOFF_GUARD:
+        logging.info('%s not a candidate: guard avg too low (%lf)',
+                     self._fpr, self._guard)
+        return False
+      if (not self._data.has_key('consensus_weight')
+          or self._data['consensus_weight'] < 1):
+        logging.info('%s not a candidate: consensus weight invalid', self._fpr)
+        return False
+    except BaseException as e:
+      logging.warning("Exception %s when checking if fallback is a candidate",
+                      str(e))
       return False
     return True
 





More information about the tor-commits mailing list