return ret;
}
-static void filterScore(map<ComboAddress, unsigned int,ComboAddress::addressOnlyLessThan >& counts,
+typedef std::unordered_map<ComboAddress, unsigned int, ComboAddress::addressOnlyHash, ComboAddress::addressOnlyEqual> counts_t;
+
+static counts_t filterScore(const counts_t& counts,
double delta, unsigned int rate)
{
+ counts_t ret;
+
double lim = delta*rate;
- for(auto iter = counts.begin(); iter != counts.end();) {
- if (iter->second <= lim) {
- iter = counts.erase(iter);
- }
- else {
- iter++;
+ for(const auto& c : counts) {
+ if (c.second > lim) {
+ ret[c.first] = c.second;
}
}
+ return ret;
}
return ret;
}
-typedef map<ComboAddress, unsigned int,ComboAddress::addressOnlyLessThan > counts_t;
static counts_t exceedRespGen(unsigned int rate, int seconds, std::function<void(counts_t&, const Rings::Response&)> T)
{
counts_t counts;
{
std::lock_guard<std::mutex> lock(g_rings.respMutex);
+ counts.reserve(g_rings.respRing.size());
for(const auto& c : g_rings.respRing) {
if(seconds && c.when < cutoff)
continue;
}
double delta = seconds ? seconds : DiffTime(now, mintime);
- filterScore(counts, delta, rate);
- return counts;
+ return filterScore(counts, delta, rate);
}
static counts_t exceedQueryGen(unsigned int rate, int seconds, std::function<void(counts_t&, const Rings::Query&)> T)
{
ReadLock rl(&g_rings.queryLock);
+ counts.reserve(g_rings.respRing.size());
for(const auto& c : g_rings.queryRing) {
if(seconds && c.when < cutoff)
continue;
}
double delta = seconds ? seconds : DiffTime(now, mintime);
- filterScore(counts, delta, rate);
- return counts;
+ return filterScore(counts, delta, rate);
}
});
g_lua.writeFunction("addDynBlocks",
- [](const map<ComboAddress,unsigned int, ComboAddress::addressOnlyLessThan>& m, const std::string& msg, boost::optional<int> seconds, boost::optional<DNSAction::Action> action) {
+ [](const std::unordered_map<ComboAddress,unsigned int, ComboAddress::addressOnlyHash, ComboAddress::addressOnlyEqual>& m, const std::string& msg, boost::optional<int> seconds, boost::optional<DNSAction::Action> action) {
setLuaSideEffect();
auto slow = g_dynblockNMG.getCopy();
struct timespec until, now;