]> granicus.if.org Git - pdns/commitdiff
dnsdist: Don't generate a fresh UUID until we really need it
authorRemi Gacogne <remi.gacogne@powerdns.com>
Fri, 28 Jul 2017 13:38:29 +0000 (15:38 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Tue, 5 Sep 2017 14:52:23 +0000 (16:52 +0200)
pdns/dnsdist-protobuf.cc
pdns/dnsdist-tcp.cc
pdns/dnsdist.cc
pdns/dnsdist.hh
pdns/dnsrulactions.hh

index 78724dda9598a11970158b90479118fea38ab009..b0ba7e745f3778fde7311d9fb20cedac9f6440c3 100644 (file)
 #ifdef HAVE_PROTOBUF
 #include "dnsmessage.pb.h"
 
-DNSDistProtoBufMessage::DNSDistProtoBufMessage(const DNSQuestion& dq): DNSProtoBufMessage(Query, dq.uniqueId, dq.remote, dq.local, *dq.qname, dq.qtype, dq.qclass, dq.dh->id, dq.tcp, dq.len)
+DNSDistProtoBufMessage::DNSDistProtoBufMessage(const DNSQuestion& dq): DNSProtoBufMessage(Query, dq.uniqueId ? *dq.uniqueId : t_uuidGenerator(), dq.remote, dq.local, *dq.qname, dq.qtype, dq.qclass, dq.dh->id, dq.tcp, dq.len)
 {
 };
 
-DNSDistProtoBufMessage::DNSDistProtoBufMessage(const DNSResponse& dr, bool includeCNAME): DNSProtoBufMessage(Response, dr.uniqueId, dr.remote, dr.local, *dr.qname, dr.qtype, dr.qclass, dr.dh->id, dr.tcp, dr.len)
+DNSDistProtoBufMessage::DNSDistProtoBufMessage(const DNSResponse& dr, bool includeCNAME): DNSProtoBufMessage(Response, dr.uniqueId ? *dr.uniqueId : t_uuidGenerator(), dr.remote, dr.local, *dr.qname, dr.qtype, dr.qclass, dr.dh->id, dr.tcp, dr.len)
 {
   setQueryTime(dr.queryTime->tv_sec, dr.queryTime->tv_nsec / 1000);
   setResponseCode(dr.dh->rcode);
index 5d75e811aaaafbfb839e00679530f1becc5664eb..4e3e1071af169b1319e00f8ddc7601be385e116e 100644 (file)
@@ -331,9 +331,6 @@ void* tcpClientThread(int pipefd)
        unsigned int consumed = 0;
        DNSName qname(query, qlen, sizeof(dnsheader), false, &qtype, &qclass, &consumed);
        DNSQuestion dq(&qname, qtype, qclass, &dest, &ci.remote, dh, queryBuffer.capacity(), qlen, true);
-#ifdef HAVE_PROTOBUF
-        dq.uniqueId = t_uuidGenerator();
-#endif
 
        string poolname;
        int delayMsec=0;
index 8bba4b3f5b13140d5f785790d84530168cde2e4d..01dfca48af15035923c49d03b13552fab0007adc 100644 (file)
@@ -1198,10 +1198,6 @@ static void processUDPQuery(ClientState& cs, LocalHolders& holders, const struct
     DNSName qname(query, len, sizeof(dnsheader), false, &qtype, &qclass, &consumed);
     DNSQuestion dq(&qname, qtype, qclass, dest.sin4.sin_family != 0 ? &dest : &cs.local, &remote, dh, queryBufferSize, len, false);
 
-#ifdef HAVE_PROTOBUF
-    dq.uniqueId = t_uuidGenerator();
-#endif
-
     string poolname;
     int delayMsec = 0;
     /* we need an accurate ("real") value for the response and
index 020e43e59c270456e49a6484a039e66fba5b29e7..f745904b24906c92cf3c68a2b166d2c956f99e26 100644 (file)
@@ -132,7 +132,7 @@ struct DNSQuestion
   DNSQuestion(const DNSName* name, uint16_t type, uint16_t class_, const ComboAddress* lc, const ComboAddress* rem, struct dnsheader* header, size_t bufferSize, uint16_t queryLen, bool isTcp): qname(name), qtype(type), qclass(class_), local(lc), remote(rem), dh(header), size(bufferSize), len(queryLen), ecsPrefixLength(rem->sin4.sin_family == AF_INET ? g_ECSSourcePrefixV4 : g_ECSSourcePrefixV6), tcp(isTcp), ecsOverride(g_ECSOverride) { }
 
 #ifdef HAVE_PROTOBUF
-  boost::uuids::uuid uniqueId;
+  boost::optional<boost::uuids::uuid> uniqueId;
 #endif
   const DNSName* qname;
   const uint16_t qtype;
@@ -407,7 +407,7 @@ struct IDState
   std::shared_ptr<DnsCryptQuery> dnsCryptQuery{0};
 #endif
 #ifdef HAVE_PROTOBUF
-  boost::uuids::uuid uniqueId;
+  boost::optional<boost::uuids::uuid> uniqueId;
 #endif
   std::shared_ptr<DNSDistPacketCache> packetCache{nullptr};
   const ClientState* cs{nullptr};
index 33e1d7da7287beefb5bf689a3d0c5a103b506ae6..d8f22000c9c1599f067838c57309de96397f2c9d 100644 (file)
@@ -1242,6 +1242,10 @@ public:
   DNSAction::Action operator()(DNSQuestion* dq, string* ruleresult) const override
   {
 #ifdef HAVE_PROTOBUF
+    if (!dq->uniqueId) {
+      dq->uniqueId = t_uuidGenerator();
+    }
+
     DNSDistProtoBufMessage message(*dq);
     {
       if (d_alterFunc) {
@@ -1295,6 +1299,10 @@ public:
   DNSResponseAction::Action operator()(DNSResponse* dr, string* ruleresult) const override
   {
 #ifdef HAVE_PROTOBUF
+    if (!dr->uniqueId) {
+      dr->uniqueId = t_uuidGenerator();
+    }
+
     DNSDistProtoBufMessage message(*dr, d_includeCNAME);
     {
       if (d_alterFunc) {