Commit b9082682 authored by Nick Mathewson's avatar Nick Mathewson 🐻
Browse files

r6982@Kushana: nickm | 2006-07-31 13:47:19 -0400

 documentation and naming tweaks in dns.c


svn:r6961
parent 58c0ac77
...@@ -36,7 +36,8 @@ const char dns_c_id[] = ...@@ -36,7 +36,8 @@ const char dns_c_id[] =
/** If more than this many processes are idle, shut down the extras. */ /** If more than this many processes are idle, shut down the extras. */
#define MAX_IDLE_DNSWORKERS 10 #define MAX_IDLE_DNSWORKERS 10
/** DOCDCOC */ /** How long will we wait for an answer from the resolver before we decide
* that the resolver is wedged? */
#define RESOLVE_MAX_TIMEOUT 300 #define RESOLVE_MAX_TIMEOUT 300
/** Possible outcomes from hostname lookup: permanent failure, /** Possible outcomes from hostname lookup: permanent failure,
...@@ -62,10 +63,23 @@ typedef struct pending_connection_t { ...@@ -62,10 +63,23 @@ typedef struct pending_connection_t {
#define CACHED_RESOLVE_MAGIC 0x1234F00D #define CACHED_RESOLVE_MAGIC 0x1234F00D
/* DOCDOC */ /* Possible states for a cached resolve_t */
/** We are waiting for the resolver system to tell us an answer here.
* When we get one, or when we time out, the state of this cached_resolve_t
* will become "DONE" and we'll possibly add a CACHED_VALID or a CACHED_FAILED
* entry. This cached_resolve_t will be in the hash table so that we will
* know not to launch more requests for this addr, but rather to add more
* connections to the pending list for the addr. */
#define CACHE_STATE_PENDING 0 #define CACHE_STATE_PENDING 0
/** This used to be a pending cached_resolve_t, and we got an answer for it.
* Now we're waiting for this cached_resolve_t to expire. This should
* have no pending connections, and should not appear in the hash table. */
#define CACHE_STATE_DONE 1 #define CACHE_STATE_DONE 1
/** We are caching an answer for this address. This should have no pending
* connections, and should appear in the hash table. */
#define CACHE_STATE_CACHED_VALID 2 #define CACHE_STATE_CACHED_VALID 2
/** We are caching a failure for this address. This should have no pending
* connections, and should appear in the hash table */
#define CACHE_STATE_CACHED_FAILED 3 #define CACHE_STATE_CACHED_FAILED 3
/** A DNS request: possibly completed, possibly pending; cached_resolve /** A DNS request: possibly completed, possibly pending; cached_resolve
...@@ -88,7 +102,7 @@ static void purge_expired_resolves(uint32_t now); ...@@ -88,7 +102,7 @@ static void purge_expired_resolves(uint32_t now);
static void dns_found_answer(const char *address, uint32_t addr, char outcome, static void dns_found_answer(const char *address, uint32_t addr, char outcome,
uint32_t ttl); uint32_t ttl);
static void send_resolved_cell(edge_connection_t *conn, uint8_t answer_type); static void send_resolved_cell(edge_connection_t *conn, uint8_t answer_type);
static int assign_to_dnsworker(edge_connection_t *exitconn); static int launch_resolve(edge_connection_t *exitconn);
#ifndef USE_EVENTDNS #ifndef USE_EVENTDNS
static int dnsworker_main(void *data); static int dnsworker_main(void *data);
static int spawn_dnsworker(void); static int spawn_dnsworker(void);
...@@ -206,7 +220,9 @@ _free_cached_resolve(cached_resolve_t *r) ...@@ -206,7 +220,9 @@ _free_cached_resolve(cached_resolve_t *r)
tor_free(r); tor_free(r);
} }
/** DODDOC */ /** Compare two cached_resolve_t pointers by expiry time, and return
* less-than-zero, zero, or greater-than-zero as appropriate. Used for
* the priority queue implementation. */
static int static int
_compare_cached_resolves_by_expiry(const void *_a, const void *_b) _compare_cached_resolves_by_expiry(const void *_a, const void *_b)
{ {
...@@ -219,9 +235,12 @@ _compare_cached_resolves_by_expiry(const void *_a, const void *_b) ...@@ -219,9 +235,12 @@ _compare_cached_resolves_by_expiry(const void *_a, const void *_b)
return 1; return 1;
} }
/** Linked list of resolved addresses, oldest to newest. DOCDOC*/ /** Priority queue of cached_resolve_t objects to let us know when they
* will expire. */
static smartlist_t *cached_resolve_pqueue = NULL; static smartlist_t *cached_resolve_pqueue = NULL;
/** Set an expiry time for a cached_resolve_t, and add it to the expiry
* priority queue */
static void static void
set_expiry(cached_resolve_t *resolve, time_t expires) set_expiry(cached_resolve_t *resolve, time_t expires)
{ {
...@@ -318,6 +337,7 @@ purge_expired_resolves(uint32_t now) ...@@ -318,6 +337,7 @@ purge_expired_resolves(uint32_t now)
resolve->magic = 0xF0BBF0BB; resolve->magic = 0xF0BBF0BB;
tor_free(resolve); tor_free(resolve);
} else { } else {
/* This should be in state DONE. Make sure it's not in the cache. */
cached_resolve_t *tmp = HT_FIND(cache_map, &cache_root, resolve); cached_resolve_t *tmp = HT_FIND(cache_map, &cache_root, resolve);
tor_assert(tmp != resolve); tor_assert(tmp != resolve);
} }
...@@ -467,10 +487,10 @@ dns_resolve(edge_connection_t *exitconn) ...@@ -467,10 +487,10 @@ dns_resolve(edge_connection_t *exitconn)
HT_INSERT(cache_map, &cache_root, resolve); HT_INSERT(cache_map, &cache_root, resolve);
set_expiry(resolve, now + RESOLVE_MAX_TIMEOUT); set_expiry(resolve, now + RESOLVE_MAX_TIMEOUT);
log_debug(LD_EXIT,"Assigning question %s to dnsworker.", log_debug(LD_EXIT,"Launching %s.",
escaped_safe_str(exitconn->_base.address)); escaped_safe_str(exitconn->_base.address));
assert_cache_ok(); assert_cache_ok();
return assign_to_dnsworker(exitconn); return launch_resolve(exitconn);
} }
/** Log an error and abort if conn is waiting for a DNS resolve. /** Log an error and abort if conn is waiting for a DNS resolve.
...@@ -762,7 +782,7 @@ dns_found_answer(const char *address, uint32_t addr, char outcome, ...@@ -762,7 +782,7 @@ dns_found_answer(const char *address, uint32_t addr, char outcome,
* <b>exitconn</b>-\>address; tell that dns worker to begin resolving. * <b>exitconn</b>-\>address; tell that dns worker to begin resolving.
*/ */
static int static int
assign_to_dnsworker(edge_connection_t *exitconn) lauch_resolve(edge_connection_t *exitconn)
{ {
connection_t *dnsconn; connection_t *dnsconn;
unsigned char len; unsigned char len;
...@@ -1211,7 +1231,7 @@ eventdns_callback(int result, char type, int count, int ttl, void *addresses, ...@@ -1211,7 +1231,7 @@ eventdns_callback(int result, char type, int count, int ttl, void *addresses,
} }
static int static int
assign_to_dnsworker(edge_connection_t *exitconn) launch_resolve(edge_connection_t *exitconn)
{ {
char *addr = tor_strdup(exitconn->_base.address); char *addr = tor_strdup(exitconn->_base.address);
int r; int r;
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment