From 5164bac353088b8ddfa4e16fbb2008a35dfad5ed Mon Sep 17 00:00:00 2001 From: Remi Gacogne Date: Fri, 13 Apr 2018 17:30:33 +0200 Subject: [PATCH] rec: Remove unnecessary allocations and copies in DNSComboWriter --- pdns/pdns_recursor.cc | 35 +++++++++++++++++------------------ 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/pdns/pdns_recursor.cc b/pdns/pdns_recursor.cc index c39699964..f91e31fef 100644 --- a/pdns/pdns_recursor.cc +++ b/pdns/pdns_recursor.cc @@ -195,10 +195,13 @@ bool g_logRPZChanges{false}; //! used to send information to a newborn mthread struct DNSComboWriter { - DNSComboWriter(const char* data, uint16_t len, const struct timeval& now) : d_mdp(true, data, len), d_now(now), - d_tcp(false), d_socket(-1) + DNSComboWriter(const char* data, uint16_t len, const struct timeval& now): d_mdp(true, data, len), d_now(now) {} + DNSComboWriter(const std::string& query, const struct timeval& now, std::vector&& policyTags, LuaContext::LuaObject&& data): d_mdp(true, query.c_str(), query.size()), d_now(now), d_policyTags(std::move(policyTags)), d_data(std::move(data)) + { + } + void setRemote(const ComboAddress& sa) { d_remote=sa; @@ -251,20 +254,18 @@ struct DNSComboWriter { string d_requestorId; string d_deviceId; #endif + std::vector d_policyTags; + LuaContext::LuaObject d_data; EDNSSubnetOpts d_ednssubnet; - bool d_ecsFound{false}; - bool d_ecsParsed{false}; - bool d_tcp; + shared_ptr d_tcpConnection; int d_socket; unsigned int d_tag{0}; uint32_t d_qhash{0}; - string d_query; - shared_ptr d_tcpConnection; - vector > d_ednsOpts; - std::vector d_policyTags; - LuaContext::LuaObject d_data; uint32_t d_ttlCap{std::numeric_limits::max()}; bool d_variable{false}; + bool d_ecsFound{false}; + bool d_ecsParsed{false}; + bool d_tcp; }; MT_t* getMT() @@ -695,7 +696,7 @@ static void updateResponseStats(int res, const ComboAddress& remote, unsigned in } } -static string makeLoginfo(DNSComboWriter* dc) +static string makeLoginfo(const DNSComboWriter* dc) try { return "("+dc->d_mdp.d_qname.toLogString()+"/"+DNSRecordContent::NumberToType(dc->d_mdp.d_qtype)+" from "+(dc->getRemote())+")"; @@ -860,6 +861,7 @@ static void startDoResolve(void *p) uint16_t maxanswersize = dc->d_tcp ? 65535 : min(static_cast(512), g_udpTruncationThreshold); EDNSOpts edo; + std::vector > ednsOpts; bool haveEDNS=false; if(getEDNSOpts(dc->d_mdp, &edo)) { if(!dc->d_tcp) { @@ -868,7 +870,7 @@ static void startDoResolve(void *p) */ maxanswersize = min(static_cast(edo.d_packetsize >= 512 ? edo.d_packetsize : 512), g_udpTruncationThreshold); } - dc->d_ednsOpts = edo.d_options; + ednsOpts = edo.d_options; haveEDNS=true; if (g_useIncomingECS && !dc->d_ecsParsed) { @@ -953,7 +955,7 @@ static void startDoResolve(void *p) DNSRecord spoofed; RecursorLua4::DNSQuestion dq(dc->d_source, dc->d_destination, dc->d_mdp.d_qname, dc->d_mdp.d_qtype, dc->d_tcp, variableAnswer, wantsRPZ); dq.ednsFlags = &edo.d_Z; - dq.ednsOptions = &dc->d_ednsOpts; + dq.ednsOptions = &ednsOpts; dq.tag = dc->d_tag; dq.discardedPolicies = &sr.d_discardedPolicies; dq.policyTags = &dc->d_policyTags; @@ -1953,18 +1955,15 @@ static string* doProcessUDPQuestion(const std::string& question, const ComboAddr return 0; } - DNSComboWriter* dc = new DNSComboWriter(question.c_str(), question.size(), g_now); + DNSComboWriter* dc = new DNSComboWriter(question, g_now, std::move(policyTags), std::move(data)); dc->setSocket(fd); dc->d_tag=ctag; dc->d_qhash=qhash; - dc->d_query = question; dc->setRemote(fromaddr); dc->setSource(source); dc->setLocal(destaddr); dc->setDestination(destination); dc->d_tcp=false; - dc->d_policyTags = policyTags; - dc->d_data = data; dc->d_ecsFound = ecsFound; dc->d_ecsParsed = ecsParsed; dc->d_ednssubnet = ednssubnet; @@ -1972,7 +1971,7 @@ static string* doProcessUDPQuestion(const std::string& question, const ComboAddr dc->d_variable = variable; #ifdef HAVE_PROTOBUF if (t_protobufServer || t_outgoingProtobufServer) { - dc->d_uuid = uniqueId; + dc->d_uuid = std::move(uniqueId); } dc->d_requestorId = requestorId; dc->d_deviceId = deviceId; -- 2.40.0