From: bert hubert Date: Tue, 17 Nov 2015 15:01:53 +0000 (+0100) Subject: make dnsdist like faster servers even more in leastOutstanding policy (which also... X-Git-Tag: dnsdist-1.0.0-alpha1~217 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d1fba58e3a01749953556aad65f0bdfad01384b9;p=pdns make dnsdist like faster servers even more in leastOutstanding policy (which also appears to honor the 'order' field!) --- diff --git a/pdns/dnsdist.cc b/pdns/dnsdist.cc index 38d266936..b1b5d5cbc 100644 --- a/pdns/dnsdist.cc +++ b/pdns/dnsdist.cc @@ -239,13 +239,16 @@ shared_ptr firstAvailable(const NumberedServerVector& servers, return leastOutstanding(servers, remote, qname, qtype, dh); } +// get server with least outstanding queries, and within those, with the lowest order, and within those: the fastest shared_ptr leastOutstanding(const NumberedServerVector& servers, const ComboAddress& remote, const DNSName& qname, uint16_t qtype, dnsheader* dh) { - vector, shared_ptr>> poss; + vector, shared_ptr>> poss; + /* so you might wonder, why do we go through this trouble? The data on which we sort could change during the sort, + which would suck royally and could even lead to crashes. So first we snapshot on what we sort, and then we sort */ poss.reserve(servers.size()); for(auto& d : servers) { if(d.second->isUp()) { - poss.push_back({make_pair(d.second->outstanding.load(), d.second->order), d.second}); + poss.push_back({make_tuple(d.second->outstanding.load(), d.second->order, d.second->latencyUsec), d.second}); } } if(poss.empty())