[tor-commits] [sbws/master] Merge branch 'ticket28563_rebased_ticket28565'
juga at torproject.org
juga at torproject.org
Thu Mar 21 18:30:42 UTC 2019
commit 6070d36022dc2130518dd0c68332166b2bf76c73
Merge: f9df765 4729aa8
Author: juga0 <juga at riseup.net>
Date: Thu Mar 21 14:14:33 2019 +0000
Merge branch 'ticket28563_rebased_ticket28565'
Conflicts:
sbws/lib/v3bwfile.py
tests/unit/lib/test_v3bwfile.py
sbws/lib/v3bwfile.py | 98 +++++++++++++++++++++++++++++------------
tests/unit/lib/test_v3bwfile.py | 17 +++++--
2 files changed, 84 insertions(+), 31 deletions(-)
diff --cc sbws/lib/v3bwfile.py
index 6a433d0,50e353c..34e988c
--- a/sbws/lib/v3bwfile.py
+++ b/sbws/lib/v3bwfile.py
@@@ -598,41 -547,63 +604,72 @@@ class V3BWLine(object)
# explained the what it means the strings returned.
# They rules were introduced in #28061 and #27338
# In #28565 we introduce the KeyValues to know why they're excluded.
- # In #28563 will include again these lines, but make them unparseable
- # by Tor.
+ # In #28563 we report these relays, but make Tor ignore them.
# This might confirm #28042.
+ # If the relay is non-`eligible`:
+ # Create a bandwidth line with the relay, but set ``vote=0`` so that
+ # Tor versions with patch #29806 does not vote on the relay.
+ # Set ``bw=1`` so that Tor versions without the patch,
+ # will give the relay low bandwidth.
+ # Include ``unmeasured=1`` in case Tor would vote on unmeasured relays
+ # in future versions.
+ # And return because there are not bandwidth values.
+ # NOTE: the bandwidth values could still be obtained if:
+ # 1. ``ResultError`` will store them
+ # 2. assign ``results_recent = results`` when there is a ``exclusion
+ # reason.
+ # This could be done in a better way as part of a refactor #28684.
+
+ kwargs['vote'] = '0'
+ kwargs['unmeasured'] = '1'
+
+ exclusion_reason = None
- kwargs['relay_recent_measurement_exclusion_not_success_count'] = \
- len(results) - len(success_results)
++
+ number_excluded_error = len(results) - len(success_results)
+ if number_excluded_error > 0:
+ # then the number of error results is the number of results
+ kwargs['relay_recent_measurements_excluded_error_count'] = \
+ number_excluded_error
if not success_results:
- return None, 'recent_measurements_excluded_error_count'
- exclusion_reason = 'recent_measurement_exclusion_not_success_count'
++ exclusion_reason = 'recent_measurements_excluded_error_count'
+ return (cls(node_id, 1, **kwargs), exclusion_reason)
+
results_away = \
cls.results_away_each_other(success_results, secs_away)
- kwargs['relay_recent_measurement_exclusion_not_distanciated_count'] = \
- len(success_results) - len(results_away)
+ number_excluded_near = len(success_results) - len(results_away)
+ if number_excluded_near > 0:
+ kwargs['relay_recent_measurements_excluded_near_count'] = \
- len(success_results) - len(results_away)
++ number_excluded_near
if not results_away:
- return None, 'recent_measurements_excluded_near_count'
-
+ exclusion_reason = \
- 'recent_measurement_exclusion_not_distanciated_count'
++ 'recent_measurements_excluded_near_count'
+ return (cls(node_id, 1, **kwargs), exclusion_reason)
# log.debug("Results away from each other: %s",
# [unixts_to_isodt_str(r.time) for r in results_away])
++
results_recent = cls.results_recent_than(results_away, secs_recent)
- kwargs['relay_recent_measurement_exclusion_not_recent_count'] = \
- len(results_away) - len(results_recent)
+ number_excluded_old = len(results_away) - len(results_recent)
+ if number_excluded_old > 0:
+ kwargs['relay_recent_measurements_excluded_old_count'] = \
+ number_excluded_old
if not results_recent:
- return None, 'recent_measurements_excluded_old_count'
+ exclusion_reason = \
- 'recent_measurement_exclusion_not_recent_count'
++ 'recent_measurements_excluded_old_count'
+ return (cls(node_id, 1, **kwargs), exclusion_reason)
if not len(results_recent) >= min_num:
- kwargs['relay_recent_measurement_exclusion_not_min_num_count'] = \
+ kwargs['relay_recent_measurements_excluded_few_count'] = \
len(results_recent)
# log.debug('The number of results is less than %s', min_num)
- return None, 'recent_measurements_excluded_few_count'
+ exclusion_reason = \
- 'recent_measurement_exclusion_not_min_num_count'
++ 'recent_measurements_excluded_few_count'
+ return (cls(node_id, 1, **kwargs), exclusion_reason)
+
+ # For any line not excluded, do not include vote and unmeasured
+ # KeyValues
+ del kwargs['vote']
+ del kwargs['unmeasured']
rtt = cls.rtt_from_results(results_recent)
if rtt:
@@@ -903,8 -883,8 +947,8 @@@ class V3BWFile(object)
# log.debug(bw_lines[-1])
# Not using the result for now, just warning
cls.is_max_bw_diff_perc_reached(bw_lines, max_bw_diff_perc)
- # Include excluded lines that does not have ``bw`` attribute.
+ header.add_time_report_half_network()
- f = cls(header, bw_lines)
+ f = cls(header, bw_lines + bw_lines_excluded)
return f
@classmethod
diff --cc tests/unit/lib/test_v3bwfile.py
index 9212a69,021eb95..be823a3
--- a/tests/unit/lib/test_v3bwfile.py
+++ b/tests/unit/lib/test_v3bwfile.py
@@@ -320,9 -324,9 +323,11 @@@ def test_results_away_each_other(datadi
values = results["AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"]
# There is one result excluded, but the relay is not excluded
- bwl, _ = V3BWLine.from_results(values, secs_away=secs_away, min_num=2)
+ bwl, reason = V3BWLine.from_results(values, secs_away=secs_away, min_num=2)
+ assert bwl.relay_recent_measurements_excluded_error_count == 1
+ assert reason is None
+ assert not hasattr(bwl, "vote")
+ assert not hasattr(bwl, "unmeasured")
success_results = [r for r in values if isinstance(r, ResultSuccess)]
assert len(success_results) >= min_num
@@@ -334,33 -338,31 +339,37 @@@
# Two measurements are excluded and there were only 2,
# the relay is excluded
- bwl, _ = V3BWLine.from_results(values, secs_away=secs_away, min_num=2)
+ bwl, reason = V3BWLine.from_results(values, secs_away=secs_away, min_num=2)
- # TODO ticket28563: uncomment
- # assert bwl.relay_recent_measurements_excluded_near_count == 2
++ assert bwl.relay_recent_measurements_excluded_near_count == 2
+ assert reason == 'recent_measurements_excluded_near_count'
+ assert bwl.vote == '0'
+ assert bwl.unmeasured == '1'
+ success_results = [r for r in values if isinstance(r, ResultSuccess)]
+ assert len(success_results) >= min_num
+ results_away = V3BWLine.results_away_each_other(success_results, secs_away)
+ assert not results_away
++
secs_away = 43200 # 12h
values = results["BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"]
success_results = [r for r in values if isinstance(r, ResultSuccess)]
assert len(success_results) >= min_num
results_away = V3BWLine.results_away_each_other(success_results, secs_away)
assert len(results_away) == 2
+
# C has 1 result
values = results["CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"]
- success_results = [r for r in values if isinstance(r, ResultSuccess)]
- assert len(success_results) < min_num
# There is only 1 result, the relay is excluded
- bwl, _ = V3BWLine.from_results(values, min_num=2)
+ bwl, reason = V3BWLine.from_results(values, min_num=2)
- # TODO ticket28563: uncomment
- # assert bwl.recent_measurements_excluded_few_count == 1
++ assert bwl.relay_recent_measurements_excluded_few_count == 1
+ assert reason == 'recent_measurements_excluded_few_count'
+ assert bwl.vote == '0'
+ assert bwl.unmeasured == '1'
+ success_results = [r for r in values if isinstance(r, ResultSuccess)]
+ assert len(success_results) < min_num
+
def test_measured_progress_stats(datadir):
number_consensus_relays = 3
More information about the tor-commits
mailing list