[tor-commits] [nyx/master] Populate consensus information

atagar at torproject.org atagar at torproject.org
Sun Oct 16 20:32:48 UTC 2016


commit 851474d9cbe8a80b105222c2b01a34bd8a2408bc
Author: Damian Johnson <atagar at torproject.org>
Date:   Sun Oct 16 13:29:42 2016 -0700

    Populate consensus information
    
    Earlier I dropped population of the ConsensusTracker because it was slow.
    Trouble is that this leaves us with a pretty broken connection panel.
    
    Fiddled with some options, and simply parsing the raw GETINFO response is
    really quick.
---
 nyx/tracker.py | 26 ++++++++++++++++++++++----
 1 file changed, 22 insertions(+), 4 deletions(-)

diff --git a/nyx/tracker.py b/nyx/tracker.py
index 7d567a9..204f97b 100644
--- a/nyx/tracker.py
+++ b/nyx/tracker.py
@@ -55,6 +55,7 @@ import time
 import threading
 
 import stem.control
+import stem.descriptor.router_status_entry
 
 from nyx import log, tor_controller
 from stem.util import conf, connection, enum, proc, str_tools, system
@@ -816,10 +817,27 @@ class ConsensusTracker(object):
     self._nickname_cache = {}  # fingerprint => nickname lookup cache
     self._address_cache = {}
 
-    tor_controller().add_event_listener(self._new_consensus_event, stem.control.EventType.NEWCONSENSUS)
+    # Stem's get_network_statuses() is slow, and overkill for what we need
+    # here. Just parsing the raw GETINFO response to cut startup time down.
 
-  def _new_consensus_event(self, event):
-    self.update(event.desc)
+    controller = tor_controller()
+    ns_response = controller.get_info('ns/all', None)
+
+    if ns_response:
+      for line in ns_response.splitlines():
+        if line.startswith('r '):
+          r_comp = line.split(' ')
+
+          address = r_comp[6]
+          or_port = int(r_comp[7])
+          fingerprint = stem.descriptor.router_status_entry._base64_to_hex(r_comp[2])
+          nickname = r_comp[1]
+
+          self._fingerprint_cache.setdefault(address, []).append((or_port, fingerprint))
+          self._address_cache[fingerprint] = (address, or_port)
+          self._nickname_cache[fingerprint] = nickname
+
+    controller.add_event_listener(lambda event: self.update(event.desc), stem.control.EventType.NEWCONSENSUS)
 
   def update(self, router_status_entries):
     """
@@ -835,7 +853,7 @@ class ConsensusTracker(object):
     for desc in router_status_entries:
       new_fingerprint_cache.setdefault(desc.address, []).append((desc.or_port, desc.fingerprint))
       new_address_cache[desc.fingerprint] = (desc.address, desc.or_port)
-      new_nickname_cache[desc.fingerprint] = desc.nickname if desc.nickname else 'Unnamed'
+      new_nickname_cache[desc.fingerprint] = desc.nickname
 
     self._fingerprint_cache = new_fingerprint_cache
     self._address_cache = new_address_cache



More information about the tor-commits mailing list