threadStarted.clear();
if (d_config.d_qpsLimit > 0) {
- qps = QPSLimiter(d_config.d_qpsLimit, d_config.d_qpsLimit);
+ d_qpsLimiter = QPSLimiter(d_config.d_qpsLimit, d_config.d_qpsLimit);
}
if (d_config.id) {
return false;
}
+unsigned int DownstreamState::getQPSLimit() const
+{
+ return d_qpsLimiter ? d_qpsLimiter->getRate() : 0U;
+}
+
size_t ServerPool::countServers(bool upOnly)
{
std::shared_ptr<const ServerPolicy::NumberedServerVector> servers = nullptr;
shared_ptr<DownstreamState> firstAvailable(const ServerPolicy::NumberedServerVector& servers, const DNSQuestion* dq)
{
for (auto& d : servers) {
- if (d.second->isUp() && d.second->qps.checkOnly()) {
+ if (d.second->isUp() && (!d.second->d_qpsLimiter || d.second->d_qpsLimiter->checkOnly())) {
return d.second;
}
}
/* DownstreamState */
luaCtx.registerFunction<void (std::shared_ptr<DownstreamState>::*)(int)>("setQPS", [](std::shared_ptr<DownstreamState>& state, int lim) {
if (state) {
- state->qps = lim > 0 ? QPSLimiter(lim, lim) : QPSLimiter();
+ if (lim > 0) {
+ state->d_qpsLimiter = QPSLimiter(lim, lim);
+ }
+ else {
+ state->d_qpsLimiter.reset();
+ }
}
});
luaCtx.registerFunction<void (std::shared_ptr<DownstreamState>::*)(string)>("addPool", [](const std::shared_ptr<DownstreamState>& state, const string& pool) {
const std::string latency = (backend->latencyUsec == 0.0 ? "-" : boost::str(latFmt % (backend->latencyUsec / 1000.0)));
const std::string latencytcp = (backend->latencyUsecTCP == 0.0 ? "-" : boost::str(latFmt % (backend->latencyUsecTCP / 1000.0)));
if (showUUIDs) {
- ret << (fmt % counter % backend->getName() % backend->d_config.remote.toStringWithPort() % status % backend->queryLoad % backend->qps.getRate() % backend->d_config.order % backend->d_config.d_weight % backend->queries.load() % backend->reuseds.load() % (backend->dropRate) % latency % backend->outstanding.load() % pools % *backend->d_config.id % latencytcp) << endl;
+ ret << (fmt % counter % backend->getName() % backend->d_config.remote.toStringWithPort() % status % backend->queryLoad % backend->getQPSLimit() % backend->d_config.order % backend->d_config.d_weight % backend->queries.load() % backend->reuseds.load() % (backend->dropRate) % latency % backend->outstanding.load() % pools % *backend->d_config.id % latencytcp) << endl;
}
else {
- ret << (fmt % counter % backend->getName() % backend->d_config.remote.toStringWithPort() % status % backend->queryLoad % backend->qps.getRate() % backend->d_config.order % backend->d_config.d_weight % backend->queries.load() % backend->reuseds.load() % (backend->dropRate) % latency % backend->outstanding.load() % pools % latencytcp) << endl;
+ ret << (fmt % counter % backend->getName() % backend->d_config.remote.toStringWithPort() % status % backend->queryLoad % backend->getQPSLimit() % backend->d_config.order % backend->d_config.d_weight % backend->queries.load() % backend->reuseds.load() % (backend->dropRate) % latency % backend->outstanding.load() % pools % latencytcp) << endl;
}
totQPS += static_cast<uint64_t>(backend->queryLoad);
totQueries += backend->queries.load();
break;
case COLUMN_BACKENDQPSLIMIT:
DNSDistSNMPAgent::setCounter64Value(request,
- server->qps.getRate());
+ server->getQPSLimit());
break;
case COLUMN_BACKENDREUSED:
DNSDistSNMPAgent::setCounter64Value(request, server->reuseds.load());
{"state", status},
{"protocol", backend->getProtocol().toPrettyString()},
{"qps", (double)backend->queryLoad},
- {"qpsLimit", (double)backend->qps.getRate()},
+ {"qpsLimit", static_cast<double>(backend->getQPSLimit())},
{"outstanding", (double)backend->outstanding},
{"reuseds", (double)backend->reuseds},
{"weight", (double)backend->d_config.d_weight},
std::shared_ptr<TLSCtx> d_tlsCtx{nullptr};
std::vector<int> sockets;
StopWatch sw;
- QPSLimiter qps;
+ std::optional<QPSLimiter> d_qpsLimiter;
#ifdef HAVE_XSK
std::vector<std::shared_ptr<XskWorker>> d_xskInfos;
std::vector<std::shared_ptr<XskSocket>> d_xskSockets;
void incQueriesCount()
{
++queries;
- qps.addHit();
+ if (d_qpsLimiter) {
+ d_qpsLimiter->addHit();
+ }
}
void incCurrentConnectionsCount();
}
return latencyUsec;
}
+
+ unsigned int getQPSLimit() const;
};
void responderThread(std::shared_ptr<DownstreamState> dss);