From: Charles-Henri Bruyand Date: Fri, 7 Sep 2018 06:12:07 +0000 (+0200) Subject: dnsdist: do not iterate over hash map for consistent hashing based query distribution X-Git-Tag: dnsdist-1.3.3~96^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b712c51ee3efb36c5a711527602a70d59e74d85c;p=thirdparty%2Fpdns.git dnsdist: do not iterate over hash map for consistent hashing based query distribution --- diff --git a/pdns/dnsdist.cc b/pdns/dnsdist.cc index 39018f851b..0942a4f0d9 100644 --- a/pdns/dnsdist.cc +++ b/pdns/dnsdist.cc @@ -775,10 +775,10 @@ shared_ptr whashed(const NumberedServerVector& servers, const D shared_ptr chashed(const NumberedServerVector& servers, const DNSQuestion* dq) { - std::map> circle = {}; unsigned int qhash = dq->qname->hash(g_hashperturb); - unsigned int sel = 0, max = 0; - shared_ptr ret = nullptr, last = nullptr; + unsigned int sel = std::numeric_limits::max(); + unsigned int min = std::numeric_limits::max(); + shared_ptr ret = nullptr, first = nullptr; for (const auto& d: servers) { if (d.second->isUp()) { @@ -790,18 +790,17 @@ shared_ptr chashed(const NumberedServerVector& servers, const D ReadLock rl(&(d.second->d_lock)); const auto& server = d.second; // we want to keep track of the last hash - if (max < *(server->hashes.rbegin())) { - max = *(server->hashes.rbegin()); - last = server; + if (min > *(server->hashes.begin())) { + min = *(server->hashes.begin()); + first = server; } - auto hash_it = server->hashes.begin(); - while (hash_it != server->hashes.end() - && *hash_it < qhash) { - if (*hash_it > sel) { + + auto hash_it = server->hashes.lower_bound(qhash); + if (hash_it != server->hashes.end()) { + if (*hash_it < sel) { sel = *hash_it; ret = server; } - ++hash_it; } } } @@ -809,8 +808,8 @@ shared_ptr chashed(const NumberedServerVector& servers, const D if (ret != nullptr) { return ret; } - if (last != nullptr) { - return last; + if (first != nullptr) { + return first; } return shared_ptr(); }