]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
fixes.
authorWouter Wijngaards <wouter@nlnetlabs.nl>
Fri, 15 Jun 2007 09:13:54 +0000 (09:13 +0000)
committerWouter Wijngaards <wouter@nlnetlabs.nl>
Fri, 15 Jun 2007 09:13:54 +0000 (09:13 +0000)
git-svn-id: file:///svn/unbound/trunk@390 be551aaa-1e26-0410-a405-d3ace91eadb9

daemon/daemon.c
daemon/worker.c
daemon/worker.h
doc/Changelog
iterator/iterator.c
util/module.h

index 66ebb7181c78f836a28d70e1ef047d57098eb4ac..db6b2e399e2fb2f623733a592954906270aa43c6 100644 (file)
@@ -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; i<daemon->num_modules; i++) {
                log_info("init module %d: %s", i, daemon->modfunc[i]->name);
                if(!(*daemon->modfunc[i]->init)(daemon->env, i)) {
index b039888d2ac6e27f1ba9f7f2354d7103baba5e9d..b5609eb7a052d5bf69a48458c6d6c9ff52c222b9 100644 (file)
@@ -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));
+       }
+}
index 2f6b847b7b11657ba605bf0a0b9d3a73c8d1f4ab..13b8680580892b1c1051f080106a5320dbdf677b 100644 (file)
@@ -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 */
index 0e4b55bcb162bf8c2433f686f697b8f77bc4fce0..615a2e6ee3142e04b7b261a3f7ca3b4ecaf6c7f2 100644 (file)
@@ -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
index 093f1721bbfc422b6dc6cece9b5f1c2c68911ab7..f895f99ba18fa970d64959dff6dfba00e63c10dd 100644 (file)
@@ -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);
index ab29ed5d6fdcf1df830cefb29baa6390b708e924..c534704ef4bf4a7c21a469c822cb6cd19a374f73 100644 (file)
@@ -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 */