]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
iterator works better with failing hosts.
authorWouter Wijngaards <wouter@nlnetlabs.nl>
Fri, 31 Aug 2007 09:38:55 +0000 (09:38 +0000)
committerWouter Wijngaards <wouter@nlnetlabs.nl>
Fri, 31 Aug 2007 09:38:55 +0000 (09:38 +0000)
git-svn-id: file:///svn/unbound/trunk@571 be551aaa-1e26-0410-a405-d3ace91eadb9

daemon/worker.c
doc/Changelog
iterator/iterator.c

index b961a1e5725af352ca78b89e136f5b3c454b0d75..437c62adf0bb02f18327aaaf50473cbedca50ef9 100644 (file)
@@ -142,7 +142,6 @@ worker_mem_report(struct worker* worker, struct serviced_query* cur_serv)
                sizeof(*worker->env.scratch_buffer) + 
                ldns_buffer_capacity(worker->env.scratch_buffer);
        if(cur_serv) {
-               log_info("cur_serv = %d", (int)serviced_get_mem(cur_serv));
                me += serviced_get_mem(cur_serv);
        }
        total = front+back+mesh+msg+rrset+infra+iter+val+ac+superac+me;
index a1819ffe8cd51d9501b814bee7848b242e567a1c..d5d41913cc57b3ec97e5c3fb57217c0a0c97e159 100644 (file)
@@ -1,5 +1,8 @@
 31 August 2007: Wouter
        - can read bind trusted-keys { ... }; files, in a compatibility mode. 
+       - iterator should not detach target queries that it still could need.
+         the protection against multiple outstanding queries is moved to a
+         current_query num check.
 
 30 August 2007: Wouter
        - fixup override date config option.
index 8ad0ed2cfb95e08937e343817fed3c6269a54bd9..f9b2cd42318fb3db7dbeda851feb9f462902d4e4 100644 (file)
@@ -915,6 +915,15 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
                verbose(VERB_DETAIL, "Failed to get a delegation, giving up");
                return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
        }
+       delegpt_log(iq->dp);
+
+       if(iq->num_current_queries>0) {
+               /* already busy answering a query, this restart is because
+                * more delegpt addrs became available, wait for existing
+                * query. */
+               verbose(VERB_ALGO, "woke up, but wait for outstanding query");
+               return 0;
+       }
 
        tf_policy = 0;
        if(iq->depth <= ie->max_dependency_depth) {
@@ -996,11 +1005,6 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
                                iq->num_current_queries);
                return 0;
        }
-       /* move other targets to slumber list */
-       if(iq->num_target_queries>0) {
-               (*qstate->env->detach_subs)(qstate);
-               iq->num_target_queries = 0;
-       }
 
        /* We have a valid target. */
        log_query_info(VERB_DETAIL, "sending query:", &iq->qchase);
@@ -1271,6 +1275,8 @@ processTargetResponse(struct module_qstate* qstate, int id,
        log_assert(qstate->return_rcode == LDNS_RCODE_NOERROR);
 
        foriq->state = QUERYTARGETS_STATE;
+       log_query_info(VERB_ALGO, "processTargetResponse", &qstate->qinfo);
+       log_query_info(VERB_ALGO, "processTargetResponse super", &forq->qinfo);
 
        /* check to see if parent event is still interested (in orig name).  */
        dpns = delegpt_find_ns(foriq->dp, qstate->qinfo.qname,
@@ -1307,7 +1313,12 @@ processTargetResponse(struct module_qstate* qstate, int id,
                }
                if(!delegpt_add_rrset(foriq->dp, forq->region, rrset))
                        log_err("out of memory adding targets");
-       } else  dpns->resolved = 1; /* fail the target */
+               verbose(VERB_ALGO, "added target response");
+               delegpt_log(foriq->dp);
+       } else {
+               verbose(VERB_ALGO, "iterator TargetResponse failed");
+               dpns->resolved = 1; /* fail the target */
+       }
 }
 
 /**