[tor-commits] [nyx/master] Speed connection panel up by a few seconds

atagar at torproject.org atagar at torproject.org
Tue Sep 22 17:08:39 UTC 2015


commit 6f91af2feb26e915fdc418e335a20232a7b7e9b4
Author: Damian Johnson <atagar at torproject.org>
Date:   Sun Jul 12 12:40:44 2015 -0700

    Speed connection panel up by a few seconds
    
    The slowest part of initializing the connection panel is issuing the 'GETINFO
    ns/all' query to populate the FingerprintTracker. When the user starts nyx then
    immediately goes to the connection page this is a noticeable 3-4 second lag.
    
    Doing this asynchronously in the connection panel's thread, at the *end* of
    processing the first results. As a result the user doesn't see this lag at all.
    Rather, if they immediately go to the connection page the fingerprints and
    nicknames will simply be 'UNKNOWN' for a few seconds. Much better. :P
---
 nyx/connections/conn_entry.py |   20 +++++++++++++-------
 nyx/connections/conn_panel.py |    9 +++++++++
 2 files changed, 22 insertions(+), 7 deletions(-)

diff --git a/nyx/connections/conn_entry.py b/nyx/connections/conn_entry.py
index cd463be..5cb4274 100644
--- a/nyx/connections/conn_entry.py
+++ b/nyx/connections/conn_entry.py
@@ -65,7 +65,7 @@ def get_fingerprint_tracker():
   global FINGERPRINT_TRACKER
 
   if FINGERPRINT_TRACKER is None:
-    FINGERPRINT_TRACKER = FingerprintTracker(tor_controller().get_network_statuses([]))
+    FINGERPRINT_TRACKER = FingerprintTracker()
 
   return FINGERPRINT_TRACKER
 
@@ -892,23 +892,29 @@ class ConnectionLine(entries.ConnectionPanelLine):
 
 
 class FingerprintTracker:
-  def __init__(self, router_status_entries):
+  def __init__(self):
     self._fingerprint_cache = {}  # {address => [(port, fingerprint), ..]} for relays
     self._nickname_cache = {}  # fingerprint => nickname lookup cache
 
-    for desc in router_status_entries:
-      self._fingerprint_cache.setdefault(desc.address, []).append((desc.or_port, desc.fingerprint))
-
     tor_controller().add_event_listener(self._new_consensus_event, stem.control.EventType.NEWCONSENSUS)
 
   def _new_consensus_event(self, event):
+    self._nickname_cache = {}
+    self.update(event.desc)
+
+  def update(self, router_status_entries):
+    """
+    Updates our cache with the given router status entries.
+
+    :param list router_status_entries: router status entries to populate our cache with
+    """
+
     new_fingerprint_cache = {}
 
-    for desc in event.desc:
+    for desc in router_status_entries:
       new_fingerprint_cache.setdefault(desc.address, []).append((desc.or_port, desc.fingerprint))
 
     self._fingerprint_cache = new_fingerprint_cache
-    self._nickname_cache = {}
 
   def get_relay_fingerprint(self, address, port = None):
     """
diff --git a/nyx/connections/conn_panel.py b/nyx/connections/conn_panel.py
index 2be5f8b..83b9d3a 100644
--- a/nyx/connections/conn_panel.py
+++ b/nyx/connections/conn_panel.py
@@ -325,6 +325,15 @@ class ConnectionPanel(panel.Panel, threading.Thread):
 
       self._update()
       self.redraw(True)
+
+      # If this is our first run then fill in our fingerprint tracker. This
+      # requires fetching all the router status entries which takes a few
+      # seconds, so best done when we're finished with the rest of the first
+      # iteration to hide the lag.
+
+      if last_ran == -1:
+        conn_entry.get_fingerprint_tracker().update(tor_controller().get_network_statuses([]))
+
       last_ran = time.time()
 
   def get_help(self):





More information about the tor-commits mailing list