GitLab is used only for code review, issue tracking and project management. Canonical locations for source code are still https://gitweb.torproject.org/ https://git.torproject.org/ and git-rw.torproject.org.

Commit 5d0e63cb authored by juga  's avatar juga 💬

chg: v3bwfile: Calculate hlimit from scaled sum bw

instead of bw before scaling.

Tests have finally correct value.
For 1 result, only when the cap is 1, the value will be equal to the
rounded bw because the cap does not limit it.
parent 6e1f57c6
......@@ -1060,8 +1060,10 @@ class V3BWFile(object):
cls.warn_if_not_accurate_enough(bw_lines, scale_constant)
# log.debug(bw_lines[-1])
elif scaling_method == TORFLOW_SCALING:
bw_lines = cls.bw_torflow_scale(bw_lines_raw, torflow_obs,
torflow_cap, round_digs)
bw_lines = cls.bw_torflow_scale(
bw_lines_raw, torflow_obs, torflow_cap, round_digs,
router_statuses_d=router_statuses_d
)
# log.debug(bw_lines[-1])
# Update the header and log the progress.
min_perc = cls.update_progress(
......@@ -1186,7 +1188,8 @@ class V3BWFile(object):
@staticmethod
def bw_torflow_scale(bw_lines, desc_bw_obs_type=TORFLOW_OBS_MEAN,
cap=TORFLOW_BW_MARGIN,
num_round_dig=PROP276_ROUND_DIG, reverse=False):
num_round_dig=PROP276_ROUND_DIG, reverse=False,
router_statuses_d=None):
"""
Obtain final bandwidth measurements applying Torflow's scaling
method.
......@@ -1344,15 +1347,12 @@ class V3BWFile(object):
mu = mean([l.bw_mean for l in bw_lines])
# filtered mean (Torflow's filt_avg)
muf = mean([l.bw_filt for l in bw_lines])
# bw sum (Torflow's tot_net_bw or tot_sbw)
sum_bw = sum([l.bw_mean for l in bw_lines])
# Torflow's clipping
hlimit = sum_bw * cap
log.debug('sum %s', sum_bw)
log.debug('mu %s', mu)
log.debug('muf %s', muf)
log.debug('hlimit %s', hlimit)
# Torflow's ``tot_net_bw``, sum of the scaled bandwidth for the relays
# that are in the last consensus
sum_bw = 0
for l in bw_lines_tf:
# First, obtain the observed bandwidth, later check what to do
# if it is 0 or None.
......@@ -1412,9 +1412,27 @@ class V3BWFile(object):
ratio_stream = l.bw_mean / mu
ratio_stream_filtered = l.bw_filt / muf
ratio = max(ratio_stream, ratio_stream_filtered)
bw_scaled = ratio * min_bandwidth
# Cap maximum bw
bw_scaled = min(hlimit, bw_scaled)
# Assign it to an attribute, so it's not lost before capping and
# rounding
l.bw = ratio * min_bandwidth
# If the consensus is available, sum only the bw for the relays
# that are in the consensus
if router_statuses_d:
if l.node_id.replace("$", "") in router_statuses_d:
sum_bw += l.bw
# Otherwise sum all bw, for compatibility with tests that were not
# using the consensus file.
else:
sum_bw += l.bw
# Cap maximum bw, only possible when the ``sum_bw`` is calculated.
# Torflow's clipping
hlimit = sum_bw * cap
log.debug("sum_bw: %s, hlimit: %s", sum_bw, hlimit)
for l in bw_lines_tf:
bw_scaled = min(hlimit, l.bw)
# round and convert to KB
bw_new = kb_round_x_sig_dig(bw_scaled, digits=num_round_dig)
# avoid 0
......
......@@ -330,7 +330,7 @@ def test_torflow_scale(mock_consensus, datadir, tmpdir, conf):
state_fpath,
scaling_method=TORFLOW_SCALING,
round_digs=TORFLOW_ROUND_DIG)
assert v3bwfile.bw_lines[0].bw == 3
assert v3bwfile.bw_lines[0].bw == 6
v3bwfile = V3BWFile.from_results(results, '', '',
state_fpath,
scaling_method=TORFLOW_SCALING,
......@@ -343,13 +343,13 @@ def test_torflow_scale(mock_consensus, datadir, tmpdir, conf):
scaling_method=TORFLOW_SCALING,
torflow_cap=1,
round_digs=TORFLOW_ROUND_DIG)
assert v3bwfile.bw_lines[0].bw == 61
assert v3bwfile.bw_lines[0].bw == 123
v3bwfile = V3BWFile.from_results(results, '', '',
state_fpath,
scaling_method=TORFLOW_SCALING,
torflow_cap=1,
round_digs=PROP276_ROUND_DIG)
assert v3bwfile.bw_lines[0].bw == 61
assert v3bwfile.bw_lines[0].bw == 120
def test_torflow_scale_no_desc_bw_avg(datadir, conf, caplog):
......@@ -357,7 +357,7 @@ def test_torflow_scale_no_desc_bw_avg(datadir, conf, caplog):
results = load_result_file(str(datadir.join("results_no_desc_bw_avg.txt")))
caplog.set_level(logging.DEBUG)
v3bwfile = V3BWFile.from_results(results, '', '', state_fpath)
assert v3bwfile.bw_lines[0].bw == 3
assert v3bwfile.bw_lines[0].bw == 26
def test_torflow_scale_no_desc_bw_obs(datadir, conf, caplog):
......@@ -365,7 +365,7 @@ def test_torflow_scale_no_desc_bw_obs(datadir, conf, caplog):
results = load_result_file(str(datadir.join("results_no_desc_bw_obs.txt")))
caplog.set_level(logging.DEBUG)
v3bwfile = V3BWFile.from_results(results, '', '', state_fpath)
assert v3bwfile.bw_lines[0].bw == 3
assert v3bwfile.bw_lines[0].bw == 30
def test_torflow_scale_no_desc_bw_avg_obs(datadir, conf, caplog):
......@@ -375,7 +375,7 @@ def test_torflow_scale_no_desc_bw_avg_obs(datadir, conf, caplog):
)
caplog.set_level(logging.DEBUG)
v3bwfile = V3BWFile.from_results(results, '', '', state_fpath)
assert v3bwfile.bw_lines[0].bw == 3
assert v3bwfile.bw_lines[0].bw == 30
def test_torflow_scale_no_consensus_bw(datadir, conf, caplog):
......@@ -385,7 +385,7 @@ def test_torflow_scale_no_consensus_bw(datadir, conf, caplog):
)
caplog.set_level(logging.DEBUG)
v3bwfile = V3BWFile.from_results(results, '', '', state_fpath)
assert v3bwfile.bw_lines[0].bw == 3
assert v3bwfile.bw_lines[0].bw == 26
def test_torflow_scale_0_consensus_bw(datadir, conf, caplog):
......@@ -393,7 +393,7 @@ def test_torflow_scale_0_consensus_bw(datadir, conf, caplog):
results = load_result_file(str(datadir.join("results_0_consensus_bw.txt")))
caplog.set_level(logging.DEBUG)
v3bwfile = V3BWFile.from_results(results, '', '', state_fpath)
assert v3bwfile.bw_lines[0].bw == 3
assert v3bwfile.bw_lines[0].bw == 26
def test_results_away_each_other(datadir):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment