BIND 10 trac493, updated. ea0d42e325de86353e17b29c26257333f0fe016e [trac493] Add negative cache to the the resolver cache
BIND 10 source code commits
bind10-changes at lists.isc.org
Wed Feb 23 09:38:22 UTC 2011
The branch, trac493 has been updated
via ea0d42e325de86353e17b29c26257333f0fe016e (commit)
from 094d2aa6c73201892be2362d6d43fdeb34a2650f (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit ea0d42e325de86353e17b29c26257333f0fe016e
Author: Ocean Wang <wanghaidong at cnnic.cn>
Date: Wed Feb 23 17:36:58 2011 +0800
[trac493] Add negative cache to the the resolver cache
-----------------------------------------------------------------------
Summary of changes:
src/lib/cache/message_cache.cc | 5 +++--
src/lib/cache/message_cache.h | 11 +++++++++--
src/lib/cache/message_entry.cc | 4 +++-
src/lib/cache/message_entry.h | 9 +++++++--
src/lib/cache/resolver_cache.cc | 12 ++++++++++--
src/lib/cache/resolver_cache.h | 6 +++++-
src/lib/cache/tests/message_cache_unittest.cc | 12 ++++++++----
src/lib/cache/tests/message_entry_unittest.cc | 23 +++++++++++++----------
8 files changed, 58 insertions(+), 24 deletions(-)
-----------------------------------------------------------------------
diff --git a/src/lib/cache/message_cache.cc b/src/lib/cache/message_cache.cc
index 6582199..1b70519 100644
--- a/src/lib/cache/message_cache.cc
+++ b/src/lib/cache/message_cache.cc
@@ -30,9 +30,10 @@ namespace isc {
namespace cache {
MessageCache::MessageCache(boost::shared_ptr<RRsetCache> rrset_cache,
- uint32_t cache_size, uint16_t message_class):
+ uint32_t cache_size, uint16_t message_class, boost::shared_ptr<RRsetCache> negative_soa_cache):
message_class_(message_class),
rrset_cache_(rrset_cache),
+ negative_soa_cache_(negative_soa_cache),
message_table_(new NsasEntryCompare<MessageEntry>, cache_size),
message_lru_((3 * cache_size),
new HashDeleter<MessageEntry>(message_table_))
@@ -71,7 +72,7 @@ MessageCache::update(const Message& msg) {
message_lru_.remove(old_msg_entry);
}
- MessageEntryPtr msg_entry(new MessageEntry(msg, rrset_cache_));
+ MessageEntryPtr msg_entry(new MessageEntry(msg, rrset_cache_, negative_soa_cache_));
message_lru_.add(msg_entry);
return (message_table_.add(msg_entry, entry_key, true));
}
diff --git a/src/lib/cache/message_cache.h b/src/lib/cache/message_cache.h
index 0131b30..8d95366 100644
--- a/src/lib/cache/message_cache.h
+++ b/src/lib/cache/message_cache.h
@@ -39,9 +39,15 @@ private:
MessageCache(const MessageCache& source);
MessageCache& operator=(const MessageCache& source);
public:
+ /// \param rrset_cache The cache that stores the RRsets that the
+ /// message entry will points to
/// \param cache_size The size of message cache.
- MessageCache(boost::shared_ptr<RRsetCache> rrset_cache_,
- uint32_t cache_size, uint16_t message_class);
+ /// \param message_class The class of the message cache
+ /// \param negative_soa_cache The cache that stores the SOA record
+ /// that comes from negative response message
+ MessageCache(boost::shared_ptr<RRsetCache> rrset_cache,
+ uint32_t cache_size, uint16_t message_class,
+ boost::shared_ptr<RRsetCache> negative_soa_cache);
/// \brief Look up message in cache.
/// \param message generated response message if the message entry
@@ -82,6 +88,7 @@ protected:
protected:
uint16_t message_class_; // The class of the message cache.
boost::shared_ptr<RRsetCache> rrset_cache_;
+ boost::shared_ptr<RRsetCache> negative_soa_cache_;
isc::nsas::HashTable<MessageEntry> message_table_;
isc::nsas::LruList<MessageEntry> message_lru_;
};
diff --git a/src/lib/cache/message_entry.cc b/src/lib/cache/message_entry.cc
index 2fdb07c..78afff9 100644
--- a/src/lib/cache/message_entry.cc
+++ b/src/lib/cache/message_entry.cc
@@ -31,8 +31,10 @@ namespace cache {
static uint32_t MAX_UINT32 = numeric_limits<uint32_t>::max();
MessageEntry::MessageEntry(const isc::dns::Message& msg,
- boost::shared_ptr<RRsetCache> rrset_cache):
+ boost::shared_ptr<RRsetCache> rrset_cache,
+ boost::shared_ptr<RRsetCache> negative_soa_cache):
rrset_cache_(rrset_cache),
+ negative_soa_cache_(negative_soa_cache),
headerflag_aa_(false),
headerflag_tc_(false)
{
diff --git a/src/lib/cache/message_entry.h b/src/lib/cache/message_entry.h
index 20b2472..6c2fdda 100644
--- a/src/lib/cache/message_entry.h
+++ b/src/lib/cache/message_entry.h
@@ -68,8 +68,12 @@ public:
/// since some new rrset entries may be inserted into
/// rrset cache, or the existed rrset entries need
/// to be updated.
+ /// \param negative_soa_cache the pointer of RRsetCAche. This
+ /// cache is used only for storing SOA rrset from negative
+ /// response (NXDOMAIN or NOERROR_NODATA)
MessageEntry(const isc::dns::Message& message,
- boost::shared_ptr<RRsetCache> rrset_cache);
+ boost::shared_ptr<RRsetCache> rrset_cache,
+ boost::shared_ptr<RRsetCache> negative_soa_cache);
/// \brief generate one dns message according
/// the rrsets information of the message.
@@ -155,7 +159,8 @@ private:
HashKey* hash_key_ptr_; // the key for messag entry in hash table.
std::vector<RRsetRef> rrsets_;
- boost::shared_ptr<RRsetCache> rrset_cache_;
+ boost::shared_ptr<RRsetCache> rrset_cache_; //Normal rrset cache
+ boost::shared_ptr<RRsetCache> negative_soa_cache_; // SOA rrset from negative response
std::string query_name_; // query name of the message.
uint16_t query_class_; // query class of the message.
diff --git a/src/lib/cache/resolver_cache.cc b/src/lib/cache/resolver_cache.cc
index 7ebdb4f..028b4e6 100644
--- a/src/lib/cache/resolver_cache.cc
+++ b/src/lib/cache/resolver_cache.cc
@@ -34,9 +34,13 @@ ResolverClassCache::ResolverClassCache(const RRClass& cache_class) :
local_zone_data_ = LocalZoneDataPtr(new LocalZoneData(cache_class_.getCode()));
rrsets_cache_ = RRsetCachePtr(new RRsetCache(RRSET_CACHE_DEFAULT_SIZE,
cache_class_.getCode()));
+ // SOA rrset cache from negative response
+ negative_soa_cache_ = RRsetCachePtr(new
+ RRsetCache(NEGATIVE_RRSET_CACHE_DEFAULT_SIZE, cache_class_.getCode()));
+
messages_cache_ = MessageCachePtr(new MessageCache(rrsets_cache_,
MESSAGE_CACHE_DEFAULT_SIZE,
- cache_class_.getCode()));
+ cache_class_.getCode(), negative_soa_cache_));
}
ResolverClassCache::ResolverClassCache(CacheSizeInfo cache_info) :
@@ -47,9 +51,13 @@ ResolverClassCache::ResolverClassCache(CacheSizeInfo cache_info) :
local_zone_data_ = LocalZoneDataPtr(new LocalZoneData(klass));
rrsets_cache_ = RRsetCachePtr(new
RRsetCache(cache_info.rrset_cache_size, klass));
+ // SOA rrset cache from negative response
+ negative_soa_cache_ = RRsetCachePtr(new
+ RRsetCache(cache_info.rrset_cache_size, klass));
+
messages_cache_ = MessageCachePtr(new MessageCache(rrsets_cache_,
cache_info.message_cache_size,
- klass));
+ klass, negative_soa_cache_));
}
const RRClass&
diff --git a/src/lib/cache/resolver_cache.h b/src/lib/cache/resolver_cache.h
index 7a0fdab..b45da16 100644
--- a/src/lib/cache/resolver_cache.h
+++ b/src/lib/cache/resolver_cache.h
@@ -34,6 +34,7 @@ class RRsetCache;
//TODO a better proper default cache size
#define MESSAGE_CACHE_DEFAULT_SIZE 10000
#define RRSET_CACHE_DEFAULT_SIZE 20000
+#define NEGATIVE_RRSET_CACHE_DEFAULT_SIZE 10000
/// \brief Cache Size Information.
///
@@ -183,10 +184,13 @@ private:
/// Cache for rrsets in local zones, rrsets
/// in it never expire.
LocalZoneDataPtr local_zone_data_;
+ //@}
/// \brief cache the rrsets parsed from the received message.
RRsetCachePtr rrsets_cache_;
- //@}
+
+ /// \brief cache the SOA rrset parsed from the negative response message.
+ RRsetCachePtr negative_soa_cache_;
};
class ResolverCache {
diff --git a/src/lib/cache/tests/message_cache_unittest.cc b/src/lib/cache/tests/message_cache_unittest.cc
index f984312..15f29c3 100644
--- a/src/lib/cache/tests/message_cache_unittest.cc
+++ b/src/lib/cache/tests/message_cache_unittest.cc
@@ -34,9 +34,10 @@ namespace {
/// its internals.
class DerivedMessageCache: public MessageCache {
public:
- DerivedMessageCache(boost::shared_ptr<RRsetCache> rrset_cache_,
- uint32_t cache_size, uint16_t message_class):
- MessageCache(rrset_cache_, cache_size, message_class)
+ DerivedMessageCache(boost::shared_ptr<RRsetCache> rrset_cache,
+ uint32_t cache_size, uint16_t message_class,
+ boost::shared_ptr<RRsetCache> negative_soa_cache):
+ MessageCache(rrset_cache, cache_size, message_class, negative_soa_cache)
{}
uint16_t messages_count() {
@@ -51,13 +52,16 @@ public:
{
uint16_t class_ = RRClass::IN().getCode();
rrset_cache_.reset(new RRsetCache(RRSET_CACHE_DEFAULT_SIZE, class_));
+ negative_soa_cache_.reset(new RRsetCache(NEGATIVE_RRSET_CACHE_DEFAULT_SIZE, class_));
message_cache_.reset(new DerivedMessageCache(rrset_cache_,
- MESSAGE_CACHE_DEFAULT_SIZE, class_ ));
+ MESSAGE_CACHE_DEFAULT_SIZE, class_,
+ negative_soa_cache_));
}
protected:
boost::shared_ptr<DerivedMessageCache> message_cache_;
RRsetCachePtr rrset_cache_;
+ RRsetCachePtr negative_soa_cache_;
Message message_parse;
Message message_render;
};
diff --git a/src/lib/cache/tests/message_entry_unittest.cc b/src/lib/cache/tests/message_entry_unittest.cc
index f0fc777..4562406 100644
--- a/src/lib/cache/tests/message_entry_unittest.cc
+++ b/src/lib/cache/tests/message_entry_unittest.cc
@@ -39,8 +39,9 @@ namespace {
class DerivedMessageEntry: public MessageEntry {
public:
DerivedMessageEntry(const isc::dns::Message& message,
- boost::shared_ptr<RRsetCache> rrset_cache_):
- MessageEntry(message, rrset_cache_)
+ boost::shared_ptr<RRsetCache> rrset_cache_,
+ boost::shared_ptr<RRsetCache> negative_soa_cache_):
+ MessageEntry(message, rrset_cache_, negative_soa_cache_)
{}
/// \brief Wrap the protected function so that it can be tested.
@@ -77,18 +78,20 @@ public:
{
rrset_cache_.reset(new RRsetCache(RRSET_CACHE_DEFAULT_SIZE, class_));
+ negative_soa_cache_.reset(new RRsetCache(NEGATIVE_RRSET_CACHE_DEFAULT_SIZE, class_));
}
protected:
uint16_t class_;
RRsetCachePtr rrset_cache_;
+ RRsetCachePtr negative_soa_cache_;
Message message_parse;
Message message_render;
};
TEST_F(MessageEntryTest, testParseRRset) {
messageFromFile(message_parse, "message_fromWire3");
- DerivedMessageEntry message_entry(message_parse, rrset_cache_);
+ DerivedMessageEntry message_entry(message_parse, rrset_cache_, negative_soa_cache_);
uint32_t ttl = MAX_UINT32;
uint16_t rrset_count = 0;
message_entry.parseSectionForTest(message_parse, Message::SECTION_ANSWER, ttl, rrset_count);
@@ -108,7 +111,7 @@ TEST_F(MessageEntryTest, testParseRRset) {
TEST_F(MessageEntryTest, testGetRRsetTrustLevel_AA) {
messageFromFile(message_parse, "message_fromWire3");
- DerivedMessageEntry message_entry(message_parse, rrset_cache_);
+ DerivedMessageEntry message_entry(message_parse, rrset_cache_, negative_soa_cache_);
RRsetIterator rrset_iter = message_parse.beginSection(Message::SECTION_ANSWER);
@@ -132,7 +135,7 @@ TEST_F(MessageEntryTest, testGetRRsetTrustLevel_AA) {
TEST_F(MessageEntryTest, testGetRRsetTrustLevel_NONAA) {
messageFromFile(message_parse, "message_fromWire4");
- DerivedMessageEntry message_entry(message_parse, rrset_cache_);
+ DerivedMessageEntry message_entry(message_parse, rrset_cache_, negative_soa_cache_);
RRsetIterator rrset_iter = message_parse.beginSection(Message::SECTION_ANSWER);
RRsetTrustLevel level = message_entry.getRRsetTrustLevelForTest(message_parse,
*rrset_iter,
@@ -154,7 +157,7 @@ TEST_F(MessageEntryTest, testGetRRsetTrustLevel_NONAA) {
TEST_F(MessageEntryTest, testGetRRsetTrustLevel_CNAME) {
messageFromFile(message_parse, "message_fromWire5");
- DerivedMessageEntry message_entry(message_parse, rrset_cache_);
+ DerivedMessageEntry message_entry(message_parse, rrset_cache_, negative_soa_cache_);
RRsetIterator rrset_iter = message_parse.beginSection(Message::SECTION_ANSWER);
RRsetTrustLevel level = message_entry.getRRsetTrustLevelForTest(message_parse,
*rrset_iter,
@@ -170,7 +173,7 @@ TEST_F(MessageEntryTest, testGetRRsetTrustLevel_CNAME) {
TEST_F(MessageEntryTest, testGetRRsetTrustLevel_DNAME) {
messageFromFile(message_parse, "message_fromWire6");
- DerivedMessageEntry message_entry(message_parse, rrset_cache_);
+ DerivedMessageEntry message_entry(message_parse, rrset_cache_, negative_soa_cache_);
RRsetIterator rrset_iter = message_parse.beginSection(Message::SECTION_ANSWER);
RRsetTrustLevel level = message_entry.getRRsetTrustLevelForTest(message_parse,
*rrset_iter,
@@ -195,7 +198,7 @@ TEST_F(MessageEntryTest, testGetRRsetTrustLevel_DNAME) {
// is right
TEST_F(MessageEntryTest, testInitMessageEntry) {
messageFromFile(message_parse, "message_fromWire3");
- DerivedMessageEntry message_entry(message_parse, rrset_cache_);
+ DerivedMessageEntry message_entry(message_parse, rrset_cache_, negative_soa_cache_);
time_t expire_time = message_entry.getExpireTime();
// 1 second should be enough to do the compare
EXPECT_TRUE((time(NULL) + 10801) > expire_time);
@@ -203,7 +206,7 @@ TEST_F(MessageEntryTest, testInitMessageEntry) {
TEST_F(MessageEntryTest, testGetRRsetEntries) {
messageFromFile(message_parse, "message_fromWire3");
- DerivedMessageEntry message_entry(message_parse, rrset_cache_);
+ DerivedMessageEntry message_entry(message_parse, rrset_cache_, negative_soa_cache_);
vector<RRsetEntryPtr> vec;
// the time is bigger than the smallest expire time of
@@ -214,7 +217,7 @@ TEST_F(MessageEntryTest, testGetRRsetEntries) {
TEST_F(MessageEntryTest, testGenMessage) {
messageFromFile(message_parse, "message_fromWire3");
- DerivedMessageEntry message_entry(message_parse, rrset_cache_);
+ DerivedMessageEntry message_entry(message_parse, rrset_cache_, negative_soa_cache_);
time_t expire_time = message_entry.getExpireTime();
Message msg(Message::RENDER);
More information about the bind10-changes
mailing list