[svn] commit: r2248 - /branches/trac192/src/lib/datasrc/data_source.cc

BIND 10 source code commits bind10-changes at lists.isc.org
Wed Jun 23 22:00:43 UTC 2010


Author: each
Date: Wed Jun 23 22:00:43 2010
New Revision: 2248

Log:
Refactored doQueryTask() somewhat, moving the cache lookup code into
a separate checkCache() function and tidying it up.

Modified:
    branches/trac192/src/lib/datasrc/data_source.cc

Modified: branches/trac192/src/lib/datasrc/data_source.cc
==============================================================================
--- branches/trac192/src/lib/datasrc/data_source.cc (original)
+++ branches/trac192/src/lib/datasrc/data_source.cc Wed Jun 23 22:00:43 2010
@@ -138,38 +138,36 @@
                                      QueryTask::FOLLOWCNAME)));
 }
 
-// Perform the query specified in a QueryTask object
-DataSrc::Result
-doQueryTask(QueryTask& task, ZoneInfo& zoneinfo, RRsetList& target) {
+// Check the cache for data which can answer the current
+// query task.
+bool
+checkCache(QueryTask& task, RRsetList& target) {
     HotCache& cache = task.q.cache();
     RRsetList rrsets;
     RRsetPtr rrset;
-    ConstCacheNodePtr cnode;
     int count = 0;
     uint32_t flags = 0, cflags = 0;
     bool hit = false, found = false;
 
-    // First, we check the hot cache for the requested information.
     switch (task.op) {
     case QueryTask::SIMPLE_QUERY:       // Find exact RRset
+        // ANY queries must be handled by the low-level data source,
+        // or the results won't be guaranteed to be complete
         if (task.qtype == RRType::ANY() || task.qclass == RRClass::ANY()) {
-            // ANY queries must be handled by the low-level data source
-            // or the results won't be guaranteed to be complete
             break;
         }
 
         hit = cache.retrieve(task.qname, task.qclass, task.qtype, rrset, flags);
-        if (!hit) {
-            break;
-        }
-
-        if (rrset) {
-            rrsets.addRRset(rrset);
-        }
-
-        task.flags = flags;
-        target.append(rrsets);
-        return (DataSrc::SUCCESS);
+        if (hit) {
+            if (rrset) {
+                rrsets.addRRset(rrset);
+            }
+
+            task.flags = flags;
+            target.append(rrsets);
+            return (true);
+        }
+        break;
 
     case QueryTask::AUTH_QUERY:         // Find exact RRset or CNAME
         if (task.qtype == RRType::ANY() || task.qclass == RRClass::ANY()) {
@@ -177,22 +175,21 @@
         }
 
         hit = cache.retrieve(task.qname, task.qclass, task.qtype, rrset, flags);
-        if (!hit || !rrset) {
+        if (!hit || !rrset || (flags & DataSrc::CNAME_FOUND) != 0) {
             hit = cache.retrieve(task.qname, task.qclass, RRType::CNAME(),
                                  rrset, flags);
         }
 
-        if (!hit || !rrset) {
-            break;
-        }
-
-        if (rrset) {
-            rrsets.addRRset(rrset);
-        }
-
-        task.flags = flags;
-        target.append(rrsets);
-        return (DataSrc::SUCCESS);
+        if (hit) {
+            if (rrset) {
+                rrsets.addRRset(rrset);
+            }
+
+            task.flags = flags;
+            target.append(rrsets);
+            return (true);
+        }
+        break;
 
     case QueryTask::GLUE_QUERY:         // Find addresses
     case QueryTask::NOGLUE_QUERY:
@@ -275,9 +272,23 @@
             }
             target.append(rrsets);
             task.flags = flags;
-            return (DataSrc::SUCCESS);
+            return (true);
         } 
         break;
+    }
+
+    return (false);
+}
+
+// Carry out the query specified in a QueryTask object
+DataSrc::Result
+doQueryTask(QueryTask& task, ZoneInfo& zoneinfo, RRsetList& target) {
+    HotCache& cache = task.q.cache();
+    RRsetPtr rrset;
+
+    // First, check the cache for matching data
+    if (checkCache(task, target)) {
+        return (DataSrc::SUCCESS);
     }
 
     // Requested data weren't in the cache (or were, but had expired),




More information about the bind10-changes mailing list