[svn] commit: r2005 - in /experiments/jinmei-onmemdb/src: bin/auth/ bin/auth/tests/ lib/dns/

BIND 10 source code commits bind10-changes at lists.isc.org
Mon May 31 07:57:40 UTC 2010


Author: jinmei
Date: Mon May 31 07:57:39 2010
New Revision: 2005

Log:
further optimization: avoid new/delete for question

Added:
    experiments/jinmei-onmemdb/src/bin/auth/normalquestion.cc
    experiments/jinmei-onmemdb/src/bin/auth/normalquestion.h
    experiments/jinmei-onmemdb/src/bin/auth/tests/normalquestion_unittest.cc
Modified:
    experiments/jinmei-onmemdb/src/bin/auth/Makefile.am
    experiments/jinmei-onmemdb/src/bin/auth/auth_srv.cc
    experiments/jinmei-onmemdb/src/bin/auth/rbt_datasrc.cc
    experiments/jinmei-onmemdb/src/bin/auth/rbt_datasrc.h
    experiments/jinmei-onmemdb/src/bin/auth/tests/Makefile.am
    experiments/jinmei-onmemdb/src/lib/dns/question.h

Modified: experiments/jinmei-onmemdb/src/bin/auth/Makefile.am
==============================================================================
--- experiments/jinmei-onmemdb/src/bin/auth/Makefile.am (original)
+++ experiments/jinmei-onmemdb/src/bin/auth/Makefile.am Mon May 31 07:57:39 2010
@@ -35,6 +35,7 @@
 b10_auth_SOURCES += offsetptr.h
 b10_auth_SOURCES += rbt_datasrc.h rbt_datasrc.cc
 b10_auth_SOURCES += loadzone.h loadzone.cc
+b10_auth_SOURCES += normalquestion.h normalquestion.cc
 
 b10_auth_LDADD =  $(top_builddir)/src/lib/datasrc/.libs/libdatasrc.a
 b10_auth_LDADD += $(top_builddir)/src/lib/dns/.libs/libdns.a

Modified: experiments/jinmei-onmemdb/src/bin/auth/auth_srv.cc
==============================================================================
--- experiments/jinmei-onmemdb/src/bin/auth/auth_srv.cc (original)
+++ experiments/jinmei-onmemdb/src/bin/auth/auth_srv.cc Mon May 31 07:57:39 2010
@@ -43,6 +43,7 @@
 #include "common.h"
 #include "auth_srv.h"
 #include "loadzone.h"
+#include "normalquestion.h"
 #include "rbt_datasrc.h"
 
 #include <boost/shared_ptr.hpp>
@@ -58,6 +59,7 @@
 using namespace isc::config;
 
 typedef boost::shared_ptr<RbtRRset> RbtRRsetPtr; 
+typedef boost::shared_ptr<NormalQuestion> NormalQuestionPtr; 
 
 class AuthSrvImpl {
 private:
@@ -79,7 +81,8 @@
     void processNormalQuery(InputBuffer& request_buffer, Message& message,
                             MessageRenderer& response_renderer,
                             const bool udp_buffer);
-    void lookupAndMakeResponse(Message& message);
+    void lookupAndMakeResponse(Message& message,
+                               const NormalQuestion& question);
     void addAdditional(Message& message, RbtRRsetPtr rrset,
                        const RRType& rrtype);
 
@@ -96,9 +99,10 @@
     bool verbose_mode_;
 
     const RbtDataSrc* mem_datasrc_;
-    static const unsigned int MAXRRS_IN_MESSAGE = 256; // XXX
+    static const unsigned int MAXRRS_IN_MESSAGE = 256; // XXX: hardode limit
     RbtRRsetPtr rrsets_[MAXRRS_IN_MESSAGE];
     unsigned int rrset_counter_;
+    NormalQuestionPtr normal_question_;
 
     /// Currently non-configurable, but will be.
     static const uint16_t DEFAULT_LOCAL_UDPSIZE = 4096;
@@ -136,6 +140,8 @@
             rrsets_[i] = RbtRRsetPtr(new RbtRRset);
         }
     }
+
+    normal_question_ = NormalQuestionPtr(new NormalQuestion);
 }
 
 void
@@ -173,17 +179,19 @@
 }
 
 inline void
