[or-cvs] r16852: {tor} Increase number of server-side introduction points based on (tor/branches/hidserv-design-changes/src/or)
kloesing at seul.org
kloesing at seul.org
Thu Sep 11 17:11:47 UTC 2008
Author: kloesing
Date: 2008-09-11 13:11:47 -0400 (Thu, 11 Sep 2008)
New Revision: 16852
Modified:
tor/branches/hidserv-design-changes/src/or/circuituse.c
tor/branches/hidserv-design-changes/src/or/main.c
tor/branches/hidserv-design-changes/src/or/or.h
tor/branches/hidserv-design-changes/src/or/rendservice.c
Log:
Increase number of server-side introduction points based on number of recent hidden service requests.
Modified: tor/branches/hidserv-design-changes/src/or/circuituse.c
===================================================================
--- tor/branches/hidserv-design-changes/src/or/circuituse.c 2008-09-11 17:09:25 UTC (rev 16851)
+++ tor/branches/hidserv-design-changes/src/or/circuituse.c 2008-09-11 17:11:47 UTC (rev 16852)
@@ -459,7 +459,8 @@
}
/* Third, see if we need any more hidden service (server) circuits. */
- if (num_rend_services() && num_uptime_internal < 3) {
+ if (num_rend_services() &&
+ num_uptime_internal < rend_internal_circuits_needed()) {
flags = (CIRCLAUNCH_NEED_CAPACITY | CIRCLAUNCH_NEED_UPTIME |
CIRCLAUNCH_IS_INTERNAL);
log_info(LD_CIRC,
Modified: tor/branches/hidserv-design-changes/src/or/main.c
===================================================================
--- tor/branches/hidserv-design-changes/src/or/main.c 2008-09-11 17:09:25 UTC (rev 16851)
+++ tor/branches/hidserv-design-changes/src/or/main.c 2008-09-11 17:11:47 UTC (rev 16852)
@@ -840,6 +840,7 @@
static time_t time_to_recheck_bandwidth = 0;
static time_t time_to_check_for_expired_networkstatus = 0;
static time_t time_to_dump_geoip_stats = 0;
+ static time_t time_to_update_request_history = 0;
or_options_t *options = get_options();
int i;
int have_dir_info;
@@ -1168,6 +1169,14 @@
#define BRIDGE_STATUSFILE_INTERVAL (30*60)
time_to_write_bridge_status_file = now+BRIDGE_STATUSFILE_INTERVAL;
}
+
+ /** 11. Update history of requests to our hidden services, so that
+ * we can better estimate the number of internal circuits. */
+ if (time_to_update_request_history < now) {
+ rend_update_request_history(now);
+#define REND_REQUEST_HISTORY_UPDATE_INTERVAL (5 * 60)
+ time_to_update_request_history = now+REND_REQUEST_HISTORY_UPDATE_INTERVAL;
+ }
}
/** Libevent timer: used to invoke second_elapsed_callback() once per
@@ -1935,6 +1944,7 @@
rend_cache_free_all();
rend_service_authorization_free_all();
rend_client_request_history_free_all();
+ rend_service_request_history_free_all();
rep_hist_free_all();
hs_usage_free_all();
dns_free_all();
Modified: tor/branches/hidserv-design-changes/src/or/or.h
===================================================================
--- tor/branches/hidserv-design-changes/src/or/or.h 2008-09-11 17:09:25 UTC (rev 16851)
+++ tor/branches/hidserv-design-changes/src/or/or.h 2008-09-11 17:11:47 UTC (rev 16852)
@@ -3986,6 +3986,10 @@
void rend_service_dump_stats(int severity);
void rend_service_free_all(void);
+int rend_internal_circuits_needed(void);
+void rend_update_request_history(time_t now);
+void rend_service_request_history_free_all(void);
+
/********************************* rendmid.c *******************************/
int rend_mid_establish_intro(or_circuit_t *circ, const char *request,
size_t request_len);
Modified: tor/branches/hidserv-design-changes/src/or/rendservice.c
===================================================================
--- tor/branches/hidserv-design-changes/src/or/rendservice.c 2008-09-11 17:09:25 UTC (rev 16851)
+++ tor/branches/hidserv-design-changes/src/or/rendservice.c 2008-09-11 17:11:47 UTC (rev 16852)
@@ -768,6 +768,8 @@
* Handle cells
******/
+static void rend_add_request(time_t now);
+
/** Respond to an INTRODUCE2 cell by launching a circuit to the chosen
* rendezvous point.
*/
@@ -952,6 +954,10 @@
/* help predict this next time */
rep_hist_note_used_internal(time(NULL), circ_needs_uptime, 1);
+ /* Remember service request to better predict the required number
+ * of internal circuits in the future. */
+ rend_add_request(time(NULL));
+
/* Launch a circuit to alice's chosen rendezvous point.
*/
for (i=0;i<MAX_REND_FAILURES;i++) {
@@ -1856,3 +1862,86 @@
return -1;
}
+/*
+ * Logic to record requests to our hidden services and sets the number of
+ * pre-established internal circuits appropriately.
+ */
+
+/** The duration of our hidden service request history that we use to
+ * better predict the number of internal circuits. */
+#define REND_REQUEST_HISTORY_PERIOD (15 * 60)
+
+/** Number of requests per minute that justify an additional internal
+ * circuit. */
+#define REND_REQUESTS_INTERNAL_CIRCUITS_RATIO 5
+
+/** The maximum number of internal circuits. */
+#define REND_INTERNAL_CIRCUITS_MAX 12
+
+/** History of request to any of our hidden services that is used to help
+ * predict the number of pre-established internal circuits. */
+static smartlist_t *request_history = NULL;
+
+/** Release all the storage held in last_hid_serv_requests.
+ */
+void
+rend_service_request_history_free_all(void)
+{
+ if (!request_history) {
+ return;
+ }
+ SMARTLIST_FOREACH(request_history, time_t *, r, tor_free(r););
+ request_history = NULL;
+}
+
+/** The number of internal circuits that we should hold in stock as a
+ * function of requests. */
+static int internal_circuits_needed = 3;
+
+/** Add a request to one of our hidden services to the request history. */
+static void
+rend_add_request(time_t now)
+{
+ time_t *request_ptr;
+ if (!request_history)
+ request_history = smartlist_create();
+ request_ptr = tor_malloc_zero(sizeof(time_t *));
+ *request_ptr = now;
+ smartlist_add(request_history, request_ptr);
+}
+
+/** Determine the number of internal circuits that we should hold in stock
+ * in the future and prune too old requests. */
+void
+rend_update_request_history(time_t now)
+{
+ time_t cutoff = 0;
+ int num_requests = 200; /* TODO for testing purposes simulate 200 requests.
+ * during the last 15 minutes. Change this to 0 for
+ * the final version, of course. */
+ if (!request_history)
+ return;
+ cutoff = now - REND_REQUEST_HISTORY_PERIOD;
+ SMARTLIST_FOREACH(request_history, time_t *, t, {
+ if (*t < cutoff) {
+ tor_free(t);
+ SMARTLIST_DEL_CURRENT(request_history, t);
+ } else
+ num_requests++;
+ });
+ internal_circuits_needed = 3 + (num_requests /
+ (REND_REQUEST_HISTORY_PERIOD / 60 *
+ REND_REQUESTS_INTERNAL_CIRCUITS_RATIO));
+ if (internal_circuits_needed > REND_INTERNAL_CIRCUITS_MAX)
+ internal_circuits_needed = REND_INTERNAL_CIRCUITS_MAX;
+ log_info(LD_REND, "Setting the number of pre-built internal circuits to %d",
+ internal_circuits_needed);
+}
+
+/** Return the number of internal circuits that we should hold in stock. */
+int
+rend_internal_circuits_needed(void)
+{
+ return internal_circuits_needed;
+}
+
More information about the tor-commits
mailing list