summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2004-06-06 03:38:31 +0000
committerNick Mathewson <nickm@torproject.org>2004-06-06 03:38:31 +0000
commit184f4e6044daf853583edfee625d88eadeefab71 (patch)
tree58bffd58139d62f066095fdf1b359dd50f06baa6
parent0d1b4b50249f10944f8d3610110a0d310e314ab3 (diff)
downloadtor-184f4e6044daf853583edfee625d88eadeefab71.tar.gz
tor-184f4e6044daf853583edfee625d88eadeefab71.zip
Rotate dnsworkers and cpuworkers on SIGHUP, so they get new config settings too
svn:r1950
-rw-r--r--src/or/dns.c28
-rw-r--r--src/or/main.c5
2 files changed, 30 insertions, 3 deletions
diff --git a/src/or/dns.c b/src/or/dns.c
index a540ade8f2..fa25de5e2c 100644
--- a/src/or/dns.c
+++ b/src/or/dns.c
@@ -35,9 +35,11 @@ extern or_options_t options; /* command-line and config-file options */
#define DNS_RESOLVE_SUCCEEDED 3
/** How many dnsworkers we have running right now. */
-int num_dnsworkers=0;
+static int num_dnsworkers=0;
/** How many of the running dnsworkers have an assigned task right now. */
-int num_dnsworkers_busy=0;
+static int num_dnsworkers_busy=0;
+/** When did we last rotate the dnsworkers? */
+static time_t last_rotation_time=0;
/** Linked list of connections waiting for a DNS answer. */
struct pending_connection_t {
@@ -92,6 +94,7 @@ static void init_cache_tree(void) {
/** Initialize the DNS subsystem; called by the OR process. */
void dns_init(void) {
init_cache_tree();
+ last_rotation_time=time(NULL);
spawn_enough_dnsworkers();
}
@@ -535,10 +538,29 @@ int connection_dns_process_inbuf(connection_t *conn) {
conn->address = tor_strdup("<idle>");
conn->state = DNSWORKER_STATE_IDLE;
num_dnsworkers_busy--;
-
+ if (conn->timestamp_created < last_rotation_time) {
+ connection_mark_for_close(conn);
+ num_dnsworkers--;
+ spawn_enough_dnsworkers();
+ }
return 0;
}
+/** Close and re-open all idle dnsworkers; schedule busy ones to be closed
+ * and re-opened once they're no longer busy.
+ **/
+void dnsworkers_rotate(void)
+{
+ connection_t *dnsconn;
+ while ((dnsconn = connection_get_by_type_state(CONN_TYPE_DNSWORKER,
+ DNSWORKER_STATE_IDLE))) {
+ connection_mark_for_close(dnsconn);
+ num_dnsworkers--;
+ }
+ last_rotation_time = time(NULL);
+ spawn_enough_dnsworkers();
+}
+
/** Implementation for DNS workers; this code runs in a separate
* execution context. It takes as its argument an fdarray as returned
* by socketpair(), and communicates via fdarray[1]. The protocol is
diff --git a/src/or/main.c b/src/or/main.c
index 7f2c309c01..7b29f1188a 100644
--- a/src/or/main.c
+++ b/src/or/main.c
@@ -638,6 +638,11 @@ static int do_hup(void) {
directory_get_from_dirserver(DIR_PURPOSE_FETCH_DIR, NULL, 0);
}
if(options.ORPort) {
+ /* Restart cpuworker and dnsworker processes, so they get up-to-date
+ * configuration options. */
+ cpuworkers_rotate();
+ dnsworkers_rotate();
+ /* Rebuild fresh descriptor as needed. */
router_rebuild_descriptor();
sprintf(keydir,"%s/router.desc", options.DataDirectory);
log_fn(LOG_INFO,"Dumping descriptor to %s...",keydir);