[tor-commits] [doctor/master] resolve ticket 32842

atagar at torproject.org atagar at torproject.org
Sat Dec 28 21:56:34 UTC 2019


commit 5303c453120378be89c478ce1cc40db5302c44ec
Author: Starlight <starlight at binnacle.cx>
Date:   Sat Dec 28 14:51:19 2019 -0500

    resolve ticket 32842
    
    replace hard coded exclusion of authority tor26 with three
    lists that during checks determine which authorities to not
    a) check reachability for
    b) check presence in consensus for
    c) request and validate documents from
    
    correct defect where router-line IPv4 OR address was not
    checked for reachability
    
    eliminate Python 3 exception by truncating array index
    expression result to integer (further 2to3 revisions
    applied during testing but not committed)
---
 consensus_health_checker.py | 27 ++++++++++++++++++++-------
 descriptor_checker.py       |  8 ++++++--
 2 files changed, 26 insertions(+), 9 deletions(-)

diff --git a/consensus_health_checker.py b/consensus_health_checker.py
index eb4620c..cb512b0 100755
--- a/consensus_health_checker.py
+++ b/consensus_health_checker.py
@@ -26,7 +26,12 @@ from stem.util.lru_cache import lru_cache
 Runlevel = stem.util.enum.UppercaseEnum('NOTICE', 'WARNING', 'ERROR')
 
 DIRECTORY_AUTHORITIES = stem.directory.Authority.from_cache()
-del DIRECTORY_AUTHORITIES['tor26']  # DirPort does not service requests without a '.z' suffix
+
+DIRAUTH_SKIP_REACHABLE = ()
+DIRAUTH_SKIP_SEEN = ()
+DIRAUTH_SKIP_CHECKS = (
+  'tor26'   # tor26 DirPort does not service requests without a .z suffix
+)
 
 EMAIL_SUBJECT = 'Consensus issues'
 BANDWIDTH_AUTHORITIES = ('moria1', 'gabelmoo', 'maatuska', 'Faravahar', 'bastet', 'longclaw')
@@ -636,10 +641,8 @@ def has_authority_flag(latest_consensus, consensuses, votes):
 
   for desc in latest_consensus.routers.values():
     if Flag.AUTHORITY in desc.flags:
-      seen_authorities.add(desc.nickname)
-
-  if 'tor26' in seen_authorities:
-    seen_authorities.remove('tor26')
+      if not desc.nickname in DIRAUTH_SKIP_SEEN:
+        seen_authorities.add(desc.nickname)
 
   known_authorities = set(DIRECTORY_AUTHORITIES.keys())
   missing_authorities = known_authorities.difference(seen_authorities)
@@ -823,9 +826,15 @@ def is_orport_reachable(latest_consensus, consensuses, votes):
     if not desc:
       continue  # authority isn't in the consensus
 
+    if authority.nickname in DIRAUTH_SKIP_REACHABLE:
+      continue  # reachability of authority impaired
+
+    issue = util.check_reachability(desc.address, desc.or_port)
+    if issue:
+      issues.append(Issue(Runlevel.WARNING, 'UNABLE_TO_REACH_ORPORT', authority = authority.nickname, address = desc.address, port = desc.or_port, error = issue, to = [authority]))
+
     for address, port, is_ipv6 in desc.or_addresses:
       issue = util.check_reachability(address, port)
-
       if issue:
         issues.append(Issue(Runlevel.WARNING, 'UNABLE_TO_REACH_ORPORT', authority = authority.nickname, address = address, port = port, error = issue, to = [authority]))
 
@@ -956,9 +965,13 @@ def _get_documents(label, resource):
   documents, times_taken, clock_skew, issues = {}, {}, {}, []
 
   for authority in DIRECTORY_AUTHORITIES.values():
+
     if authority.v3ident is None:
       continue  # not a voting authority
 
+    if authority.nickname in DIRAUTH_SKIP_CHECKS:
+      continue  # checking of authority impaired
+
     query = downloader.query(
       resource,
       endpoints = [(authority.address, authority.dir_port)],
@@ -976,7 +989,7 @@ def _get_documents(label, resource):
       issues.append(Issue(Runlevel.ERROR, 'AUTHORITY_UNAVAILABLE', fetch_type = label, authority = authority.nickname, url = query.download_url, error = exc, to = [authority.nickname]))
 
   if label == 'consensus' and times_taken:
-    median_time = sorted(times_taken.values())[len(times_taken) / 2]
+    median_time = sorted(times_taken.values())[int(len(times_taken) / 2)]
     authority_times = ', '.join(['%s => %0.1fs' % (authority, time_taken) for authority, time_taken in times_taken.items()])
 
     for nickname, time_taken in times_taken.items():
diff --git a/descriptor_checker.py b/descriptor_checker.py
index 1d464f8..a0f5db3 100755
--- a/descriptor_checker.py
+++ b/descriptor_checker.py
@@ -29,6 +29,10 @@ time: %s
 error: %s
 """
 
+DIRAUTH_SKIP_CHECKS = (
+  'tor26'   # tor26 DirPort does not service requests without a .z suffix
+)
+
 log = util.get_logger('descriptor_checker')
 util.log_stem_debugging('descriptor_checker')
 
@@ -65,8 +69,8 @@ def main():
   for authority in stem.directory.Authority.from_cache().values():
     if authority.v3ident is None:
       continue  # authority doesn't vote in the consensus
-    elif authority.nickname == 'tor26':
-      continue  # DirPort doesn't accept requests without a .z suffix
+    elif authority.nickname in DIRAUTH_SKIP_CHECKS:
+      continue  # checking of authority impaired
 
     log.debug("Downloading the consensus from %s..." % authority.nickname)
 





More information about the tor-commits mailing list