From 59824635da45ad3e5c9df9e7122fd9bdd2965ce0 Mon Sep 17 00:00:00 2001 From: Wouter Wijngaards Date: Fri, 15 Jun 2007 09:13:54 +0000 Subject: [PATCH] fixes. git-svn-id: file:///svn/unbound/trunk@390 be551aaa-1e26-0410-a405-d3ace91eadb9 --- daemon/daemon.c | 1 + daemon/worker.c | 31 +++++++++++++++++++------------ daemon/worker.h | 6 ++++++ doc/Changelog | 3 +++ iterator/iterator.c | 3 +++ util/module.h | 10 ++++++++++ 6 files changed, 42 insertions(+), 12 deletions(-) diff --git a/daemon/daemon.c b/daemon/daemon.c index 66ebb7181..db6b2e399 100644 --- a/daemon/daemon.c +++ b/daemon/daemon.c @@ -167,6 +167,7 @@ static void daemon_setup_modules(struct daemon* daemon) daemon->env->worker = NULL; daemon->env->send_packet = &worker_send_packet; daemon->env->send_query = &worker_send_query; + daemon->env->remove_subqueries = &worker_slumber_subqueries; for(i=0; inum_modules; i++) { log_info("init module %d: %s", i, daemon->modfunc[i]->name); if(!(*daemon->modfunc[i]->init)(daemon->env, i)) { diff --git a/daemon/worker.c b/daemon/worker.c index b039888d2..b5609eb7a 100644 --- a/daemon/worker.c +++ b/daemon/worker.c @@ -125,18 +125,7 @@ qstate_free(struct worker* worker, struct module_qstate* qstate) { if(!qstate) return; - 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)); - } + worker_slumber_subqueries(qstate); qstate_cleanup(worker, qstate); } @@ -911,3 +900,21 @@ worker_send_query(uint8_t* qname, size_t qnamelen, uint16_t qtype, } 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)); + } +} diff --git a/daemon/worker.h b/daemon/worker.h index 2f6b847b7..13b868058 100644 --- a/daemon/worker.h +++ b/daemon/worker.h @@ -215,4 +215,10 @@ struct outbound_entry* worker_send_query(uint8_t* qname, size_t qnamelen, struct sockaddr_storage* addr, socklen_t addrlen, 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 */ diff --git a/doc/Changelog b/doc/Changelog index 0e4b55bcb..615a2e6ee 100644 --- a/doc/Changelog +++ b/doc/Changelog @@ -3,6 +3,9 @@ multiple times, this will succeed. Only one callback will happen; multiple outbound-list entries result (but the double cleanup of it 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 - num query targets was > 0 , not >= 0 compared, so that fetch diff --git a/iterator/iterator.c b/iterator/iterator.c index 093f1721b..f895f99ba 100644 --- a/iterator/iterator.c +++ b/iterator/iterator.c @@ -1133,6 +1133,7 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq, return error_response(qstate, id, LDNS_RCODE_SERVFAIL); /* close down outstanding requests to be discarded */ outbound_list_clear(&iq->outlist); + (*qstate->env->remove_subqueries)(qstate); return final_state(iq); } else if(type == RESPONSE_TYPE_REFERRAL) { /* 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. */ outbound_list_clear(&iq->outlist); + (*qstate->env->remove_subqueries)(qstate); verbose(VERB_ALGO, "cleared outbound list for next round"); return next_state(iq, QUERYTARGETS_STATE); } 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. */ outbound_list_clear(&iq->outlist); + (*qstate->env->remove_subqueries)(qstate); verbose(VERB_ALGO, "cleared outbound list for query restart"); /* go to INIT_REQUEST_STATE for new qname. */ return next_state(iq, INIT_REQUEST_STATE); diff --git a/util/module.h b/util/module.h index ab29ed5d6..c534704ef 100644 --- a/util/module.h +++ b/util/module.h @@ -117,6 +117,16 @@ struct module_env { struct sockaddr_storage* addr, socklen_t addrlen, 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. */ struct worker* worker; /** allocation service */ -- 2.47.2