Browse Source

Add lru support for message cache.

git-svn-id: svn://bind10.isc.org/svn/bind10/branches/trac449@4159 e5f2f494-b856-4b98-b285-d166d9295462
Likun Zhang 14 years ago
parent
commit
77f677784e

+ 7 - 0
src/lib/cache/TODO

@@ -0,0 +1,7 @@
+* Implement the TODO item for getRRsetTrustLevel() in message_entry.cc
+    
+  "TODO, according RFC2181 section 5.4.1, only the record 
+   describing that ailas is necessarily authoritative."
+* Implement dump/load/resize interfaces of rrset/message/recursor cache.   
+* Once LRU hash table is implemented, it should be used by message/rrset cache.  
+

+ 13 - 5
src/lib/cache/message_cache.cc

@@ -39,13 +39,13 @@ MessageCache::MessageCache(boost::shared_ptr<RRsetCache> rrset_cache,
 bool
 MessageCache::lookup(const isc::dns::Name& qname,
                      const isc::dns::RRType& qtype,
-                     const uint16_t query_header,
                      isc::dns::Message& response)
 {
     HashKey entry_key = getEntryHashKey(qname, qtype);
     MessageEntryPtr msg_entry = message_table_.get(entry_key);
     if(msg_entry) {
-       return msg_entry->genMessage(time(NULL), query_header, response);
+        message_lru_.touch(msg_entry);
+        return msg_entry->genMessage(time(NULL), response);
     }
 
     return false;
@@ -53,13 +53,21 @@ MessageCache::lookup(const isc::dns::Name& qname,
 
 bool
 MessageCache::update(const Message& msg) {
-    // The simplest way to update is removing the old message entry directly.
     QuestionIterator iter = msg.beginQuestion();
     HashKey entry_key = getEntryHashKey((*iter)->getName(),
                                            (*iter)->getType());
-    message_table_.remove(entry_key);
+    
+    // The simplest way to update is removing the old message entry directly.
+    // We have find the existed message entry, since we need to delete it
+    // from lru list too.
+    MessageEntryPtr old_msg_entry = message_table_.get(entry_key);
+    if (old_msg_entry) {
+        message_table_.remove(entry_key);
+        message_lru_.remove(old_msg_entry);
+    }
+
     MessageEntryPtr msg_entry(new MessageEntry(msg, rrset_cache_));
-    //TODO, lru list touch
+    message_lru_.touch(msg_entry); // Touch the new message entry
     return message_table_.add(msg_entry, entry_key, true);
 }
 

+ 0 - 4
src/lib/cache/message_cache.h

@@ -43,16 +43,12 @@ public:
     /// \brief Look up message in cache.
     /// \param message generated response message if the message entry 
     ///        can be found.
-    /// \param query_header the uint16_t length header of the query message.
-    /// The message in the cache maybe need to be refactored when answering the
-    /// lookup according the query header(flags).
     ///
     /// \return return true if the message can be found in cache, or else,
     /// return false.
     //TODO Maybe some user just want to get the message_entry.
     bool lookup(const isc::dns::Name& qname,
                 const isc::dns::RRType& qtype,
-                const uint16_t query_header,
                 isc::dns::Message& message);
 
     /// \brief Update the message in the cache with the new one.

+ 1 - 2
src/lib/cache/message_entry.cc

@@ -40,10 +40,9 @@ MessageEntry::MessageEntry(const isc::dns::Message& msg,
     
 bool
 MessageEntry::genMessage(const time_t&,
-                         const uint16_t,
                          isc::dns::Message&)
 {
-    //TODO
+    //TODO, generate message according the query header flags.
     return true;
 }
 

+ 1 - 4
src/lib/cache/message_entry.h

@@ -35,8 +35,7 @@ class RRsetCache;
 /// \brief Message Entry
 /// The object of MessageEntry represents one response message
 /// answered to the recursor client. 
-class MessageEntry : public NsasEntry<MessageEntry>, 
-                     public Fetchable 
+class MessageEntry : public NsasEntry<MessageEntry>
 {
 public:
 
@@ -56,11 +55,9 @@ public:
     /// \param time_now set the ttl of each rrset in the message
     ///        as "expire_time - time_now" (expire_time is the 
     ///        expiration time of the rrset).
-    /// \param query_header the query message header.
     /// \return return true if the response message can be generated 
     /// from the cached information, or else, return false.
     bool genMessage(const time_t& time_now,
-                    const uint16_t query_header,
                     isc::dns::Message& response);
     
     /// \brief Get the hash key of the message entry.

+ 1 - 2
src/lib/cache/recursor_cache.cc

@@ -44,7 +44,6 @@ bool
 RecursorCache::lookup(const isc::dns::Name& qname, 
                const isc::dns::RRType& qtype,
                const isc::dns::RRClass& qclass,
-               const uint16_t query_header,
                isc::dns::Message& response) const
 {
     // First, query in rrsets_cache1_, if the rrset(qname, qtype, qclass) can be 
@@ -65,7 +64,7 @@ RecursorCache::lookup(const isc::dns::Name& qname,
         // Can't find the class-specific message cache, return false.
         return false;
     } else {
-        return iter->second->lookup(qname, qtype, query_header, response);
+        return iter->second->lookup(qname, qtype, response);
     }
 }
 

+ 0 - 2
src/lib/cache/recursor_cache.h

@@ -54,13 +54,11 @@ public:
     ///
     /// \param response generated response message if the message can be found 
     ///  in cache.
-    /// \param query_header the 16bit query header.
     ///
     /// \return return true if the message can be found, or else, return false.
     bool lookup(const isc::dns::Name& qname, 
                 const isc::dns::RRType& qtype,
                 const isc::dns::RRClass& qclass,
-                const uint16_t query_header,
                 isc::dns::Message& response) const;
 
     /// \brief Look up rrset in cache.