[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