diff options
author | Nick Mathewson <nickm@torproject.org> | 2004-06-06 03:38:31 +0000 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2004-06-06 03:38:31 +0000 |
commit | 184f4e6044daf853583edfee625d88eadeefab71 (patch) | |
tree | 58bffd58139d62f066095fdf1b359dd50f06baa6 | |
parent | 0d1b4b50249f10944f8d3610110a0d310e314ab3 (diff) | |
download | tor-184f4e6044daf853583edfee625d88eadeefab71.tar tor-184f4e6044daf853583edfee625d88eadeefab71.tar.gz |
Rotate dnsworkers and cpuworkers on SIGHUP, so they get new config settings too
svn:r1950
-rw-r--r-- | src/or/dns.c | 28 | ||||
-rw-r--r-- | src/or/main.c | 5 |
2 files changed, 30 insertions, 3 deletions
diff --git a/src/or/dns.c b/src/or/dns.c index a540ade8f..fa25de5e2 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 7f2c309c0..7b29f1188 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); |