[svn] commit: r1191 - in /trunk/src/lib/auth: data_source.cc data_source.h data_source_sqlite3.cc data_source_sqlite3.h data_source_sqlite3_unittest.cc data_source_static.cc data_source_static.h data_source_static_unittest.cc unittest_ds.cc unittest_ds.h
BIND 10 source code commits
bind10-changes at lists.isc.org
Mon Mar 8 00:03:04 UTC 2010
Author: each
Date: Mon Mar 8 00:03:04 2010
New Revision: 1191
Log:
specify query class when calling findClosestEnclosure(), so that we can
skip data sources that definitely won't match. (I'm not sure about the
design here and may revisit it, but there should be a marginal speedup
from not having to compare every single qname to "authors.bind" and
"version.bind".)
Modified:
trunk/src/lib/auth/data_source.cc
trunk/src/lib/auth/data_source.h
trunk/src/lib/auth/data_source_sqlite3.cc
trunk/src/lib/auth/data_source_sqlite3.h
trunk/src/lib/auth/data_source_sqlite3_unittest.cc
trunk/src/lib/auth/data_source_static.cc
trunk/src/lib/auth/data_source_static.h
trunk/src/lib/auth/data_source_static_unittest.cc
trunk/src/lib/auth/unittest_ds.cc
trunk/src/lib/auth/unittest_ds.h
Modified: trunk/src/lib/auth/data_source.cc
==============================================================================
--- trunk/src/lib/auth/data_source.cc (original)
+++ trunk/src/lib/auth/data_source.cc Mon Mar 8 00:03:04 2010
@@ -495,7 +495,7 @@
NameMatch match(task->qtype == RRType::DS() ?
task->qname.split(1, task->qname.getLabelCount() - 1) :
task->qname);
- findClosestEnclosure(match);
+ findClosestEnclosure(match, task->qclass);
const DataSrc* datasource = match.bestDataSrc();
const Name* zonename = match.closestName();
@@ -782,15 +782,22 @@
}
void
-MetaDataSrc::findClosestEnclosure(NameMatch& match) const
-{
+MetaDataSrc::findClosestEnclosure(NameMatch& match, const RRClass& qclass) const
+{
+ if (qclass == RRClass::ANY()) {
+ isc_throw(Unexpected, "invalid query class");
+ }
+
+ if (getClass() != RRClass::ANY() && getClass() != qclass) {
+ return;
+ }
+
BOOST_FOREACH (ConstDataSrcPtr data_src, data_sources) {
- if (getClass() != RRClass::ANY() &&
- data_src->getClass() != getClass()) {
+ if (data_src->getClass() != qclass) {
continue;
}
- data_src->findClosestEnclosure(match);
+ data_src->findClosestEnclosure(match, qclass);
}
}
Modified: trunk/src/lib/auth/data_source.h
==============================================================================
--- trunk/src/lib/auth/data_source.h (original)
+++ trunk/src/lib/auth/data_source.h Mon Mar 8 00:03:04 2010
@@ -95,7 +95,9 @@
// 'Medium-level' methods. This will be implemented by the general
// DataSrc class but MAY be overwritten by subclasses.
- virtual void findClosestEnclosure(NameMatch& match) const = 0;
+ virtual void findClosestEnclosure(NameMatch& match,
+ const isc::dns::RRClass& qclasss)
+ const = 0;
// Optional 'low-level' methods. These will have stub implementations
// in the general DataSrc class but MAY be overwritten by subclasses
@@ -170,7 +172,9 @@
virtual void doQuery(Query& q);
- virtual void findClosestEnclosure(NameMatch& match) const = 0;
+ virtual void findClosestEnclosure(NameMatch& match,
+ const isc::dns::RRClass& qclass)
+ const = 0;
const isc::dns::RRClass& getClass() const { return rrclass; }
void setClass(isc::dns::RRClass& c) { rrclass = c; }
@@ -241,7 +245,8 @@
//@}
void addDataSrc(ConstDataSrcPtr data_src);
- void findClosestEnclosure(NameMatch& match) const;
+ void findClosestEnclosure(NameMatch& match,
+ const isc::dns::RRClass& qclass) const;
// Actual queries for data should not be sent to a MetaDataSrc object,
// so we return NOT_IMPLEMENTED if we receive any.
Modified: trunk/src/lib/auth/data_source_sqlite3.cc
==============================================================================
--- trunk/src/lib/auth/data_source_sqlite3.cc (original)
+++ trunk/src/lib/auth/data_source_sqlite3.cc Mon Mar 8 00:03:04 2010
@@ -500,9 +500,14 @@
}
void
-Sqlite3DataSrc::findClosestEnclosure(NameMatch& match) const {
+Sqlite3DataSrc::findClosestEnclosure(NameMatch& match,
+ const RRClass& qclass) const {
const char* position = NULL;
+ if (qclass != getClass()) {
+ return;
+ }
+
if (findClosest(match.qname().toText().c_str(), &position) == -1) {
return;
}
Modified: trunk/src/lib/auth/data_source_sqlite3.h
==============================================================================
--- trunk/src/lib/auth/data_source_sqlite3.h (original)
+++ trunk/src/lib/auth/data_source_sqlite3.h Mon Mar 8 00:03:04 2010
@@ -59,7 +59,8 @@
~Sqlite3DataSrc();
//@}
- void findClosestEnclosure(NameMatch& match) const;
+ void findClosestEnclosure(NameMatch& match,
+ const isc::dns::RRClass& qclass) const;
Result findRRset(const Query& q,
const isc::dns::Name& qname,
Modified: trunk/src/lib/auth/data_source_sqlite3_unittest.cc
==============================================================================
--- trunk/src/lib/auth/data_source_sqlite3_unittest.cc (original)
+++ trunk/src/lib/auth/data_source_sqlite3_unittest.cc Mon Mar 8 00:03:04 2010
@@ -353,7 +353,7 @@
EXPECT_EQ(DataSrc::SUCCESS, data_source.init(SQLITE_DBFILE_EXAMPLE2));
NameMatch name_match(www_name);
- data_source.findClosestEnclosure(name_match);
+ data_source.findClosestEnclosure(name_match, RRClass::IN());
EXPECT_EQ(NULL, name_match.closestName());
EXPECT_EQ(NULL, name_match.bestDataSrc());
}
@@ -365,7 +365,7 @@
TEST_F(Sqlite3DataSourceTest, findClosestEnclosure) {
NameMatch name_match(www_name);
- data_source.findClosestEnclosure(name_match);
+ data_source.findClosestEnclosure(name_match, RRClass::IN());
EXPECT_EQ(zone_name, *name_match.closestName());
EXPECT_EQ(&data_source, name_match.bestDataSrc());
}
@@ -374,14 +374,14 @@
// The search name exists both in the parent and child zones, but
// child has a better match.
NameMatch name_match(child_name);
- data_source.findClosestEnclosure(name_match);
+ data_source.findClosestEnclosure(name_match, RRClass::IN());
EXPECT_EQ(child_name, *name_match.closestName());
EXPECT_EQ(&data_source, name_match.bestDataSrc());
}
TEST_F(Sqlite3DataSourceTest, findClosestEnclosureNoMatch) {
NameMatch name_match(nomatch_name);
- data_source.findClosestEnclosure(name_match);
+ data_source.findClosestEnclosure(name_match, RRClass::IN());
EXPECT_EQ(NULL, name_match.closestName());
EXPECT_EQ(NULL, name_match.bestDataSrc());
}
Modified: trunk/src/lib/auth/data_source_static.cc
==============================================================================
--- trunk/src/lib/auth/data_source_static.cc (original)
+++ trunk/src/lib/auth/data_source_static.cc Mon Mar 8 00:03:04 2010
@@ -101,9 +101,14 @@
}
void
-StaticDataSrc::findClosestEnclosure(NameMatch& match) const {
+StaticDataSrc::findClosestEnclosure(NameMatch& match,
+ const RRClass& qclass) const {
const Name& qname = match.qname();
NameComparisonResult::NameRelation cmp;
+
+ if (qclass != getClass()) {
+ return;
+ }
cmp = qname.compare(impl_->version_name).getRelation();
if (cmp == NameComparisonResult::EQUAL ||
Modified: trunk/src/lib/auth/data_source_static.h
==============================================================================
--- trunk/src/lib/auth/data_source_static.h (original)
+++ trunk/src/lib/auth/data_source_static.h Mon Mar 8 00:03:04 2010
@@ -58,7 +58,8 @@
~StaticDataSrc();
//@}
- void findClosestEnclosure(NameMatch& match) const;
+ void findClosestEnclosure(NameMatch& match,
+ const isc::dns::RRClass& qclass) const;
Result findRRset(const Query& q,
const isc::dns::Name& qname,
Modified: trunk/src/lib/auth/data_source_static_unittest.cc
==============================================================================
--- trunk/src/lib/auth/data_source_static_unittest.cc (original)
+++ trunk/src/lib/auth/data_source_static_unittest.cc Mon Mar 8 00:03:04 2010
@@ -132,35 +132,35 @@
TEST_F(StaticDataSourceTest, findClosestEnclosureForVersion) {
NameMatch name_match(version_name);
- data_source.findClosestEnclosure(name_match);
+ data_source.findClosestEnclosure(name_match, RRClass::IN());
EXPECT_EQ(version_name, *name_match.closestName());
EXPECT_EQ(&data_source, name_match.bestDataSrc());
}
TEST_F(StaticDataSourceTest, findClosestEnclosureForVersionPartial) {
NameMatch name_match(Name("foo").concatenate(version_name));
- data_source.findClosestEnclosure(name_match);
+ data_source.findClosestEnclosure(name_match, RRClass::IN());
EXPECT_EQ(version_name, *name_match.closestName());
EXPECT_EQ(&data_source, name_match.bestDataSrc());
}
TEST_F(StaticDataSourceTest, findClosestEnclosureForAuthors) {
NameMatch name_match(authors_name);
- data_source.findClosestEnclosure(name_match);
+ data_source.findClosestEnclosure(name_match, RRClass::IN());
EXPECT_EQ(authors_name, *name_match.closestName());
EXPECT_EQ(&data_source, name_match.bestDataSrc());
}
TEST_F(StaticDataSourceTest, findClosestEnclosureForAuthorsPartial) {
NameMatch name_match(Name("foo").concatenate(authors_name));
- data_source.findClosestEnclosure(name_match);
+ data_source.findClosestEnclosure(name_match, RRClass::IN());
EXPECT_EQ(authors_name, *name_match.closestName());
EXPECT_EQ(&data_source, name_match.bestDataSrc());
}
TEST_F(StaticDataSourceTest, findClosestEnclosureNoMatch) {
NameMatch name_match(nomatch_name);
- data_source.findClosestEnclosure(name_match);
+ data_source.findClosestEnclosure(name_match, RRClass::IN());
EXPECT_EQ(NULL, name_match.closestName());
EXPECT_EQ(NULL, name_match.bestDataSrc());
}
Modified: trunk/src/lib/auth/unittest_ds.cc
==============================================================================
--- trunk/src/lib/auth/unittest_ds.cc (original)
+++ trunk/src/lib/auth/unittest_ds.cc Mon Mar 8 00:03:04 2010
@@ -414,9 +414,14 @@
}
void
-TestDataSrc::findClosestEnclosure(NameMatch& match) const {
+TestDataSrc::findClosestEnclosure(NameMatch& match,
+ const RRClass& qclass) const {
const Name& qname = match.qname();
NameComparisonResult::NameRelation cmp;
+
+ if (qclass != getClass()) {
+ return;
+ }
cmp = qname.compare(sql1).getRelation();
if (cmp == NameComparisonResult::EQUAL ||
Modified: trunk/src/lib/auth/unittest_ds.h
==============================================================================
--- trunk/src/lib/auth/unittest_ds.h (original)
+++ trunk/src/lib/auth/unittest_ds.h Mon Mar 8 00:03:04 2010
@@ -48,7 +48,8 @@
~TestDataSrc() {}
//@}
- void findClosestEnclosure(NameMatch& match) const;
+ void findClosestEnclosure(NameMatch& match,
+ const isc::dns::RRClass& qclass) const;
Result findRRset(const Query& q,
const isc::dns::Name& qname,
More information about the bind10-changes
mailing list