mirror of
https://github.com/NLnetLabs/unbound.git
synced 2025-12-24 00:29:58 -05:00
fixes.
git-svn-id: file:///svn/unbound/trunk@390 be551aaa-1e26-0410-a405-d3ace91eadb9
This commit is contained in:
parent
7608c92bb7
commit
59824635da
6 changed files with 42 additions and 12 deletions
|
|
@ -167,6 +167,7 @@ static void daemon_setup_modules(struct daemon* daemon)
|
||||||
daemon->env->worker = NULL;
|
daemon->env->worker = NULL;
|
||||||
daemon->env->send_packet = &worker_send_packet;
|
daemon->env->send_packet = &worker_send_packet;
|
||||||
daemon->env->send_query = &worker_send_query;
|
daemon->env->send_query = &worker_send_query;
|
||||||
|
daemon->env->remove_subqueries = &worker_slumber_subqueries;
|
||||||
for(i=0; i<daemon->num_modules; i++) {
|
for(i=0; i<daemon->num_modules; i++) {
|
||||||
log_info("init module %d: %s", i, daemon->modfunc[i]->name);
|
log_info("init module %d: %s", i, daemon->modfunc[i]->name);
|
||||||
if(!(*daemon->modfunc[i]->init)(daemon->env, i)) {
|
if(!(*daemon->modfunc[i]->init)(daemon->env, i)) {
|
||||||
|
|
|
||||||
|
|
@ -125,18 +125,7 @@ qstate_free(struct worker* worker, struct module_qstate* qstate)
|
||||||
{
|
{
|
||||||
if(!qstate)
|
if(!qstate)
|
||||||
return;
|
return;
|
||||||
if(qstate->subquery_first) {
|
worker_slumber_subqueries(qstate);
|
||||||
while(qstate->subquery_first) {
|
|
||||||
/* put subqueries on slumber list */
|
|
||||||
struct module_qstate* s = qstate->subquery_first;
|
|
||||||
module_subreq_remove(&qstate->subquery_first, s);
|
|
||||||
s->parent = NULL;
|
|
||||||
s->work_info = NULL;
|
|
||||||
module_subreq_insert(&worker->slumber_list, s);
|
|
||||||
}
|
|
||||||
verbose(VERB_ALGO, "worker: slumber list has %d entries",
|
|
||||||
module_subreq_num(worker->slumber_list));
|
|
||||||
}
|
|
||||||
qstate_cleanup(worker, qstate);
|
qstate_cleanup(worker, qstate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -911,3 +900,21 @@ worker_send_query(uint8_t* qname, size_t qnamelen, uint16_t qtype,
|
||||||
}
|
}
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
worker_slumber_subqueries(struct module_qstate* qstate)
|
||||||
|
{
|
||||||
|
struct worker* worker = qstate->env->worker;
|
||||||
|
if(qstate->subquery_first) {
|
||||||
|
while(qstate->subquery_first) {
|
||||||
|
/* put subqueries on slumber list */
|
||||||
|
struct module_qstate* s = qstate->subquery_first;
|
||||||
|
module_subreq_remove(&qstate->subquery_first, s);
|
||||||
|
s->parent = NULL;
|
||||||
|
s->work_info = NULL;
|
||||||
|
module_subreq_insert(&worker->slumber_list, s);
|
||||||
|
}
|
||||||
|
verbose(VERB_ALGO, "worker: slumber list has %d entries",
|
||||||
|
module_subreq_num(worker->slumber_list));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -215,4 +215,10 @@ struct outbound_entry* worker_send_query(uint8_t* qname, size_t qnamelen,
|
||||||
struct sockaddr_storage* addr, socklen_t addrlen,
|
struct sockaddr_storage* addr, socklen_t addrlen,
|
||||||
struct module_qstate* q);
|
struct module_qstate* q);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove subqueries, by moving them to the slumber list.
|
||||||
|
* @param qstate: this state has subqueries removed.
|
||||||
|
*/
|
||||||
|
void worker_slumber_subqueries(struct module_qstate* qstate);
|
||||||
|
|
||||||
#endif /* DAEMON_WORKER_H */
|
#endif /* DAEMON_WORKER_H */
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,9 @@
|
||||||
multiple times, this will succeed. Only one callback will happen;
|
multiple times, this will succeed. Only one callback will happen;
|
||||||
multiple outbound-list entries result (but the double cleanup of it
|
multiple outbound-list entries result (but the double cleanup of it
|
||||||
will not matter).
|
will not matter).
|
||||||
|
- when iterator moves on due to CNAME or referral, it will remove
|
||||||
|
the subqueries (for other targets). These are put on the slumber
|
||||||
|
list.
|
||||||
|
|
||||||
14 June 2007: Wouter
|
14 June 2007: Wouter
|
||||||
- num query targets was > 0 , not >= 0 compared, so that fetch
|
- num query targets was > 0 , not >= 0 compared, so that fetch
|
||||||
|
|
|
||||||
|
|
@ -1133,6 +1133,7 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq,
|
||||||
return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
|
return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
|
||||||
/* close down outstanding requests to be discarded */
|
/* close down outstanding requests to be discarded */
|
||||||
outbound_list_clear(&iq->outlist);
|
outbound_list_clear(&iq->outlist);
|
||||||
|
(*qstate->env->remove_subqueries)(qstate);
|
||||||
return final_state(iq);
|
return final_state(iq);
|
||||||
} else if(type == RESPONSE_TYPE_REFERRAL) {
|
} else if(type == RESPONSE_TYPE_REFERRAL) {
|
||||||
/* REFERRAL type responses get a reset of the
|
/* REFERRAL type responses get a reset of the
|
||||||
|
|
@ -1160,6 +1161,7 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq,
|
||||||
* handled? Say by a subquery that inherits the outbound_entry.
|
* handled? Say by a subquery that inherits the outbound_entry.
|
||||||
*/
|
*/
|
||||||
outbound_list_clear(&iq->outlist);
|
outbound_list_clear(&iq->outlist);
|
||||||
|
(*qstate->env->remove_subqueries)(qstate);
|
||||||
verbose(VERB_ALGO, "cleared outbound list for next round");
|
verbose(VERB_ALGO, "cleared outbound list for next round");
|
||||||
return next_state(iq, QUERYTARGETS_STATE);
|
return next_state(iq, QUERYTARGETS_STATE);
|
||||||
} else if(type == RESPONSE_TYPE_CNAME) {
|
} else if(type == RESPONSE_TYPE_CNAME) {
|
||||||
|
|
@ -1199,6 +1201,7 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq,
|
||||||
* handled? Say by a subquery that inherits the outbound_entry.
|
* handled? Say by a subquery that inherits the outbound_entry.
|
||||||
*/
|
*/
|
||||||
outbound_list_clear(&iq->outlist);
|
outbound_list_clear(&iq->outlist);
|
||||||
|
(*qstate->env->remove_subqueries)(qstate);
|
||||||
verbose(VERB_ALGO, "cleared outbound list for query restart");
|
verbose(VERB_ALGO, "cleared outbound list for query restart");
|
||||||
/* go to INIT_REQUEST_STATE for new qname. */
|
/* go to INIT_REQUEST_STATE for new qname. */
|
||||||
return next_state(iq, INIT_REQUEST_STATE);
|
return next_state(iq, INIT_REQUEST_STATE);
|
||||||
|
|
|
||||||
|
|
@ -117,6 +117,16 @@ struct module_env {
|
||||||
struct sockaddr_storage* addr, socklen_t addrlen,
|
struct sockaddr_storage* addr, socklen_t addrlen,
|
||||||
struct module_qstate* q);
|
struct module_qstate* q);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cleanup subqueries from this query state. Either delete or
|
||||||
|
* move them somewhere else. This query state no longer needs the
|
||||||
|
* results from those subqueries.
|
||||||
|
* @param qstate: query state.
|
||||||
|
* subqueries are (re)moved so that no subq_done events from
|
||||||
|
* them will reach this qstate.
|
||||||
|
*/
|
||||||
|
void (*remove_subqueries)(struct module_qstate* qstate);
|
||||||
|
|
||||||
/** internal data for daemon - worker thread. */
|
/** internal data for daemon - worker thread. */
|
||||||
struct worker* worker;
|
struct worker* worker;
|
||||||
/** allocation service */
|
/** allocation service */
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue