[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