[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[tor-commits] [sbws/maint-1.1] relaylist: stop using the current time when a consensus is downloaded twice
commit 3a521cc575f32573dba27abda09c057920ee2eba
Author: teor <teor@xxxxxxxxxxxxxx>
Date: Mon Jun 17 18:13:33 2019 +1000
relaylist: stop using the current time when a consensus is downloaded twice
Instead:
* use the consensus valid-after time, or
* use the supplied timestamp, or
* warn and use the current time.
This should fix the occasional CI failure, when the current time is 1 second
later than the test consensus time. (Or it should warn, and we can fix the
test code.)
Fixes bug 30909; bugfix on 1.1.0.
---
sbws/lib/relaylist.py | 51 ++++++++++++++++++++++++++++++++-------------------
1 file changed, 32 insertions(+), 19 deletions(-)
diff --git a/sbws/lib/relaylist.py b/sbws/lib/relaylist.py
index 289e0d2..1fc650a 100644
--- a/sbws/lib/relaylist.py
+++ b/sbws/lib/relaylist.py
@@ -175,34 +175,47 @@ class Relay:
return self._consensus_timestamps[-1]
return None
+ def _append_consensus_timestamp_if_later(self, timestamp):
+ """Append timestamp to the list of consensus timestamps, if it is later
+ than the most recent existing timestamp, or there are no timestamps.
+ Should only be called by _add_consensus_timestamp().
+ timestamp must not be None, and it must not be zero.
+ """
+ if not timestamp:
+ log.info('Bad timestamp %s, skipping consensus timestamp '
+ 'update for relay %s', timestamp, self.fingerprint)
+ return
+ # The consensus timestamp list was initialized.
+ if self.last_consensus_timestamp is not None:
+ # timestamp is more recent than the most recent stored
+ # consensus timestamp.
+ if timestamp > self.last_consensus_timestamp:
+ # Add timestamp
+ self._consensus_timestamps.append(timestamp)
+ # The consensus timestamp list was not initialized.
+ else:
+ # Add timestamp
+ self._consensus_timestamps.append(timestamp)
+
def _add_consensus_timestamp(self, timestamp=None):
"""Add the consensus timestamp in which this relay is present.
"""
# It is possible to access to the relay's consensensus Valid-After
+ # so believe it, rather than the supplied timestamp
if self.consensus_valid_after is not None:
- # The consensus timestamp list was initialized.
- if self.last_consensus_timestamp is not None:
- # Valid-After is more recent than the most recent stored
- # consensus timestamp.
- if self.consensus_valid_after > self.last_consensus_timestamp:
- # Add Valid-After
- self._consensus_timestamps.append(
- self.consensus_valid_after
- )
- # The consensus timestamp list was not initialized.
- else:
- # Add Valid-After
- self._consensus_timestamps.append(self.consensus_valid_after)
- # If there was already a list the timestamp arg is more recent than
- # the most recent timestamp stored,
- elif (self.last_consensus_timestamp is not None
- and timestamp > self.last_consensus_timestamp):
+ self._append_consensus_timestamp_if_later(
+ self.consensus_valid_after
+ )
+ elif timestamp:
# Add the arg timestamp.
- self._consensus_timestamps.append(timestamp)
+ self._append_consensus_timestamp_if_later(timestamp)
# In any other case
else:
+ log.warning('Bad timestamp %s, using current time for consensus '
+ 'timestamp update for relay %s',
+ timestamp, self.fingerprint)
# Add the current datetime
- self._consensus_timestamps.append(
+ self._append_consensus_timestamp_if_later(
datetime.utcnow().replace(microsecond=0))
def _remove_old_consensus_timestamps(
_______________________________________________
tor-commits mailing list
tor-commits@xxxxxxxxxxxxxxxxxxxx
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits