PredictedCircsRelevanceTime: limit how long we predict a port will be used

By default, after you've made a connection to port XYZ, we assume
you might still want to have an exit ready to connect to XYZ for one
hour. This patch lets you lower that interval.

Implements ticket 91
This commit is contained in:
unixninja92 2013-09-14 21:40:19 +02:00 committed by Nick Mathewson
parent 147a0f31bd
commit 898154f717
4 changed files with 20 additions and 8 deletions

4
changes/ticket9176 Normal file
View file

@ -0,0 +1,4 @@
o Minor features:
- Made PREDICTED_CIRCS_RELEVANCE_TIME configurable from config
file. Implements ticket #9176. Patch by unixninja92.

View file

@ -314,6 +314,7 @@ static config_var_t option_vars_[] = {
V(NATDListenAddress, LINELIST, NULL), V(NATDListenAddress, LINELIST, NULL),
VPORT(NATDPort, LINELIST, NULL), VPORT(NATDPort, LINELIST, NULL),
V(Nickname, STRING, NULL), V(Nickname, STRING, NULL),
V(PredictedCircsRelevanceTime, INTERVAL, "1 hour"),
V(WarnUnsafeSocks, BOOL, "1"), V(WarnUnsafeSocks, BOOL, "1"),
OBSOLETE("NoPublish"), OBSOLETE("NoPublish"),
VAR("NodeFamily", LINELIST, NodeFamilies, NULL), VAR("NodeFamily", LINELIST, NodeFamilies, NULL),

View file

@ -3673,6 +3673,9 @@ typedef struct {
* a new one? */ * a new one? */
int MaxCircuitDirtiness; /**< Never use circs that were first used more than int MaxCircuitDirtiness; /**< Never use circs that were first used more than
this interval ago. */ this interval ago. */
int PredictedCircsRelevanceTime; /** How long after we've seen a request for
* a given port, do we want to continue
* to make connections to the same port? */
uint64_t BandwidthRate; /**< How much bandwidth, on average, are we willing uint64_t BandwidthRate; /**< How much bandwidth, on average, are we willing
* to use in a second? */ * to use in a second? */
uint64_t BandwidthBurst; /**< How much bandwidth, at maximum, are we willing uint64_t BandwidthBurst; /**< How much bandwidth, at maximum, are we willing

View file

@ -1862,22 +1862,20 @@ rep_hist_note_used_port(time_t now, uint16_t port)
add_predicted_port(now, port); add_predicted_port(now, port);
} }
/** For this long after we've seen a request for a given port, assume that
* we'll want to make connections to the same port in the future. */
#define PREDICTED_CIRCS_RELEVANCE_TIME (60*60)
/** Return a newly allocated pointer to a list of uint16_t * for ports that /** Return a newly allocated pointer to a list of uint16_t * for ports that
* are likely to be asked for in the near future. * are likely to be asked for in the near future.
*/ */
smartlist_t * smartlist_t *
rep_hist_get_predicted_ports(time_t now) rep_hist_get_predicted_ports(time_t now)
{ {
int predicted_circs_relevance_time;
smartlist_t *out = smartlist_new(); smartlist_t *out = smartlist_new();
tor_assert(predicted_ports_list); tor_assert(predicted_ports_list);
predicted_circs_relevance_time = get_options()->PredictedCircsRelevanceTime;
/* clean out obsolete entries */ /* clean out obsolete entries */
SMARTLIST_FOREACH_BEGIN(predicted_ports_list, predicted_port_t *, pp) { SMARTLIST_FOREACH_BEGIN(predicted_ports_list, predicted_port_t *, pp) {
if (pp->time + PREDICTED_CIRCS_RELEVANCE_TIME < now) { if (pp->time + predicted_circs_relevance_time < now) {
log_debug(LD_CIRC, "Expiring predicted port %d", pp->port); log_debug(LD_CIRC, "Expiring predicted port %d", pp->port);
rephist_total_alloc -= sizeof(predicted_port_t); rephist_total_alloc -= sizeof(predicted_port_t);
@ -1944,14 +1942,17 @@ int
rep_hist_get_predicted_internal(time_t now, int *need_uptime, rep_hist_get_predicted_internal(time_t now, int *need_uptime,
int *need_capacity) int *need_capacity)
{ {
int predicted_circs_relevance_time;
predicted_circs_relevance_time = get_options()->PredictedCircsRelevanceTime;
if (!predicted_internal_time) { /* initialize it */ if (!predicted_internal_time) { /* initialize it */
predicted_internal_time = now; predicted_internal_time = now;
predicted_internal_uptime_time = now; predicted_internal_uptime_time = now;
predicted_internal_capacity_time = now; predicted_internal_capacity_time = now;
} }
if (predicted_internal_time + PREDICTED_CIRCS_RELEVANCE_TIME < now) if (predicted_internal_time + predicted_circs_relevance_time < now)
return 0; /* too long ago */ return 0; /* too long ago */
if (predicted_internal_uptime_time + PREDICTED_CIRCS_RELEVANCE_TIME >= now) if (predicted_internal_uptime_time + predicted_circs_relevance_time >= now)
*need_uptime = 1; *need_uptime = 1;
// Always predict that we need capacity. // Always predict that we need capacity.
*need_capacity = 1; *need_capacity = 1;
@ -1963,8 +1964,11 @@ rep_hist_get_predicted_internal(time_t now, int *need_uptime,
int int
any_predicted_circuits(time_t now) any_predicted_circuits(time_t now)
{ {
int predicted_circs_relevance_time;
predicted_circs_relevance_time = get_options()->PredictedCircsRelevanceTime;
return smartlist_len(predicted_ports_list) || return smartlist_len(predicted_ports_list) ||
predicted_internal_time + PREDICTED_CIRCS_RELEVANCE_TIME >= now; predicted_internal_time + predicted_circs_relevance_time >= now;
} }
/** Return 1 if we have no need for circuits currently, else return 0. */ /** Return 1 if we have no need for circuits currently, else return 0. */