mirror of
https://github.com/NLnetLabs/unbound.git
synced 2025-12-20 23:00:56 -05:00
review of worker.c
git-svn-id: file:///svn/unbound/trunk@211 be551aaa-1e26-0410-a405-d3ace91eadb9
This commit is contained in:
parent
6849e91549
commit
c6ab7d4f50
4 changed files with 21 additions and 7 deletions
|
|
@ -158,13 +158,15 @@ worker_handle_reply(struct comm_point* c, void* arg, int error,
|
||||||
replyerror(LDNS_RCODE_SERVFAIL, w);
|
replyerror(LDNS_RCODE_SERVFAIL, w);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
memmove(rep->reply, ldns_buffer_at(c->buffer, DNS_ID_AND_FLAGS),
|
memcpy(rep->reply, ldns_buffer_at(c->buffer, DNS_ID_AND_FLAGS),
|
||||||
rep->replysize);
|
rep->replysize);
|
||||||
reply_info_answer_iov(rep, w->query_id, w->query_flags,
|
reply_info_answer_iov(rep, w->query_id, w->query_flags,
|
||||||
&w->query_reply);
|
&w->query_reply);
|
||||||
req_release(w);
|
req_release(w);
|
||||||
/* store or update reply in the cache */
|
/* store or update reply in the cache */
|
||||||
if(!(e = query_info_entrysetup(&w->qinfo, rep, w->query_hash))) {
|
if(!(e = query_info_entrysetup(&w->qinfo, rep, w->query_hash))) {
|
||||||
|
free(rep->reply);
|
||||||
|
free(rep);
|
||||||
log_err("out of memory");
|
log_err("out of memory");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -291,10 +293,11 @@ worker_handle_request(struct comm_point* c, void* arg, int error,
|
||||||
}
|
}
|
||||||
h = query_info_hash(&qinfo);
|
h = query_info_hash(&qinfo);
|
||||||
if((e=slabhash_lookup(worker->daemon->msg_cache, h, &qinfo, 0))) {
|
if((e=slabhash_lookup(worker->daemon->msg_cache, h, &qinfo, 0))) {
|
||||||
/* answer from cache */
|
/* answer from cache - we have acquired a readlock on it */
|
||||||
|
uint16_t id;
|
||||||
log_info("answer from the cache");
|
log_info("answer from the cache");
|
||||||
reply_info_answer_iov((struct reply_info*)e->data,
|
memcpy(&id, ldns_buffer_begin(c->buffer), sizeof(uint16_t));
|
||||||
ldns_buffer_read_u16_at(c->buffer, 0),
|
reply_info_answer_iov((struct reply_info*)e->data, id,
|
||||||
ldns_buffer_read_u16_at(c->buffer, 2), repinfo);
|
ldns_buffer_read_u16_at(c->buffer, 2), repinfo);
|
||||||
lock_rw_unlock(&e->lock);
|
lock_rw_unlock(&e->lock);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -307,7 +310,7 @@ worker_handle_request(struct comm_point* c, void* arg, int error,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* grab a work request structure for this new request */
|
/* grab a work request structure for this new request */
|
||||||
if(!worker->free_queries) {
|
if(!(w = worker->free_queries)) {
|
||||||
/* we could get this due to a slow tcp incoming query,
|
/* we could get this due to a slow tcp incoming query,
|
||||||
that started before we performed listen_pushback */
|
that started before we performed listen_pushback */
|
||||||
verbose(VERB_DETAIL, "worker: too many incoming requests "
|
verbose(VERB_DETAIL, "worker: too many incoming requests "
|
||||||
|
|
@ -315,7 +318,6 @@ worker_handle_request(struct comm_point* c, void* arg, int error,
|
||||||
comm_point_drop_reply(repinfo);
|
comm_point_drop_reply(repinfo);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
w = worker->free_queries;
|
|
||||||
worker->free_queries = w->next;
|
worker->free_queries = w->next;
|
||||||
worker->num_requests ++;
|
worker->num_requests ++;
|
||||||
log_assert(worker->num_requests <= worker->request_size);
|
log_assert(worker->num_requests <= worker->request_size);
|
||||||
|
|
@ -351,14 +353,17 @@ worker_sighandler(int sig, void* arg)
|
||||||
break;
|
break;
|
||||||
case SIGINT:
|
case SIGINT:
|
||||||
log_info("caught signal SIGINT");
|
log_info("caught signal SIGINT");
|
||||||
|
worker->need_to_restart = 0;
|
||||||
comm_base_exit(worker->base);
|
comm_base_exit(worker->base);
|
||||||
break;
|
break;
|
||||||
case SIGQUIT:
|
case SIGQUIT:
|
||||||
log_info("caught signal SIGQUIT");
|
log_info("caught signal SIGQUIT");
|
||||||
|
worker->need_to_restart = 0;
|
||||||
comm_base_exit(worker->base);
|
comm_base_exit(worker->base);
|
||||||
break;
|
break;
|
||||||
case SIGTERM:
|
case SIGTERM:
|
||||||
log_info("caught signal SIGTERM");
|
log_info("caught signal SIGTERM");
|
||||||
|
worker->need_to_restart = 0;
|
||||||
comm_base_exit(worker->base);
|
comm_base_exit(worker->base);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,8 @@
|
||||||
|
2 April 2007: Wouter
|
||||||
|
- check sizes of udp received messages, not too short.
|
||||||
|
- review changes. Some memmoves can be memcpys: 4byte aligned.
|
||||||
|
set id correctly on cached answers.
|
||||||
|
|
||||||
29 March 2007: Wouter
|
29 March 2007: Wouter
|
||||||
- writev or sendmsg used when answering from cache.
|
- writev or sendmsg used when answering from cache.
|
||||||
This avoids a copy of the data.
|
This avoids a copy of the data.
|
||||||
|
|
|
||||||
|
|
@ -123,6 +123,10 @@ outnet_udp_cb(struct comm_point* c, void* arg, int error,
|
||||||
log_info("outnetudp got udp error %d", error);
|
log_info("outnetudp got udp error %d", error);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
if(ldns_buffer_limit(c->buffer) < LDNS_HEADER_SIZE) {
|
||||||
|
log_info("outnetudp udp too short");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
log_assert(reply_info);
|
log_assert(reply_info);
|
||||||
|
|
||||||
/* setup lookup key */
|
/* setup lookup key */
|
||||||
|
|
|
||||||
|
|
@ -98,7 +98,7 @@ query_info_allocqname(struct query_info* m)
|
||||||
log_err("query_info_allocqname: out of memory");
|
log_err("query_info_allocqname: out of memory");
|
||||||
return 0; /* out of memory */
|
return 0; /* out of memory */
|
||||||
}
|
}
|
||||||
memmove(m->qname, q, m->qnamesize);
|
memcpy(m->qname, q, m->qnamesize);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue