[svn] commit: r1979 - in /experiments/jinmei-onmemdb/src/bin/auth: auth_srv.cc main.cc rbt_datasrc.cc rbt_datasrc.h tests/rbt_datasrc_unittest.cc tests/testdata/rr_ns_toWire tests/testdata/rr_soa_toWire
BIND 10 source code commits
bind10-changes at lists.isc.org
Sat May 29 07:02:14 UTC 2010
Author: jinmei
Date: Sat May 29 07:02:14 2010
New Revision: 1979
Log:
more complete support for larger zones
Modified:
experiments/jinmei-onmemdb/src/bin/auth/auth_srv.cc
experiments/jinmei-onmemdb/src/bin/auth/main.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/rbt_datasrc_unittest.cc
experiments/jinmei-onmemdb/src/bin/auth/tests/testdata/rr_ns_toWire
experiments/jinmei-onmemdb/src/bin/auth/tests/testdata/rr_soa_toWire
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 Sat May 29 07:02:14 2010
@@ -382,10 +382,11 @@
if (impl_->mem_datasrc_ != NULL) {
try {
impl_->processRootQuery(message);
- CompressOffset* offsets = // XXX bad cast
- reinterpret_cast<CompressOffset*>(response_renderer.getArg());
- if (offsets != NULL) {
- memset(offsets, 0xff, sizeof(*offsets));
+ CompressOffsetTable* offset_table = // XXX bad cast
+ reinterpret_cast<CompressOffsetTable*>(
+ response_renderer.getArg());
+ if (offset_table != NULL) {
+ offset_table->clear();
}
} catch (const Exception& ex) {
if (impl_->verbose_mode_) {
Modified: experiments/jinmei-onmemdb/src/bin/auth/main.cc
==============================================================================
--- experiments/jinmei-onmemdb/src/bin/auth/main.cc (original)
+++ experiments/jinmei-onmemdb/src/bin/auth/main.cc Sat May 29 07:02:14 2010
@@ -155,7 +155,7 @@
socket_(io_service),
response_buffer_(0),
responselen_buffer_(TCP_MESSAGE_LENGTHSIZE),
- response_renderer_(response_buffer_, &offsets_),
+ response_renderer_(response_buffer_, &offset_table_),
dns_message_(Message::PARSE)
{}
@@ -246,7 +246,7 @@
enum { MAX_LENGTH = 65535 };
static const size_t TCP_MESSAGE_LENGTHSIZE = 2;
char data_[MAX_LENGTH];
- struct CompressOffset offsets_;
+ CompressOffsetTable offset_table_;
};
class TCPServer {
@@ -300,7 +300,7 @@
io_service_(io_service),
socket_(io_service, af == AF_INET6 ? udp::v6() : udp::v4()),
response_buffer_(0),
- response_renderer_(response_buffer_, &offsets_),
+ response_renderer_(response_buffer_, &offset_table_),
dns_message_(Message::PARSE)
{
// Set v6-only (we use a different instantiation for v4,
@@ -365,7 +365,7 @@
udp::endpoint sender_endpoint_;
enum { MAX_LENGTH = 4096 };
char data_[MAX_LENGTH];
- struct CompressOffset offsets_;
+ CompressOffsetTable offset_table_;
};
struct ServerSet {
@@ -658,9 +658,9 @@
int ss = srv->configSession()->getSocket();
Message dns_message(Message::PARSE);
- struct CompressOffset offsets;
+ CompressOffsetTable offset_table;
OutputBuffer resonse_buffer(0);
- MessageRenderer response_renderer(resonse_buffer, &offsets);
+ MessageRenderer response_renderer(resonse_buffer, &offset_table);
++nfds;
running = true;
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 Sat May 29 07:02:14 2010
@@ -1117,27 +1117,27 @@
renderName(MessageRenderer& renderer, const RbtNodeImpl* node,
const void* base)
{
- CompressOffset* offsets =
- reinterpret_cast<CompressOffset*>(renderer.getArg());
- if (offsets == NULL) {
+ CompressOffsetTable* offset_table =
+ reinterpret_cast<CompressOffsetTable*>(renderer.getArg());
+ if (offset_table == NULL) {
// this is slow.
renderer.writeName(node->getFullNodeName(base));
return;
}
- uint16_t offset = 0xffff;
- assert(node->getIndex() < CompressOffset::MAXNODES); // XXX
+ uint16_t offset = CompressOffsetTable::OFFSET_NOTFOUND;
while (!node->isAbsolute() &&
- (offset = offsets->offsets[node->getIndex()]) == 0xffff) {
- offsets->offsets[node->getIndex()] = renderer.getLength();
+ (offset = offset_table->find(node->getIndex())) ==
+ CompressOffsetTable::OFFSET_NOTFOUND) {
+ offset_table->insert(node->getIndex(), renderer.getLength());
renderer.writeData(node->getNameData(base) + 1, node->getNameLen());
node = node->findUp(base);
}
if (node->isAbsolute()) {
- offsets->offsets[node->getIndex()] = renderer.getLength();
+ offset_table->insert(node->getIndex(), renderer.getLength());
renderer.writeData(node->getNameData(base) + 1, node->getNameLen());
} else {
- if (offset == 0xffff || offset < 12) {
+ if (offset >= Name::COMPRESS_POINTER_MARK16) {
isc_throw(Exception, "invalid offset found in renderName: "
<< offset << " node index: " << node->getIndex()
<< " name: " << node->nodeNameToText(base));
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 Sat May 29 07:02:14 2010
@@ -19,7 +19,10 @@
#ifndef __RBT_DATASRC_H
#define __RBT_DATASRC_H 1
+#include <algorithm>
+#include <functional>
#include <string>
+#include <vector>
#include <dns/rrset.h>
@@ -128,9 +131,72 @@
};
struct CompressOffset {
- //static const size_t MAXNODES = 9182;
- static const size_t MAXNODES = 4096;
- uint16_t offsets[MAXNODES];
+ CompressOffset(const unsigned long i, const uint16_t o) :
+ index(i), offset(o) {}
+ unsigned long index;
+ uint16_t offset;
+};
+
+typedef std::vector<CompressOffset> CompressOffsets;
+
+struct MatchIndex : public std::unary_function<unsigned long, bool> {
+ MatchIndex(const unsigned long key_index) : key_index_(key_index) {}
+ bool operator()(const CompressOffset& entry) const {
+ return (entry.index == key_index_);
+ }
+ const unsigned long key_index_;
+};
+
+class CompressOffsetTable {
+private:
+ static const size_t HASH_SIZE = 1024;
+ static const size_t BUCKET_MIN_SIZE = 4;
+public:
+ static const uint16_t OFFSET_NOTFOUND = 0xffff;
+ CompressOffsetTable() {
+ for (int i = 0; i < HASH_SIZE; ++i) {
+ buckets_[i].reserve(BUCKET_MIN_SIZE);
+ used_buckets_[i] = 0; // value doesn't matter
+ }
+ nused_buckets_ = 0;
+ }
+ ~CompressOffsetTable() {
+ for (int i = 0; i < HASH_SIZE; ++i) {
+ buckets_[i].clear();
+ }
+ }
+ uint16_t find(const unsigned long index) const {
+ size_t hash = index % HASH_SIZE;
+ CompressOffsets::const_iterator found =
+ find_if(buckets_[hash].begin(), buckets_[hash].end(),
+ MatchIndex(index));
+ if (found != buckets_[hash].end()) {
+ return ((*found).offset);
+ }
+ return (OFFSET_NOTFOUND);
+ }
+ void insert(const unsigned long index, const uint16_t offset) {
+ size_t hash = index % HASH_SIZE;
+ bool was_empty = false;
+ if (buckets_[hash].empty()) {
+ was_empty = true;
+ }
+ buckets_[hash].push_back(CompressOffset(index, offset));
+ if (was_empty) {
+ assert(nused_buckets_ < HASH_SIZE);
+ used_buckets_[nused_buckets_++] = hash;
+ }
+ }
+ void clear() {
+ for (int i = 0; i < nused_buckets_; ++i) {
+ buckets_[used_buckets_[i]].clear();
+ }
+ nused_buckets_ = 0;
+ }
+private:
+ CompressOffsets buckets_[HASH_SIZE];
+ int used_buckets_[HASH_SIZE];
+ int nused_buckets_;
};
#endif // __RBT_DATASRC_H
Modified: experiments/jinmei-onmemdb/src/bin/auth/tests/rbt_datasrc_unittest.cc
==============================================================================
--- experiments/jinmei-onmemdb/src/bin/auth/tests/rbt_datasrc_unittest.cc (original)
+++ experiments/jinmei-onmemdb/src/bin/auth/tests/rbt_datasrc_unittest.cc Sat May 29 07:02:14 2010
@@ -38,7 +38,7 @@
class RBTDataSrcTest : public ::testing::Test {
protected:
RBTDataSrcTest() : datasrc(Name::ROOT_NAME()), buffer(0),
- renderer(buffer, &compress_offsets)
+ renderer(buffer, &offset_table)
{
datasrc.addNode(Name("a"), &rbtnode);
datasrc.addNode(Name("b"), &rbtnode);
@@ -55,7 +55,7 @@
MessageRenderer renderer;
vector<unsigned char> data;
RbtNode rbtnode;
- CompressOffset compress_offsets;
+ CompressOffsetTable offset_table;
};
TEST_F(RBTDataSrcTest, addNames) {
@@ -134,7 +134,10 @@
&rbtnode));
EXPECT_EQ(RbtDataSrcSuccess, rbtnode.findRRset(RRType::NS(), rbtrrset));
renderer.clear();
- memset(&compress_offsets, 0xff, sizeof(compress_offsets));
+
+ offset_table.clear();
+ const char dummy_header[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
+ renderer.writeData(dummy_header, sizeof(dummy_header));
rbtrrset.toWire(renderer);
data.clear();
UnitTestUtil::readWireData("rr_ns_toWire", data);
@@ -158,7 +161,7 @@
&rbtnode));
EXPECT_EQ(RbtDataSrcSuccess, rbtnode.findRRset(RRType::SOA(), rbtrrset));
renderer.clear();
- memset(&compress_offsets, 0xff, sizeof(compress_offsets));
+ offset_table.clear();
rbtrrset.toWire(renderer);
data.clear();
Modified: experiments/jinmei-onmemdb/src/bin/auth/tests/testdata/rr_ns_toWire
==============================================================================
--- experiments/jinmei-onmemdb/src/bin/auth/tests/testdata/rr_ns_toWire (original)
+++ experiments/jinmei-onmemdb/src/bin/auth/tests/testdata/rr_ns_toWire Sat May 29 07:02:14 2010
@@ -1,6 +1,9 @@
#
# A common style of NS RRset stored in a buffer
#
+
+# dummy data 12 bytes = size of DNS header
+00 01 02 03 04 05 06 07 08 09 0a 0b
# 0 1 2 3 4 5 6 7 8 9 10 1 2
#(7) e x a m p l e (3) c o m .
@@ -15,10 +18,10 @@
00 04
# NSNAME: compressed
# 3 4 5 6
-#(1) c ptr=0
- 01 63 c0 00
-# example.com, compressed
- c0 00
+#(1) c ptr=13
+ 01 63 c0 0c
+# example.com, compressed, ptr=13
+ c0 0c
# type/class: NS = 2, IN = 1
00 02 00 01
# TTL: 3600
@@ -27,5 +30,5 @@
00 04
# NSNAME: compressed
# 0 1 3 4
-#(2) a ptr=0
- 01 61 c0 00
+#(2) a ptr=13
+ 01 61 c0 0c
Modified: experiments/jinmei-onmemdb/src/bin/auth/tests/testdata/rr_soa_toWire
==============================================================================
--- experiments/jinmei-onmemdb/src/bin/auth/tests/testdata/rr_soa_toWire (original)
+++ experiments/jinmei-onmemdb/src/bin/auth/tests/testdata/rr_soa_toWire Sat May 29 07:02:14 2010
@@ -19,7 +19,7 @@
02 6e 73 c0 00
# RNAME: compressed
# 5 6 7 8 9 10 11
-#(4) r o o t ptr=5
+#(4) r o o t ptr=0
04 72 6f 6f 74 c0 00
# other numeric parameters
# 28 32 36 40 44
More information about the bind10-changes
mailing list