Skip to content

Commit

Permalink
Select random IO channel when sending request.
Browse files Browse the repository at this point in the history
  • Loading branch information
vstakhov committed Feb 13, 2014
1 parent 3ec28d9 commit 5325e87
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 22 deletions.
8 changes: 2 additions & 6 deletions src/dns_private.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ static const unsigned initial_n = 128;
static const unsigned initial_bias = 72;

static const int dns_port = 53;
static const int default_io_cnt = 8;

#define UDP_PACKET_SIZE 4096

Expand All @@ -56,14 +57,10 @@ static const int dns_port = 53;
*/
struct rdns_server {
char *name; /**< name of DNS server */

unsigned int port;

struct rdns_io_channel *io_channels;
struct rdns_io_channel *cur_io_channel;

unsigned int io_cnt;

struct rdns_io_channel **io_channels;
upstream_entry_t up;
};

Expand Down Expand Up @@ -112,7 +109,6 @@ struct rdns_io_channel {
int sock; /**< persistent socket */
void *async_io; /** async opaque ptr */
struct rdns_request *requests; /**< requests in flight */
struct rdns_io_channel *prev, *next;
bool want_reinit;
UT_hash_handle hh;
ref_entry_t ref;
Expand Down
27 changes: 13 additions & 14 deletions src/resolver.c
Original file line number Diff line number Diff line change
Expand Up @@ -431,7 +431,6 @@ rdns_make_request_full (

req->retransmits = repeats;
req->timeout = timeout;
req->io = NULL;
req->state = RDNS_REQUEST_NEW;
req->async = resolver->async;

Expand All @@ -443,15 +442,8 @@ rdns_make_request_full (
return NULL;
}

/* Now select IO channel */

req->io = serv->cur_io_channel;
if (req->io == NULL) {
DNS_DEBUG ("cannot find suitable io channel for the server %s", serv->name);
REF_RELEASE (req);
return NULL;
}
serv->cur_io_channel = serv->cur_io_channel->next;
/* Select random IO channel */
req->io = serv->io_channels[ottery_rand_uint32 () % serv->io_cnt];

/* Now send request to server */
r = rdns_send_request (req, req->io->sock, true);
Expand All @@ -478,8 +470,13 @@ rdns_resolver_init (struct rdns_resolver *resolver)
return false;
}

if (resolver->servers == NULL) {
return false;
}

/* Now init io channels to all servers */
UPSTREAM_FOREACH (resolver->servers, serv) {
serv->io_channels = calloc (serv->io_cnt, sizeof (struct rdns_io_channel *));
for (i = 0; i < serv->io_cnt; i ++) {
ioc = calloc (1, sizeof (struct rdns_io_channel));
ioc->sock = rdns_make_client_socket (serv->name, serv->port, SOCK_DGRAM);
Expand All @@ -491,10 +488,9 @@ rdns_resolver_init (struct rdns_resolver *resolver)
ioc->resolver = resolver;
ioc->async_io = resolver->async->add_read (resolver->async->data,
ioc->sock, ioc);
serv->cur_io_channel = ioc;
CDL_PREPEND (serv->io_channels, ioc);
HASH_ADD_INT (resolver->io_channels, sock, ioc);
REF_INIT_RETAIN (ioc, rdns_ioc_free);
serv->io_channels[i] = ioc;
}
}
}
Expand Down Expand Up @@ -567,7 +563,8 @@ static void
rdns_resolver_free (struct rdns_resolver *resolver)
{
struct rdns_server *serv, *stmp;
struct rdns_io_channel *ioc, *itmp1, *itmp2;
struct rdns_io_channel *ioc;
int i;

if (resolver->initialized) {
if (resolver->periodic != NULL) {
Expand All @@ -578,11 +575,13 @@ rdns_resolver_free (struct rdns_resolver *resolver)
}
/* Stop IO watch on all IO channels */
UPSTREAM_FOREACH_SAFE (resolver->servers, serv, stmp) {
CDL_FOREACH_SAFE (serv->io_channels, ioc, itmp1, itmp2) {
for (i = 0; i < serv->io_cnt; i ++) {
ioc = serv->io_channels[i];
HASH_DELETE (hh, resolver->io_channels, ioc);
REF_RELEASE (ioc);
}
UPSTREAM_DEL (resolver->servers, serv);
free (serv->io_channels);
free (serv->name);
free (serv);
}
Expand Down
4 changes: 2 additions & 2 deletions src/util.c
Original file line number Diff line number Diff line change
Expand Up @@ -422,10 +422,10 @@ rdns_resolver_parse_resolv_conf (struct rdns_resolver *resolver, const char *pat

while (!feof (in)) {
if (fgets (buf, sizeof (buf), in) == NULL) {
fclose (in);
return false;
break;
}
if (!rdns_resolver_conf_process_line (resolver, buf)) {
DNS_DEBUG ("rdns_resolver_parse_resolv_conf: cannot parse line: %s", buf);
fclose (in);
return false;
}
Expand Down

0 comments on commit 5325e87

Please sign in to comment.