From 55b524a0b68be5c5d4fbb3bc450bb9af14ec5a6e Mon Sep 17 00:00:00 2001 From: bert hubert Date: Tue, 12 Jun 2018 15:18:12 +0200 Subject: [PATCH] Implement a smarter dedup for filling packets in auth --- pdns/dnspacket.cc | 16 ++++++++++------ pdns/dnspacket.hh | 3 ++- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/pdns/dnspacket.cc b/pdns/dnspacket.cc index 8889a69c4..59ed0c067 100644 --- a/pdns/dnspacket.cc +++ b/pdns/dnspacket.cc @@ -177,26 +177,30 @@ void DNSPacket::setOpcode(uint16_t opcode) void DNSPacket::clearRecords() { d_rrs.clear(); + d_dedup.clear(); } void DNSPacket::addRecord(const DNSZoneRecord &rr) { // this removes duplicates from the packet in case we are not compressing // for AXFR, no such checking is performed! - // cerr<<"addrecord, content=["<dr) // XXX SUPER SLOW + ser=const_cast(rr).dr.d_content->serialize(rr.dr.d_name); + if(d_dedup.count({rr.dr.d_name, ser})) { // might be a dup + for(auto i=d_rrs.begin();i!=d_rrs.end();++i) { + if(rr.dr == i->dr) // XXX SUPER SLOW return; + } } } + if(d_compress) + d_dedup.insert({rr.dr.d_name, ser}); - // cerr<<"added to d_rrs"< DNSPacket::getAPRecords() { vector arrs; diff --git a/pdns/dnspacket.hh b/pdns/dnspacket.hh index 81c1d6664..3264855e4 100644 --- a/pdns/dnspacket.hh +++ b/pdns/dnspacket.hh @@ -29,7 +29,7 @@ #include #include "iputils.hh" #include "ednssubnet.hh" - +#include #include #include #include @@ -175,6 +175,7 @@ private: string d_tsigprevious; vector d_rrs; // 8 + std::unordered_set, boost::hash< std::pair > > d_dedup; string d_rawpacket; // this is where everything lives 8 EDNSSubnetOpts d_eso; -- 2.40.0