summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Færøy <ahf@torproject.org>2021-10-21 12:35:26 +0000
committerAlexander Færøy <ahf@torproject.org>2021-10-21 12:35:26 +0000
commit0135fb028c8ca0ce310009f20efef89e53a36f2c (patch)
tree6aadf5f93ffc32d125125217420e3151512ba976
parent5717b88bcb88d374b7b934622f0b7bf62cdab05c (diff)
parent265cca935aefd1a3bdbe6abc964858e10fb4a029 (diff)
downloadtor-0135fb028c8ca0ce310009f20efef89e53a36f2c.tar.gz
tor-0135fb028c8ca0ce310009f20efef89e53a36f2c.zip
Merge remote-tracking branch 'tor-gitlab/mr/338' into maint-0.4.5
-rw-r--r--changes/ticket4033716
-rw-r--r--doc/man/tor.1.txt5
-rw-r--r--src/app/config/config.c2
-rw-r--r--src/app/config/or_options_st.h4
-rw-r--r--src/app/config/testnet.inc1
-rw-r--r--src/feature/relay/router.c5
-rw-r--r--src/feature/stats/bwhist.c19
-rw-r--r--src/feature/stats/bwhist.h2
-rw-r--r--src/test/test_relay.c4
9 files changed, 49 insertions, 9 deletions
diff --git a/changes/ticket40337 b/changes/ticket40337
new file mode 100644
index 0000000000..1c86fc4c99
--- /dev/null
+++ b/changes/ticket40337
@@ -0,0 +1,16 @@
+ o Minor features (testing):
+ - On a testing network, relays can now use the
+ TestingMinTimeToReportBandwidth option to change
+ the smallest amount of time over which they're willing to report
+ their observed maximum bandwidth. Previously, this was fixed
+ at 1 day. For safety, values under 2 hours are only supported on
+ testing networks. Part of a fix for ticket 40337.
+
+ o Minor features (testing):
+ - Relays on testing networks now report their observed bandwidths
+ immediately from startup. Previously, they waited
+ until they had been running for a full day. Closes ticket
+ 40337.
+ - Relays on testing networks no longer rate-limit how frequently
+ they are willing to report new bandwidth measurements. Part of a fix
+ for ticket 40337.
diff --git a/doc/man/tor.1.txt b/doc/man/tor.1.txt
index b57c6ec70a..209900832f 100644
--- a/doc/man/tor.1.txt
+++ b/doc/man/tor.1.txt
@@ -3595,6 +3595,11 @@ The following options are used for running a testing Tor network.
Minimum value for the Fast flag. Overrides the ordinary minimum taken
from the consensus when TestingTorNetwork is set. (Default: 0.)
+[[TestingMinTimeToReportBandwidth]] **TestingMinTimeToReportBandwidth** __N__ **seconds**|**minutes**|**hours**::
+ Do not report our measurements for our maximum observed bandwidth for any
+ time period that has lasted for less than this amount of time.
+ Values over 1 day have no effect. (Default: 1 day)
+
[[TestingServerConsensusDownloadInitialDelay]] **TestingServerConsensusDownloadInitialDelay** __N__::
Initial delay in seconds for when servers should download consensuses. Changing this
requires that **TestingTorNetwork** is set. (Default: 0)
diff --git a/src/app/config/config.c b/src/app/config/config.c
index abc64ee92d..f8a140ad9f 100644
--- a/src/app/config/config.c
+++ b/src/app/config/config.c
@@ -563,6 +563,7 @@ static const config_var_t option_vars_[] = {
V(MaxUnparseableDescSizeToLog, MEMUNIT, "10 MB"),
VPORT(MetricsPort),
V(MetricsPortPolicy, LINELIST, NULL),
+ V(TestingMinTimeToReportBandwidth, INTERVAL, "1 day"),
VAR("MyFamily", LINELIST, MyFamily_lines, NULL),
V(NewCircuitPeriod, INTERVAL, "30 seconds"),
OBSOLETE("NamingAuthoritativeDirectory"),
@@ -3986,6 +3987,7 @@ options_validate_cb(const void *old_options_, void *options_, char **msg)
CHECK_DEFAULT(TestingSigningKeySlop);
CHECK_DEFAULT(TestingAuthKeySlop);
CHECK_DEFAULT(TestingLinkKeySlop);
+ CHECK_DEFAULT(TestingMinTimeToReportBandwidth);
or_options_free(dflt_options);
}
#undef CHECK_DEFAULT
diff --git a/src/app/config/or_options_st.h b/src/app/config/or_options_st.h
index 4364f145ed..440c987365 100644
--- a/src/app/config/or_options_st.h
+++ b/src/app/config/or_options_st.h
@@ -1082,6 +1082,10 @@ struct or_options_t {
/** List of policy allowed to query the Metrics port. */
struct config_line_t *MetricsPortPolicy;
+ /** How far must we be into the current bandwidth-measurement period to
+ * report bandwidth observations from this period? */
+ int TestingMinTimeToReportBandwidth;
+
/**
* Configuration objects for individual modules.
*
diff --git a/src/app/config/testnet.inc b/src/app/config/testnet.inc
index 00b307782b..039454a0d0 100644
--- a/src/app/config/testnet.inc
+++ b/src/app/config/testnet.inc
@@ -19,6 +19,7 @@
{ "TestingV3AuthInitialDistDelay", "20 seconds" },
{ "TestingAuthDirTimeToLearnReachability", "0 minutes" },
{ "MinUptimeHidServDirectoryV2", "0 minutes" },
+{ "TestingMinTimeToReportBandwidth", "0 seconds" },
{ "TestingServerDownloadInitialDelay", "0" },
{ "TestingClientDownloadInitialDelay", "0" },
{ "TestingServerConsensusDownloadInitialDelay", "0" },
diff --git a/src/feature/relay/router.c b/src/feature/relay/router.c
index 0589786619..7f156d1150 100644
--- a/src/feature/relay/router.c
+++ b/src/feature/relay/router.c
@@ -2622,7 +2622,10 @@ check_descriptor_bandwidth_changed(time_t now)
if ((prev != cur && (!prev || !cur)) ||
cur > (prev * BANDWIDTH_CHANGE_FACTOR) ||
cur < (prev / BANDWIDTH_CHANGE_FACTOR) ) {
- if (last_changed+MAX_BANDWIDTH_CHANGE_FREQ < now || !prev) {
+ const bool change_recent_enough =
+ last_changed+MAX_BANDWIDTH_CHANGE_FREQ < now;
+ const bool testing_network = get_options()->TestingTorNetwork;
+ if (change_recent_enough || testing_network || !prev) {
log_info(LD_GENERAL,
"Measured bandwidth has changed; rebuilding descriptor.");
mark_my_descriptor_dirty("bandwidth has changed");
diff --git a/src/feature/stats/bwhist.c b/src/feature/stats/bwhist.c
index 7cbc5f60a6..06ad48e5c3 100644
--- a/src/feature/stats/bwhist.c
+++ b/src/feature/stats/bwhist.c
@@ -206,16 +206,24 @@ bwhist_note_dir_bytes_read(uint64_t num_bytes, time_t when)
add_obs(dir_read_array, when, num_bytes);
}
-/** Helper: Return the largest value in b->maxima. (This is equal to the
+/**
+ * Helper: Return the largest value in b->maxima. (This is equal to the
* most bandwidth used in any NUM_SECS_ROLLING_MEASURE period for the last
* NUM_SECS_BW_SUM_IS_VALID seconds.)
+ *
+ * Also include the current period if we have been observing it for
+ * at least min_observation_time seconds.
*/
STATIC uint64_t
-find_largest_max(bw_array_t *b)
+find_largest_max(bw_array_t *b, int min_observation_time)
{
int i;
uint64_t max;
- max=0;
+ time_t period_start = b->next_period - NUM_SECS_BW_SUM_INTERVAL;
+ if (b->cur_obs_time > period_start + min_observation_time)
+ max = b->max_total;
+ else
+ max = 0;
for (i=0; i<NUM_TOTALS; ++i) {
if (b->maxima[i]>max)
max = b->maxima[i];
@@ -233,8 +241,9 @@ MOCK_IMPL(int,
bwhist_bandwidth_assess,(void))
{
uint64_t w,r;
- r = find_largest_max(read_array);
- w = find_largest_max(write_array);
+ int min_obs_time = get_options()->TestingMinTimeToReportBandwidth;
+ r = find_largest_max(read_array, min_obs_time);
+ w = find_largest_max(write_array, min_obs_time);
if (r>w)
return (int)(((double)w)/NUM_SECS_ROLLING_MEASURE);
else
diff --git a/src/feature/stats/bwhist.h b/src/feature/stats/bwhist.h
index f88b951447..01055df720 100644
--- a/src/feature/stats/bwhist.h
+++ b/src/feature/stats/bwhist.h
@@ -28,7 +28,7 @@ int bwhist_load_state(struct or_state_t *state, char **err);
#ifdef BWHIST_PRIVATE
typedef struct bw_array_t bw_array_t;
-STATIC uint64_t find_largest_max(bw_array_t *b);
+STATIC uint64_t find_largest_max(bw_array_t *b, int min_observation_time);
STATIC void commit_max(bw_array_t *b);
STATIC void advance_obs(bw_array_t *b);
STATIC bw_array_t *bw_array_new(void);
diff --git a/src/test/test_relay.c b/src/test/test_relay.c
index b287f0d38b..8ed29b6282 100644
--- a/src/test/test_relay.c
+++ b/src/test/test_relay.c
@@ -98,7 +98,7 @@ test_relay_close_circuit(void *arg)
tt_int_op(new_count, OP_EQ, old_count + 1);
/* Ensure our write totals are 0 */
- tt_u64_op(find_largest_max(write_array), OP_EQ, 0);
+ tt_u64_op(find_largest_max(write_array, 86400), OP_EQ, 0);
/* Mark the circuit for close */
circuit_mark_for_close(TO_CIRCUIT(orcirc), 0);
@@ -107,7 +107,7 @@ test_relay_close_circuit(void *arg)
advance_obs(write_array);
commit_max(write_array);
/* Check for two cells plus overhead */
- tt_u64_op(find_largest_max(write_array), OP_EQ,
+ tt_u64_op(find_largest_max(write_array, 86400), OP_EQ,
2*(get_cell_network_size(nchan->wide_circ_ids)
+TLS_PER_CELL_OVERHEAD));