[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