-AuthSrvImpl::lookupAndMakeResponse(Message& message) {
-    QuestionPtr question = *message.beginQuestion();
+AuthSrvImpl::lookupAndMakeResponse(Message& message,
+                                   const NormalQuestion& question)
+{
+    LabelSequence sequence;
+    question.setLabelSequenceToQName(sequence);
     RbtNode node;
-    RbtDataSrcResult result =
-        mem_datasrc_->findNode(question->getName(), &node);
+    RbtDataSrcResult result = mem_datasrc_->findNode(sequence, &node);
     RbtRRsetPtr rrset;
 
     switch (result) {
     case RbtDataSrcSuccess:
         rrset = getRbtRRset();
-        result = node.findRRset(question->getType(), *rrset);
+        result = node.findRRset(question.getType(), *rrset);
         if (result == RbtDataSrcSuccess) {
             message.addRRset(Section::ANSWER(), rrset);
 
@@ -319,19 +327,24 @@
                                 const bool udp_buffer)
 {
     try {
-        message.fromWire(request_buffer);
+        // Optimization: since we know this is a normal query, we can use
+        // the NormalQuestion class to avoid all the overhead of the generic
+        // parse.
+        normal_question_->clear();
+        normal_question_->fromWire(request_buffer);
 
         const bool dnssec_ok = message.isDNSSECSupported();
         const uint16_t remote_bufsize = message.getUDPSize();
 
         message.makeResponse();
+        message.addQuestion(normal_question_);
         message.setHeaderFlag(MessageFlag::AA());
         message.setRcode(Rcode::NOERROR());
         message.setDNSSECSupported(dnssec_ok);
         message.setUDPSize(AuthSrvImpl::DEFAULT_LOCAL_UDPSIZE);
 
         clearRbtRRsets();
-        lookupAndMakeResponse(message);
+        lookupAndMakeResponse(message, *normal_question_);
         CompressOffsetTable* offset_table = // XXX bad cast
             reinterpret_cast<CompressOffsetTable*>(response_renderer.getArg());
         if (offset_table != NULL) {

Modified: experiments/jinmei-onmemdb/src/bin/auth/rbt_datasrc.cc
==============================================================================
--- experiments/jinmei-onmemdb/src/bin/auth/rbt_datasrc.cc (original)
+++ experiments/jinmei-onmemdb/src/bin/auth/rbt_datasrc.cc Mon May 31 07:57:39 2010
@@ -112,7 +112,8 @@
 
     RbtDataSrcResult addNode(const Name& name, RbtNodeImpl** nodep);
     RbtNodeImplPtr createNode(const LabelSequence& sequence);
-    RbtDataSrcResult findNode(const Name& name, RbtNodeImpl** nodep) const;
+    RbtDataSrcResult findNode(const LabelSequence& sequence,
+                              RbtNodeImpl** nodep) const;
     void addOnLevel(RbtNodeImplPtr& node, RbtNodeImpl* current, int order,
                     RbtNodeImplPtr* root);
     void rotateLeft(RbtNodeImpl* node, RbtNodeImplPtr* rootp);
@@ -300,7 +301,9 @@
                reinterpret_cast<const void*>(headptr + sizeof(dbsize)),
                sizeof(impl_->root_));
         impl_->apexnode_ = NULL;
-        RbtDataSrcResult result = impl_->findNode(origin, &impl_->apexnode_);
+        LabelSequence sequence;
+        origin.setLabelSequence(sequence);
+        RbtDataSrcResult result = impl_->findNode(sequence, &impl_->apexnode_);
         if (result != RbtDataSrcSuccess) {
             munmap(impl_->base_, impl_->dbsize_);
             isc_throw(Exception, "Unexpected result for apexnode: " << result);
@@ -549,13 +552,20 @@
 }
 
 RbtDataSrcResult
-RbtDataSrc::findNode(const Name& name, RbtNode* node) const {
+RbtDataSrc::findNode(const LabelSequence& sequence, RbtNode* node) const {
     RbtNodeImpl* implnode = NULL;
-    RbtDataSrcResult result = impl_->findNode(name, &implnode);
+    RbtDataSrcResult result = impl_->findNode(sequence, &implnode);
     if (result == RbtDataSrcSuccess || result == RbtDataSrcPartialMatch) {
         node->set(implnode, impl_->base_);
     }
     return (result);
+}
+
+RbtDataSrcResult
+RbtDataSrc::findNode(const Name& name, RbtNode* node) const {
+    LabelSequence sequence;
+    name.setLabelSequence(sequence);
+    return (findNode(sequence, node));
 }
 
 void
@@ -824,7 +834,7 @@
 }
 
 RbtDataSrcResult
-RbtDBImpl::findNode(const Name& name, RbtNodeImpl** nodep) const {
+RbtDBImpl::findNode(const LabelSequence& sequence, RbtNodeImpl** nodep) const {
     const bool empty_ok = true; // should eventually be configurable.
     const bool noexact = false; // ditto.
     const bool no_predecessor = false; // ditto
@@ -841,8 +851,7 @@
 
     // search_sequence is a dname label sequence being sought in each tree
     // level.
-    LabelSequence search_sequence;
-    name.setLabelSequence(search_sequence);
+    LabelSequence search_sequence = sequence;
 
     RbtNodeImpl* current = root_.getPtr(base_);
     RbtNodeImpl* last_compared = NULL;

Modified: experiments/jinmei-onmemdb/src/bin/auth/rbt_datasrc.h
==============================================================================
--- experiments/jinmei-onmemdb/src/bin/auth/rbt_datasrc.h (original)
+++ experiments/jinmei-onmemdb/src/bin/auth/rbt_datasrc.h Mon May 31 07:57:39 2010
@@ -66,6 +66,8 @@
     RbtDataSrcResult addNode(const isc::dns::Name& name, RbtNode* node);
     void addRRset(const isc::dns::AbstractRRset& rrset); // an ad hoc interface
     RbtDataSrcResult findNode(const isc::dns::Name& name, RbtNode* node) const;
+    RbtDataSrcResult findNode(const isc::dns::LabelSequence& sequence,
+                              RbtNode* node) const;
     RbtDataSrcResult getApexNode(RbtNode* node) const;
     std::string toText() const;
     std::string nodeToText(const RbtNode& node) const;

Modified: experiments/jinmei-onmemdb/src/bin/auth/tests/Makefile.am
==============================================================================
--- experiments/jinmei-onmemdb/src/bin/auth/tests/Makefile.am (original)
+++ experiments/jinmei-onmemdb/src/bin/auth/tests/Makefile.am Mon May 31 07:57:39 2010
@@ -15,7 +15,9 @@
 
 run_unittests_SOURCES += ../rbt_datasrc.h ../rbt_datasrc.cc
 run_unittests_SOURCES += ../loadzone.h ../loadzone.cc
+run_unittests_SOURCES += ../normalquestion.h ../normalquestion.cc
 run_unittests_SOURCES += rbt_datasrc_unittest.cc
+run_unittests_SOURCES += normalquestion_unittest.cc
 
 run_unittests_CPPFLAGS = $(AM_CPPFLAGS) $(GTEST_INCLUDES)
 run_unittests_LDFLAGS = $(AM_LDFLAGS) $(GTEST_LDFLAGS)

Modified: experiments/jinmei-onmemdb/src/lib/dns/question.h
==============================================================================
--- experiments/jinmei-onmemdb/src/lib/dns/question.h (original)
+++ experiments/jinmei-onmemdb/src/lib/dns/question.h Mon May 31 07:57:39 2010
@@ -31,13 +31,27 @@
 
 class InputBuffer;
 class MessageRenderer;
+class AbstractQuestion;
 class Question;
 
 /// \brief A pointer-like type pointing to an \c Question object.
-typedef boost::shared_ptr<Question> QuestionPtr;
+typedef boost::shared_ptr<AbstractQuestion> QuestionPtr;
 
 /// \brief A pointer-like type pointing to an (immutable) \c Question object.
 typedef boost::shared_ptr<const Question> ConstQuestionPtr;
+
+class AbstractQuestion {
+protected:
+    AbstractQuestion() {}
+public:
+    virtual ~AbstractQuestion() {}
+    virtual const Name& getName() const = 0;
+    virtual const RRType& getType() const = 0;
+    virtual const RRClass& getClass() const = 0;
+    virtual std::string toText() const = 0;
+    virtual unsigned int toWire(MessageRenderer& renderer) const = 0;
+    virtual unsigned int toWire(OutputBuffer& buffer) const = 0;
+};
 
 /// \brief The \c Question class encapsulates the common search key of DNS
 /// lookup, consisting of owner name, RR type and RR class.
@@ -98,7 +112,7 @@
 /// \c AbstractRRset such as \c %getName() or \c %toWire().
 /// So the user class may use a template function that is applicable to both
 /// \c Question and \c RRset to avoid writing duplicate code logic.
-class Question {
+class Question : public AbstractQuestion {
     ///
     /// \name Constructors and Destructor
     ///
@@ -146,7 +160,7 @@
     ///
     /// \return A reference to a \c Name class object corresponding to the
     /// \c Question owner name.
-    const Name& getName() const { return (name_); }
+    virtual const Name& getName() const { return (name_); }
 
     /// \brief Returns the RR Class of the \c Question.
     ///
@@ -162,7 +176,7 @@
     ///
     /// \return A reference to a \c RRType class object corresponding to the
     /// RR type of the \c Question.
-    const RRClass& getClass() const { return (rrclass_); }
+    virtual const RRClass& getClass() const { return (rrclass_); }
     //@}
 
     ///
@@ -182,7 +196,7 @@
     /// exception will be thrown.
     ///
     /// \return A string representation of the \c Question.
-    std::string toText() const;
+    virtual std::string toText() const;
 
     /// \brief Render the Question in the wire format with name compression.
     ///
@@ -216,7 +230,7 @@
     /// \param renderer DNS message rendering context that encapsulates the
     /// output buffer and name compression information.
     /// \return 1
-    unsigned int toWire(MessageRenderer& renderer) const;
+    virtual unsigned int toWire(MessageRenderer& renderer) const;
 
     /// \brief Render the Question in the wire format without name compression.
     ///
@@ -226,7 +240,7 @@
     ///
     /// \param buffer An output buffer to store the wire data.
     /// \return 1
-    unsigned int toWire(OutputBuffer& buffer) const;
+    virtual unsigned int toWire(OutputBuffer& buffer) const;
     //@}
 
 private:




More information about the bind10-changes mailing list