[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