[Pdns-users] Re: TCP Queries always go to the recursor?
Augie Schwer
augie.schwer at gmail.com
Fri Dec 29 01:20:11 UTC 2006
On 12/13/06, Augie Schwer <augie.schwer at gmail.com> wrote:
> Is there a reason why TCP queries are always getting sent to the
> recursor (if available) for answers instead of checking for an
> authoritative answer first and then recursing if no authoritative
> answer was found?
I submitted a ticket for this:
http://wiki.powerdns.com/cgi-bin/trac.fcgi/ticket/118
The patch should look something like this; doing a packet cache and
backend check before passing along for recursion, but this is pretty
rudimentary and probably not totally correct:
[augie at augnix pdns]$ svn diff tcpreceiver.cc
Index: tcpreceiver.cc
===================================================================
--- tcpreceiver.cc (revision 935)
+++ tcpreceiver.cc (working copy)
@@ -169,32 +169,6 @@
continue;
}
-
- if(packet->d.rd && arg().mustDo("recursor")) {
- // now what
- // this is a pretty rare event all in all, so we can afford to be slow
-
- // this code SHOULD attempt to answer from the local cache first!
- S.inc("recursing-questions");
- Resolver res;
- unsigned int len;
- DLOG(L<<"About to hand query to recursor"<<endl);
- ServiceTuple st;
- st.port=53;
- parseService(arg()["recursor"],st);
-
- char *buffer=res.sendReceive(st.host,st.port,packet->getRaw(),packet->len,&len);
- DLOG(L<<"got an answer from recursor: "<<len<<" bytes,
"<<(int)buffer<<endl);
- if(buffer) {
- sendData(buffer,len,fd);
- DLOG(L<<"sent out to customer: "<<len<<" bytes"<<endl);
- delete buffer;
- S.inc("recursing-answers");
- S.inc("tcp-answers");
- }
- continue;
- }
-
DNSPacket* cached=new DNSPacket;
if(!packet->d.rd && (PC.get(packet, cached))) { // short
circuit - does the PacketCache recognize this question?
cached->setRemote(&packet->remote);
@@ -217,15 +191,41 @@
}
reply=s_P->question(packet); // we really need to ask the backend :-)
}
-
- delete packet;
- packet = NULL;
- if(!reply) // unable to write an answer?
+ if(!reply){ // unable to write an answer?
+ delete packet;
+ packet = NULL;
break;
+ }
S.inc("tcp-answers");
sendDelPacket(reply, fd);
+
+ if(packet->d.rd && arg().mustDo("recursor")) {
+ // now what
+ // this is a pretty rare event all in all, so we can afford to be slow
+
+ // this code SHOULD attempt to answer from the local cache first!
+ S.inc("recursing-questions");
+ Resolver res;
+ unsigned int len;
+ DLOG(L<<"About to hand query to recursor"<<endl);
+ ServiceTuple st;
+ st.port=53;
+ parseService(arg()["recursor"],st);
+
+ char *buffer=res.sendReceive(st.host,st.port,packet->getRaw(),packet->len,&len);
+ DLOG(L<<"got an answer from recursor: "<<len<<" bytes,
"<<(int)buffer<<endl);
+ delete packet;
+ if(buffer) {
+ sendData(buffer,len,fd);
+ DLOG(L<<"sent out to customer: "<<len<<" bytes"<<endl);
+ delete buffer;
+ S.inc("recursing-answers");
+ S.inc("tcp-answers");
+ }
+ continue;
+ }
}
out:
--
Augie Schwer - Augie at Schwer.us - http://schwer.us
Key fingerprint = 9815 AE19 AFD1 1FE7 5DEE 2AC3 CB99 2784 27B0 C072
More information about the Pdns-users
mailing list