]> granicus.if.org Git - pdns/commitdiff
rec: Remove unnecessary allocations and copies in DNSComboWriter
authorRemi Gacogne <remi.gacogne@powerdns.com>
Fri, 13 Apr 2018 15:30:33 +0000 (17:30 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Mon, 16 Apr 2018 12:07:17 +0000 (14:07 +0200)
pdns/pdns_recursor.cc

index c3969996434a7ec4e27e631c5bc15677b45cefdf..f91e31fefa9600dfea30611ca41def525f72f5ea 100644 (file)
@@ -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<std::string>&& 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<std::string> d_policyTags;
+  LuaContext::LuaObject d_data;
   EDNSSubnetOpts d_ednssubnet;
-  bool d_ecsFound{false};
-  bool d_ecsParsed{false};
-  bool d_tcp;
+  shared_ptr<TCPConnection> d_tcpConnection;
   int d_socket;
   unsigned int d_tag{0};
   uint32_t d_qhash{0};
-  string d_query;
-  shared_ptr<TCPConnection> d_tcpConnection;
-  vector<pair<uint16_t, string> > d_ednsOpts;
-  std::vector<std::string> d_policyTags;
-  LuaContext::LuaObject d_data;
   uint32_t d_ttlCap{std::numeric_limits<uint32_t>::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<uint16_t>(512), g_udpTruncationThreshold);
     EDNSOpts edo;
+    std::vector<pair<uint16_t, string> > 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<uint16_t>(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;