]>
git.ipfire.org Git - thirdparty/pdns.git/blob - pdns/dnsdist-rings.cc
90fbd5fe1218caff68ce5b0df8e51b8d8afe69f9
4 size_t Rings::numDistinctRequestors()
6 std::set
<ComboAddress
, ComboAddress::addressOnlyLessThan
> s
;
7 ReadLock
rl(&queryLock
);
8 for(const auto& q
: queryRing
)
13 std::unordered_map
<int, vector
<boost::variant
<string
,double>>> Rings::getTopBandwidth(unsigned int numentries
)
15 map
<ComboAddress
, unsigned int, ComboAddress::addressOnlyLessThan
> counts
;
18 ReadLock
rl(&queryLock
);
19 for(const auto& q
: queryRing
) {
20 counts
[q
.requestor
]+=q
.size
;
26 std::lock_guard
<std::mutex
> lock(respMutex
);
27 for(const auto& r
: respRing
) {
28 counts
[r
.requestor
]+=r
.size
;
33 typedef vector
<pair
<unsigned int, ComboAddress
>> ret_t
;
35 rcounts
.reserve(counts
.size());
36 for(const auto& p
: counts
)
37 rcounts
.push_back({p
.second
, p
.first
});
38 numentries
= rcounts
.size() < numentries
? rcounts
.size() : numentries
;
39 partial_sort(rcounts
.begin(), rcounts
.begin()+numentries
, rcounts
.end(), [](const ret_t::value_type
&a
, const ret_t::value_type
&b
)
41 return(b
.first
< a
.first
);
43 std::unordered_map
<int, vector
<boost::variant
<string
,double>>> ret
;
45 unsigned int count
= 1;
46 for(const auto& rc
: rcounts
) {
47 if(count
==numentries
+1) {
51 ret
.insert({count
++, {rc
.second
.toString(), rc
.first
, 100.0*rc
.first
/total
}});
54 ret
.insert({count
, {"Rest", rest
, total
> 0 ? 100.0*rest
/total
: 100.0}});