commit f01a6fe970b676b224403774e084381c9e5ba493 Author: juga0 juga@riseup.net Date: Sun Jan 26 20:44:07 2020 +0000
new: relaylist: Keep relays not in last consensus
Keep the relays that are not in the the last consensus, but are not "old" yet.
Closes: #30727 --- sbws/lib/relaylist.py | 40 ++++++++++++++++++++++++++++++++++------ 1 file changed, 34 insertions(+), 6 deletions(-)
diff --git a/sbws/lib/relaylist.py b/sbws/lib/relaylist.py index 1fc650a..19c5073 100644 --- a/sbws/lib/relaylist.py +++ b/sbws/lib/relaylist.py @@ -9,6 +9,7 @@ import logging from threading import Lock
from ..globals import MEASUREMENTS_PERIOD +from ..util import timestamp
log = logging.getLogger(__name__)
@@ -288,6 +289,12 @@ class Relay: self.relay_recent_priority_list_count = 0 self.relay_recent_priority_list_count += 1
+ def is_old(self): + """Whether the last consensus seen for this relay is older than the + measurement period. + """ + return timestamp.is_old(self.last_consensus_timestamp) +
class RelayList: ''' Keeps a list of all relays in the current Tor network and updates it @@ -415,14 +422,20 @@ class RelayList: # Change to stem.descriptor.remote in future refactor. network_statuses = c.get_network_statuses() new_relays_dict = dict([(r.fingerprint, r) for r in network_statuses]) + log.debug("Number of relays in the current consensus: %d.", + len(new_relays_dict))
# Find the timestamp of the last consensus. timestamp = valid_after_from_network_statuses(network_statuses) self._consensus_timestamps.append(timestamp) self._remove_old_consensus_timestamps() - # Update the relays that were in the previous consensus with the - # new timestamp + new_relays = [] + + # Only or debugging, count the relays that are not in the current + # consensus and have not been seen in the last consensuses either. + num_old_relays = 0 + relays = copy.deepcopy(self._relays) for r in relays: if r.fingerprint in new_relays_dict.keys(): @@ -430,13 +443,28 @@ class RelayList: new_relays_dict.pop(r.fingerprint) new_relays.append(r)
- # Add the relays that were not in the previous consensus - # If there was an relay in some older previous consensus, - # it won't get stored, so its previous consensuses are lost, - # but probably this is fine for now to don't make it more complicated. + # If the relay is not in the current consensus but is not "old" + # yet, add it to the new list of relays too, though its timestamp, + # router status and descriptor can't be updated. + elif not r.is_old(self._measurements_period): + new_relays.append(r) + # Otherwise, don't add it to the new list of relays. + # For debugging, count the old relays that will be discarded. + else: + num_old_relays += 1 + + # Finally, add the relays that were not in the previous consensus for fp, ns in new_relays_dict.items(): r = Relay(ns.fingerprint, c, ns=ns, timestamp=timestamp) new_relays.append(r) + + log.debug("Previous number of relays being measured %d", + len(self._relays)) + log.debug("Number of relays not in the in the consensus in the last " + "%d days: %d.", + self._measurements_period, num_old_relays) + log.debug("Number of relays to measure with the current consensus: " + "%d", len(new_relays)) return new_relays
def _refresh(self):
tor-commits@lists.torproject.org