]> git.ipfire.org Git - thirdparty/pdns.git/blob - pdns/dnsdist-rings.cc
Merge pull request #2998 from ahupowerdns/various
[thirdparty/pdns.git] / pdns / dnsdist-rings.cc
1 #include "dnsdist.hh"
2 #include "lock.hh"
3
4 unsigned int Rings::numDistinctRequestors()
5 {
6 std::set<ComboAddress, ComboAddress::addressOnlyLessThan> s;
7 WriteLock wl(&queryLock);
8 for(const auto& q : queryRing)
9 s.insert(q.requestor);
10 return s.size();
11 }
12
13 vector<pair<unsigned int,ComboAddress> > Rings::getTopBandwidth(unsigned int numentries)
14 {
15 map<ComboAddress, unsigned int, ComboAddress::addressOnlyLessThan> counts;
16 {
17 WriteLock wl(&queryLock);
18 for(const auto& q : queryRing)
19 counts[q.requestor]+=q.size;
20 }
21
22 {
23 std::lock_guard<std::mutex> lock(respMutex);
24 for(const auto& r : respRing)
25 counts[r.requestor]+=r.size;
26 }
27
28 typedef vector<pair<unsigned int, ComboAddress>> ret_t;
29 ret_t ret;
30 for(const auto& p : counts)
31 ret.push_back({p.second, p.first});
32 numentries = ret.size() < numentries ? ret.size() : numentries;
33 partial_sort(ret.begin(), ret.begin()+numentries, ret.end(), [](const ret_t::value_type&a, const ret_t::value_type&b)
34 {
35 return(b.second < a.second);
36 });
37 ret.resize(numentries);
38 return ret;
39 }