BIND 10 trac661, updated. 002aa60f46e33079f4d9bc131115a127ea5a5130 [trac661] Changelog
BIND 10 source code commits
bind10-changes at lists.isc.org
Wed Mar 9 09:12:46 UTC 2011
The branch, trac661 has been updated
via 002aa60f46e33079f4d9bc131115a127ea5a5130 (commit)
via 3a6535a46295133690647d8fb75819abb5107bac (commit)
via 5b825a61a8f083aa879da6aedc6717d42534d5b4 (commit)
from 5ecd1322b677fa9808125986a65b28d619c79120 (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 002aa60f46e33079f4d9bc131115a127ea5a5130
Author: zhanglikun <zhanglikun at cnnic.cn>
Date: Wed Mar 9 17:12:22 2011 +0800
[trac661] Changelog
commit 3a6535a46295133690647d8fb75819abb5107bac
Author: zhanglikun <zhanglikun at cnnic.cn>
Date: Wed Mar 9 17:06:44 2011 +0800
[trac661] Remove expired message entries when looking up the message cache
commit 5b825a61a8f083aa879da6aedc6717d42534d5b4
Author: zhanglikun <zhanglikun at cnnic.cn>
Date: Tue Mar 8 20:36:10 2011 +0800
[trac661] Remove expired rrset entry when looking up
-----------------------------------------------------------------------
Summary of changes:
ChangeLog | 6 ++++
src/lib/cache/message_cache.cc | 12 ++++++-
src/lib/cache/message_entry.h | 6 ++++
src/lib/cache/rrset_cache.cc | 15 +++++++--
src/lib/cache/tests/message_cache_unittest.cc | 32 +++++++++++++-------
src/lib/cache/tests/rrset_cache_unittest.cc | 23 +++++++++-----
.../tests/testdata/message_fromWire9} | 13 ++++----
7 files changed, 76 insertions(+), 31 deletions(-)
copy src/lib/{dns/tests/testdata/message_fromWire1 => cache/tests/testdata/message_fromWire9} (58%)
-----------------------------------------------------------------------
diff --git a/ChangeLog b/ChangeLog
index 582bba0..540ea76 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+ 189. [bug] zhang likun
+ Remove expired message and rrset entries when looking up them
+ in cache, touch or remove the rrset entry in cache properly
+ when doing lookup or update.
+ (Trac #661 git )
+
188. [bug] zhang likun
Make the rrset trust level ranking algorithm used by
isc::cache::MessageEntry::getRRsetTrustLevel() follow RFC2181
diff --git a/src/lib/cache/message_cache.cc b/src/lib/cache/message_cache.cc
index f1334a2..53c73c1 100644
--- a/src/lib/cache/message_cache.cc
+++ b/src/lib/cache/message_cache.cc
@@ -46,8 +46,16 @@ MessageCache::lookup(const isc::dns::Name& qname,
HashKey entry_key = HashKey(entry_name, RRClass(message_class_));
MessageEntryPtr msg_entry = message_table_.get(entry_key);
if(msg_entry) {
- message_lru_.touch(msg_entry);
- return (msg_entry->genMessage(time(NULL), response));
+ // Check whether the message entry has expired.
+ if (msg_entry->getExpireTime() > time(NULL)) {
+ message_lru_.touch(msg_entry);
+ return (msg_entry->genMessage(time(NULL), response));
+ } else {
+ // message entry expires, remove it from hash table and lru list.
+ message_table_.remove(entry_key);
+ message_lru_.remove(msg_entry);
+ return (false);
+ }
}
return (false);
diff --git a/src/lib/cache/message_entry.h b/src/lib/cache/message_entry.h
index 682c171..67b0cf3 100644
--- a/src/lib/cache/message_entry.h
+++ b/src/lib/cache/message_entry.h
@@ -87,6 +87,12 @@ public:
return (*hash_key_ptr_);
}
+ /// \brief Get expire time of the message entry.
+ /// \return return the expire time of message entry.
+ time_t getExpireTime() const {
+ return (expire_time_);
+ }
+
/// \short Protected memebers, so they can be accessed by tests.
//@{
protected:
diff --git a/src/lib/cache/rrset_cache.cc b/src/lib/cache/rrset_cache.cc
index b5548b4..f538320 100644
--- a/src/lib/cache/rrset_cache.cc
+++ b/src/lib/cache/rrset_cache.cc
@@ -42,10 +42,17 @@ RRsetCache::lookup(const isc::dns::Name& qname,
{
const string entry_name = genCacheEntryName(qname, qtype);
RRsetEntryPtr entry_ptr = rrset_table_.get(HashKey(entry_name, RRClass(class_)));
- if (entry_ptr && entry_ptr->getExpireTime() > time(NULL)) {
- // Only touch the non-expired rrset entries
- rrset_lru_.touch(entry_ptr);
- return (entry_ptr);
+ if (entry_ptr) {
+ if (entry_ptr->getExpireTime() > time(NULL)) {
+ // Only touch the non-expired rrset entries
+ rrset_lru_.touch(entry_ptr);
+ return (entry_ptr);
+ } else {
+ // the rrset entry has expired, so just remove it from
+ // hash table and lru list.
+ rrset_table_.remove(entry_ptr->hashKey());
+ rrset_lru_.remove(entry_ptr);
+ }
}
return (RRsetEntryPtr());
diff --git a/src/lib/cache/tests/message_cache_unittest.cc b/src/lib/cache/tests/message_cache_unittest.cc
index 3a4da78..187216e 100644
--- a/src/lib/cache/tests/message_cache_unittest.cc
+++ b/src/lib/cache/tests/message_cache_unittest.cc
@@ -81,9 +81,19 @@ protected:
Message message_render;
};
+void
+updateMessageCache(const char* message_file,
+ boost::shared_ptr<DerivedMessageCache> cache)
+{
+ Message msg(Message::PARSE);
+ messageFromFile(msg, message_file);
+ cache->update(msg);
+}
+
TEST_F(MessageCacheTest, testLookup) {
messageFromFile(message_parse, "message_fromWire1");
EXPECT_TRUE(message_cache_->update(message_parse));
+
Name qname("test.example.com.");
EXPECT_TRUE(message_cache_->lookup(qname, RRType::A(), message_render));
EXPECT_EQ(message_cache_->messages_count(), 1);
@@ -96,10 +106,19 @@ TEST_F(MessageCacheTest, testLookup) {
Name qname1("test.example.net.");
EXPECT_TRUE(message_cache_->lookup(qname1, RRType::A(), message_render));
- // Test looking up message which has expired rrsets.
- // Remove one
+ // Test looking up message which has expired rrset or some rrset
+ // has been removed from the rrset cache.
rrset_cache_->removeRRsetEntry(qname1, RRType::A());
EXPECT_FALSE(message_cache_->lookup(qname1, RRType::A(), message_render));
+
+ // Update one message entry which has expired to message cache.
+ updateMessageCache("message_fromWire9", message_cache_);
+ EXPECT_EQ(message_cache_->messages_count(), 3);
+ // The message entry has been added, but can't be looked up, since
+ // it has expired and is removed automatically when being looked up.
+ Name qname_org("test.example.org.");
+ EXPECT_FALSE(message_cache_->lookup(qname_org, RRType::A(), message_render));
+ EXPECT_EQ(message_cache_->messages_count(), 2);
}
TEST_F(MessageCacheTest, testUpdate) {
@@ -118,15 +137,6 @@ TEST_F(MessageCacheTest, testUpdate) {
EXPECT_TRUE(new_msg_render.getHeaderFlag(Message::HEADERFLAG_AA));
}
-void
-updateMessageCache(const char* message_file,
- boost::shared_ptr<DerivedMessageCache> cache)
-{
- Message msg(Message::PARSE);
- messageFromFile(msg, message_file);
- cache->update(msg);
-}
-
TEST_F(MessageCacheTest, testCacheLruBehavior) {
// qname = "test.example.com.", qtype = A
updateMessageCache("message_fromWire1", message_cache_);
diff --git a/src/lib/cache/tests/rrset_cache_unittest.cc b/src/lib/cache/tests/rrset_cache_unittest.cc
index fb15214..90b24df 100644
--- a/src/lib/cache/tests/rrset_cache_unittest.cc
+++ b/src/lib/cache/tests/rrset_cache_unittest.cc
@@ -51,6 +51,15 @@ protected:
RRsetEntry rrset_entry2_;
};
+void
+updateRRsetCache(RRsetCache& cache, Name& rrset_name,
+ uint32_t ttl = 20,
+ RRsetTrustLevel level = RRSET_TRUST_ADDITIONAL_AA)
+{
+ RRset rrset(rrset_name, RRClass::IN(), RRType::A(), RRTTL(ttl));
+ cache.update(rrset, level);
+}
+
TEST_F(RRsetCacheTest, lookup) {
const RRType& type = RRType::A();
EXPECT_TRUE(cache_.lookup(name_, type) == NULL);
@@ -61,6 +70,12 @@ TEST_F(RRsetCacheTest, lookup) {
EXPECT_EQ(rrset_entry_ptr->getRRset()->getName(), rrset_entry1_.getRRset()->getName());
EXPECT_EQ(rrset_entry_ptr->getRRset()->getType(), rrset_entry1_.getRRset()->getType());
EXPECT_EQ(rrset_entry_ptr->getRRset()->getClass(), rrset_entry1_.getRRset()->getClass());
+
+ // Check whether the expired rrset entry will be removed automatically
+ // when looking up.
+ Name name_test("test.example.com.");
+ updateRRsetCache(cache_, name_test, 0);
+ EXPECT_FALSE(cache_.lookup(name_test, RRType::A()));
}
TEST_F(RRsetCacheTest, update) {
@@ -80,14 +95,6 @@ TEST_F(RRsetCacheTest, update) {
EXPECT_EQ(rrset_entry_ptr->getTrustLevel(), rrset_entry2_.getTrustLevel());
}
-void
-updateRRsetCache(RRsetCache& cache, Name& rrset_name,
- RRsetTrustLevel level=RRSET_TRUST_ADDITIONAL_AA)
-{
- RRset rrset(rrset_name, RRClass::IN(), RRType::A(), RRTTL(20));
- cache.update(rrset, level);
-}
-
// Test whether the lru list in rrset cache works as expected.
TEST_F(RRsetCacheTest, cacheLruBehavior) {
Name name1("1.example.com.");
diff --git a/src/lib/cache/tests/testdata/message_fromWire9 b/src/lib/cache/tests/testdata/message_fromWire9
new file mode 100644
index 0000000..d155e8c
--- /dev/null
+++ b/src/lib/cache/tests/testdata/message_fromWire9
@@ -0,0 +1,23 @@
+#
+#
+# A simple DNS response message
+# ID = 0x1035
+# QR=1 (response), Opcode=0, AA=1, RD=1 (other fields are 0)
+# QDCOUNT=1, ANCOUNT=2, other COUNTS=0
+# Question: test.example.org. IN A
+# Answer:
+# test.example.org. 3600 IN A 192.0.2.1
+# test.example.org. 7200 IN A 192.0.2.2
+#
+1035 8500
+0001 0002 0000 0000
+#(4) t e s t (7) e x a m p l e (3) o r g .
+ 04 74 65 73 74 07 65 78 61 6d 70 6c 65 03 6f 72 67 00
+0001 0001
+# same name, fully compressed
+c0 0c
+# TTL=3600, A, IN, RDLENGTH=4, RDATA
+0001 0001 00000000 0004 c0 00 02 01
+# mostly same, with the slight difference in RDATA and TTL
+c0 0c
+0001 0001 00001c20 0004 c0 00 02 02
More information about the bind10-changes
mailing list