Parameterize FRAC_USABLE_NEEDED for fraction of circuits

Instead of hardcoding the minimum fraction of possible paths to 0.6, we
take it from the user, and failing that from the consensus, and
failing that we fall back to 0.6.
This commit is contained in:
Nick Mathewson 2013-01-29 11:05:13 -05:00
parent 813a0f8c40
commit 02c320916e
5 changed files with 48 additions and 5 deletions

View File

@ -3,4 +3,6 @@
instead of looking at raw circuit counts, look at which fraction of instead of looking at raw circuit counts, look at which fraction of
(bandwidth-weighted) paths we're able to build. This approach keeps (bandwidth-weighted) paths we're able to build. This approach keeps
clients from building circuits if their paths are likely to stand out clients from building circuits if their paths are likely to stand out
statistically. Fixes issue 5956. statistically. The default fraction of paths needed is taken from the
consensus directory; you can override it with the new
PathsNeededToBuildCircuits option. Fixes issue 5956.

View File

@ -1282,6 +1282,18 @@ The following options are useful only for clients (that is, if
things may influence the choice. This option breaks a tie to the things may influence the choice. This option breaks a tie to the
favor of IPv6. (Default: 0) favor of IPv6. (Default: 0)
**PathsNeededToBuildCircuits** __NUM__::
Tor clients don't build circuits for user traffic until they know
about enough of the network so that they could potentially construct
enough of the possible paths through the network. If this option
is set to a fraction between 0.25 and 0.95, Tor won't build circuits
until it has enough descriptors or microdescriptors to construct
that fraction of possible paths. Note that setting this option too low
can make your Tor client less anonymous, and setting it too high can
prevent your Tor client from bootstrapping. If this option is negative,
Tor will use a default value chosen by the directory
authorities. (Default: -1.)
SERVER OPTIONS SERVER OPTIONS
-------------- --------------

View File

@ -325,6 +325,7 @@ static config_var_t option_vars_[] = {
V(PathBiasDropGuards, AUTOBOOL, "0"), V(PathBiasDropGuards, AUTOBOOL, "0"),
V(PathBiasUseCloseCounts, AUTOBOOL, "1"), V(PathBiasUseCloseCounts, AUTOBOOL, "1"),
V(PathsNeededToBuildCircuits, DOUBLE, "-1"),
OBSOLETE("PathlenCoinWeight"), OBSOLETE("PathlenCoinWeight"),
V(PerConnBWBurst, MEMUNIT, "0"), V(PerConnBWBurst, MEMUNIT, "0"),
V(PerConnBWRate, MEMUNIT, "0"), V(PerConnBWRate, MEMUNIT, "0"),
@ -2386,6 +2387,18 @@ options_validate(or_options_t *old_options, or_options_t *options,
return -1; return -1;
} }
if (options->PathsNeededToBuildCircuits >= 0.0) {
if (options->PathsNeededToBuildCircuits < 0.25) {
log_warn(LD_CONFIG, "PathsNeededToBuildCircuits is too low. Increasing "
"to 0.25");
options->PathsNeededToBuildCircuits = 0.25;
} else if (options->PathsNeededToBuildCircuits < 0.95) {
log_warn(LD_CONFIG, "PathsNeededToBuildCircuits is too high. Decreasing "
"to 0.95");
options->PathsNeededToBuildCircuits = 0.95;
}
}
if (options->MaxClientCircuitsPending <= 0 || if (options->MaxClientCircuitsPending <= 0 ||
options->MaxClientCircuitsPending > MAX_MAX_CLIENT_CIRCUITS_PENDING) { options->MaxClientCircuitsPending > MAX_MAX_CLIENT_CIRCUITS_PENDING) {
tor_asprintf(msg, tor_asprintf(msg,

View File

@ -1387,6 +1387,22 @@ count_loading_descriptors_progress(void)
BOOTSTRAP_STATUS_LOADING_DESCRIPTORS)); BOOTSTRAP_STATUS_LOADING_DESCRIPTORS));
} }
/** Return the fraction of paths needed before we're willing to build
* circuits, as configured in <b>options</b>, or in the consensus <b>ns</b>. */
static double
get_frac_paths_needed_for_circs(const or_options_t *options,
const networkstatus_t *ns)
{
#define DFLT_PCT_USABLE_NEEDED 60
if (options->PathsNeededToBuildCircuits >= 1.0) {
return options->PathsNeededToBuildCircuits;
} else {
return networkstatus_get_param(ns, "min_paths_for_circs_pct",
DFLT_PCT_USABLE_NEEDED,
25, 95)/100.0;
}
}
/** Change the value of have_min_dir_info, setting it true iff we have enough /** Change the value of have_min_dir_info, setting it true iff we have enough
* network and router information to build circuits. Clear the value of * network and router information to build circuits. Clear the value of
* need_to_update_have_min_dir_info. */ * need_to_update_have_min_dir_info. */
@ -1428,10 +1444,7 @@ update_router_have_minimum_dir_info(void)
&num_present, &num_usable, &num_present, &num_usable,
&status); &status);
/* What fraction of desired paths do we need before we will build circuits? */ if (paths < get_frac_paths_needed_for_circs(options,consensus)) {
#define FRAC_USABLE_NEEDED .6
if (paths < FRAC_USABLE_NEEDED) {
tor_snprintf(dir_info_status, sizeof(dir_info_status), tor_snprintf(dir_info_status, sizeof(dir_info_status),
"We need more %sdescriptors: we have %d/%d, and " "We need more %sdescriptors: we have %d/%d, and "
"can only build %02d%% of likely paths. (We have %s.)", "can only build %02d%% of likely paths. (We have %s.)",

View File

@ -3918,6 +3918,9 @@ typedef struct {
/** Autobool: should we use the ntor handshake if we can? */ /** Autobool: should we use the ntor handshake if we can? */
int UseNTorHandshake; int UseNTorHandshake;
/** Fraction: */
double PathsNeededToBuildCircuits;
} or_options_t; } or_options_t;
/** Persistent state for an onion router, as saved to disk. */ /** Persistent state for an onion router, as saved to disk. */