from that point on */
typedef std::function<bool(const DNSQuestion*)> blockfilter_t;
+ bool outstanding = false;
blockfilter_t blockFilter = 0;
{
goto drop;
try {
- for(;;) {
+ for(;;) {
+ ds = nullptr;
+ outstanding = false;
+
if(!getNonBlockingMsgLen(ci.fd, &qlen, g_tcpRecvTimeout))
break;
goto drop;
}
+ if(dq.qtype == QType::AXFR || dq.qtype == QType::IXFR) // XXX fixme we really need to do better
+ break;
+
{
std::lock_guard<std::mutex> lock(g_luamutex);
ds = localPolicy->policy(getDownstreamCandidates(g_dstates.getCopy(), pool), &dq);
}
- int dsock;
if(!ds) {
g_stats.noPolicy++;
break;
}
}
+ int dsock;
if(sockets.count(ds->remote) == 0) {
dsock=sockets[ds->remote]=setupTCPDownstream(ds);
}
ds->queries++;
ds->outstanding++;
-
- if(dq.qtype == QType::AXFR || dq.qtype == QType::IXFR) // XXX fixme we really need to do better
- break;
+ outstanding = true;
uint16_t downstream_failures=0;
retry:;
*responseFlags |= origFlags;
char* response = answerbuffer;
uint16_t responseLen = rlen;
+ --ds->outstanding;
+ outstanding = false;
if (ednsAdded) {
const char * optStart = NULL;
vinfolog("Closing TCP client connection with %s", ci.remote.toStringWithPort());
close(ci.fd);
ci.fd=-1;
- if(ds)
+ if (ds && outstanding) {
+ outstanding = false;
--ds->outstanding;
+ }
}
return 0;
}