BIND 10 trac2751, updated. c812d223a1a93535f29ede6a082ea96fc1f928fc [2751] Remove lying comment
BIND 10 source code commits
bind10-changes at lists.isc.org
Mon Sep 2 09:38:12 UTC 2013
The branch, trac2751 has been updated
via c812d223a1a93535f29ede6a082ea96fc1f928fc (commit)
via 128be57f78800c62ca957cd14350bac9627782e0 (commit)
via bb33775113793e5457116033bfafa8f97dd27d18 (commit)
via a3f0255a3b6696ec8d2f21b78366ec44d13374d7 (commit)
from bd154b0950fd08ea60336c73249bc8b0de57779d (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit c812d223a1a93535f29ede6a082ea96fc1f928fc
Author: Michal 'vorner' Vaner <michal.vaner at nic.cz>
Date: Mon Sep 2 11:37:13 2013 +0200
[2751] Remove lying comment
It was simply not true. Removing, as it would state the obvious only
after fixing.
commit 128be57f78800c62ca957cd14350bac9627782e0
Author: Michal 'vorner' Vaner <michal.vaner at nic.cz>
Date: Mon Sep 2 11:34:34 2013 +0200
[2751] Implement the subtract
By copying all the Rdata that is not present in the subtracted sets.
commit bb33775113793e5457116033bfafa8f97dd27d18
Author: Michal 'vorner' Vaner <michal.vaner at nic.cz>
Date: Mon Sep 2 11:33:52 2013 +0200
[2751] Fix tests
Fix several copy-paste and index errors. Add some more print with error.
commit a3f0255a3b6696ec8d2f21b78366ec44d13374d7
Author: Michal 'vorner' Vaner <michal.vaner at nic.cz>
Date: Fri Aug 30 11:19:11 2013 +0200
[2751] Tests for the subtract method
-----------------------------------------------------------------------
Summary of changes:
src/lib/datasrc/memory/rdataset.cc | 109 +++++++++++++++++++--
src/lib/datasrc/tests/memory/rdataset_unittest.cc | 91 ++++++++++++++++-
src/lib/dns/messagerenderer.h | 1 -
3 files changed, 189 insertions(+), 12 deletions(-)
-----------------------------------------------------------------------
diff --git a/src/lib/datasrc/memory/rdataset.cc b/src/lib/datasrc/memory/rdataset.cc
index 7aef77f..baf948e 100644
--- a/src/lib/datasrc/memory/rdataset.cc
+++ b/src/lib/datasrc/memory/rdataset.cc
@@ -12,6 +12,9 @@
// OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
// PERFORMANCE OF THIS SOFTWARE.
+#include "rdataset.h"
+#include "rdata_serialization.h"
+
#include <exceptions/exceptions.h>
#include <dns/rdata.h>
@@ -19,11 +22,10 @@
#include <dns/rrclass.h>
#include <dns/rrtype.h>
#include <dns/rrset.h>
-
-#include "rdataset.h"
-#include "rdata_serialization.h"
+#include <util/buffer.h>
#include <boost/static_assert.hpp>
+#include <boost/bind.hpp>
#include <stdint.h>
#include <algorithm>
@@ -183,18 +185,107 @@ RdataSet::create(util::MemorySegment& mem_sgmt, RdataEncoder& encoder,
return (rdataset);
}
+namespace {
+
+void writeName(util::OutputBuffer* buffer, const LabelSequence& name,
+ RdataNameAttributes)
+{
+ size_t len;
+ const uint8_t* data = name.getData(&len);
+ buffer->writeData(data, len);
+}
+
+void writeData(util::OutputBuffer* buffer, const void* data, size_t len) {
+ buffer->writeData(data, len);
+}
+
+size_t subtractIterate(const dns::ConstRRsetPtr& subtract,
+ const RRClass& rrclass, const RRType& rrtype,
+ boost::function<bool ()> iterator,
+ boost::function<void (const Rdata& rdata)> inserter,
+ util::OutputBuffer& buffer)
+{
+ size_t count = 0;
+ while (iterator()) {
+ util::InputBuffer input(buffer.getData(), buffer.getLength());
+ const RdataPtr& rdata(createRdata(rrtype, rrclass, input,
+ buffer.getLength()));
+ buffer.clear();
+
+ bool insert = true;
+ if (subtract) {
+ for (RdataIteratorPtr it = subtract->getRdataIterator();
+ !it->isLast(); it->next()) {
+ if (rdata->compare(it->getCurrent()) == 0) {
+ insert = false;
+ break;
+ }
+ }
+ }
+
+ if (insert) {
+ inserter(*rdata);
+ ++count;
+ }
+ }
+ return (count);
+}
+
+} // Anonymous namespace
+
RdataSet*
RdataSet::subtract(util::MemorySegment& mem_sgmt, RdataEncoder& encoder,
const dns::ConstRRsetPtr& rrset,
const dns::ConstRRsetPtr& sig_rrset,
const RdataSet& old_rdataset)
{
- (void) mem_sgmt;
- (void) encoder;
- (void) rrset;
- (void) sig_rrset;
- (void) old_rdataset;
- return NULL; // Just for now
+ const std::pair<RRClass, RRType>& rrparams =
+ sanityChecks(rrset, sig_rrset, &old_rdataset);
+ const RRClass& rrclass = rrparams.first;
+ const RRType& rrtype = rrparams.second;
+
+ // Do the encoding
+ encoder.start(rrclass, rrtype);
+ util::OutputBuffer buffer(1024);
+ RdataReader reader(rrclass, rrtype, old_rdataset.getDataBuf(),
+ old_rdataset.getRdataCount(),
+ old_rdataset.getSigRdataCount(),
+ boost::bind(writeName, &buffer, _1, _2),
+ boost::bind(writeData, &buffer, _1, _2));
+
+ // Copy over the Rdata (except for the subtracted)
+ const size_t rdata_count =
+ subtractIterate(rrset, rrclass, rrtype,
+ boost::bind(&RdataReader::iterateRdata, &reader),
+ boost::bind(&RdataEncoder::addRdata, &encoder, _1),
+ buffer);
+ // Copy over the signatures (except for the subtracted)
+ const size_t rrsig_count =
+ subtractIterate(sig_rrset, rrclass, RRType::RRSIG(),
+ boost::bind(&RdataReader::iterateSingleSig, &reader),
+ boost::bind(&RdataEncoder::addSIGRdata, &encoder, _1),
+ buffer);
+
+ // Note that we don't need to check for overflow, if it fitted before, it
+ // fits after removal of something too.
+
+ if (rdata_count == 0 && rrsig_count == 0) {
+ return (NULL); // It is left empty
+ }
+ // Construct the result
+ const size_t ext_rrsig_count_len =
+ rrsig_count >= MANY_RRSIG_COUNT ? sizeof(uint16_t) : 0;
+ const size_t data_len = encoder.getStorageLength();
+ void* p = mem_sgmt.allocate(sizeof(RdataSet) + ext_rrsig_count_len +
+ data_len);
+ RdataSet* rdataset =
+ new(p) RdataSet(rrtype, rdata_count, rrsig_count,
+ restoreTTL(old_rdataset.getTTLData()));
+ if (rrsig_count >= MANY_RRSIG_COUNT) {
+ *rdataset->getExtSIGCountBuf() = rrsig_count;
+ }
+ encoder.encode(rdataset->getDataBuf(), data_len);
+ return (rdataset);
}
void
diff --git a/src/lib/datasrc/tests/memory/rdataset_unittest.cc b/src/lib/datasrc/tests/memory/rdataset_unittest.cc
index 31e5be2..f4b2bf6 100644
--- a/src/lib/datasrc/tests/memory/rdataset_unittest.cc
+++ b/src/lib/datasrc/tests/memory/rdataset_unittest.cc
@@ -103,8 +103,10 @@ checkData(const void* data, size_t size, const RRType* rrtype,
ASSERT_TRUE(*it != it_end); // shouldn't reach the end yet
isc::util::InputBuffer b(data, size);
- EXPECT_EQ(0, createRdata(*rrtype, RRClass::IN(), b, size)->compare(
- *createRdata(*rrtype, RRClass::IN(), **it)));
+ const RdataPtr& actual(createRdata(*rrtype, RRClass::IN(), b, size));
+ const RdataPtr& expected(createRdata(*rrtype, RRClass::IN(), **it));
+ EXPECT_EQ(0, actual->compare(*expected)) << actual->toText() <<
+ " vs. " << expected->toText();
++(*it); // move to the next expected data
}
@@ -224,6 +226,91 @@ TEST_F(RdataSetTest, mergeCreate) {
}
}
+TEST_F(RdataSetTest, subtract) {
+ // Prepare test data
+ const char* const a_rdatas[] = { "192.0.2.1", "192.0.2.2" };
+ const char* const sig_rdatas[] = {
+ "A 5 2 3600 20120814220826 20120715220826 1234 example.com. FAKE",
+ "A 5 2 3600 20120814220826 20120715220826 4321 example.com. FAKE" };
+ ConstRRsetPtr a_rrsets = textToRRset("www.example.com. 1076895760 IN A "
+ + string(a_rdatas[0]) + "\n"
+ + "www.example.com. 1076895760 IN A "
+ + string(a_rdatas[1]));
+ ConstRRsetPtr rrsig_rrsets =
+ textToRRset("www.example.com. 1076895760 IN RRSIG "
+ + string(sig_rdatas[0]) + "\n"
+ + "www.example.com. 1076895760 IN RRSIG "
+ + string(sig_rdatas[1]));
+ ConstRRsetPtr null_rrset; // convenience shortcut
+ // Prepare the data to subtract (they have one common and one differing
+ // element each).
+ const char* const a_rdatas_rm[] = { "192.0.2.1", "192.0.2.3" };
+ const char* const sig_rdatas_rm[] = {
+ "A 5 2 3600 20120814220826 20120715220826 1234 example.com. FAKE",
+ "A 5 2 3600 20120814220826 20120715220826 5678 example.com. FAKE" };
+ ConstRRsetPtr a_rrsets_rm =
+ textToRRset("www.example.com. 1076895760 IN A "
+ + string(a_rdatas_rm[0]) + "\n"
+ + "www.example.com. 1076895760 IN A "
+ + string(a_rdatas_rm[1]));
+ ConstRRsetPtr rrsig_rrsets_rm =
+ textToRRset("www.example.com. 1076895760 IN RRSIG "
+ + string(sig_rdatas_rm[0]) + "\n"
+ + "www.example.com. 1076895760 IN RRSIG "
+ + string(sig_rdatas_rm[1]));
+
+ // A similar cycle as in the mergeCreate test.
+ for (int i = 1; i < 4; ++i) {
+ for (int j = 1; j < 4; ++j) {
+ SCOPED_TRACE("creating subtract case " + lexical_cast<string>(i) +
+ ", " + lexical_cast<string>(j));
+ // Create old rdataset
+ SegmentObjectHolder<RdataSet, RRClass> holder1(mem_sgmt_, rrclass);
+ holder1.set(RdataSet::create(mem_sgmt_, encoder_,
+ (i & 1) ? a_rrsets : null_rrset,
+ (i & 2) ? rrsig_rrsets : null_rrset));
+ // Create merged rdataset, based on the old one and RRsets
+ SegmentObjectHolder<RdataSet, RRClass> holder2(mem_sgmt_, rrclass);
+ holder2.set(RdataSet::subtract(mem_sgmt_, encoder_,
+ (j & 1) ? a_rrsets_rm : null_rrset,
+ (j & 2) ? rrsig_rrsets_rm : null_rrset,
+ *holder1.get()));
+
+ // Set up the expected data for the case.
+ vector<string> expected_rdata;
+ if (i & 1) {
+ if (!(j & 1)) { // Not removed the other
+ expected_rdata.push_back(a_rdatas[0]);
+ }
+ expected_rdata.push_back(a_rdatas[1]);
+ }
+ vector<string> expected_sigs;
+ if (i & 2) {
+ if (!(j & 2)) { // Not removed the other
+ expected_sigs.push_back(sig_rdatas[0]);
+ }
+ expected_sigs.push_back(sig_rdatas[1]);
+ }
+
+ // Then perform the check
+ checkRdataSet(*holder2.get(), expected_rdata, expected_sigs);
+ }
+ }
+ // Reusing the data we have, test some corner cases.
+ SegmentObjectHolder<RdataSet, RRClass> holder_old(mem_sgmt_, rrclass);
+ holder_old.set(RdataSet::create(mem_sgmt_, encoder_, a_rrsets,
+ rrsig_rrsets));
+
+ // It throws if no Rdata passed.
+ EXPECT_THROW(RdataSet::subtract(mem_sgmt_, encoder_, null_rrset,
+ null_rrset, *holder_old.get()),
+ isc::BadValue);
+
+ // If we remove everything, it returns NULL
+ EXPECT_EQ(NULL, RdataSet::subtract(mem_sgmt_, encoder_, a_rrsets,
+ rrsig_rrsets, *holder_old.get()));
+}
+
TEST_F(RdataSetTest, duplicate) {
// Create RRset and RRSIG containing duplicate RDATA.
ConstRRsetPtr dup_rrset =
diff --git a/src/lib/dns/messagerenderer.h b/src/lib/dns/messagerenderer.h
index 092d6de..7defe95 100644
--- a/src/lib/dns/messagerenderer.h
+++ b/src/lib/dns/messagerenderer.h
@@ -367,7 +367,6 @@ public:
using AbstractMessageRenderer::CASE_INSENSITIVE;
using AbstractMessageRenderer::CASE_SENSITIVE;
- /// \brief Constructor from an output buffer.
MessageRenderer();
virtual ~MessageRenderer();
More information about the bind10-changes
mailing list