Skip to content

Commit

Permalink
dnsdist: Move rules to the new configuration
Browse files Browse the repository at this point in the history
  • Loading branch information
rgacogne committed Jul 5, 2024
1 parent d5b5152 commit 51d8cc3
Show file tree
Hide file tree
Showing 20 changed files with 341 additions and 236 deletions.
3 changes: 1 addition & 2 deletions pdns/dnsdistdist/dnsdist-async.cc
Original file line number Diff line number Diff line change
Expand Up @@ -222,8 +222,7 @@ static bool resumeResponse(std::unique_ptr<CrossProtocolQuery>&& response)
auto& ids = response->query.d_idstate;
DNSResponse dnsResponse = response->getDR();

LocalHolders holders;
auto result = processResponseAfterRules(response->query.d_buffer, *holders.cacheInsertedRespRuleActions, dnsResponse, ids.cs->muted);
auto result = processResponseAfterRules(response->query.d_buffer, dnsResponse, ids.cs->muted);
if (!result) {
/* easy */
return true;
Expand Down
11 changes: 11 additions & 0 deletions pdns/dnsdistdist/dnsdist-configuration.hh
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
#include <string>

#include "dnsdist-query-count.hh"
#include "dnsdist-rule-chains.hh"
#include "iputils.hh"

/* so what could you do:
Expand Down Expand Up @@ -184,6 +185,16 @@ struct Configuration
a RCU-like mechanism */
struct RuntimeConfiguration
{
// ca tient pas la route: meilleure option: stocker un type plus opaque dans la configuration (dnsdist::rules::RuleChains) et
// laisser le soin a dnsdist::rules de le gerer
/* std::vector<rules::RuleAction> d_cacheMissRuleActions;
std::vector<rules::ResponseRuleAction> d_respruleactions;
std::vector<rules::ResponseRuleAction> d_cachehitrespruleactions;
std::vector<rules::ResponseRuleAction> d_selfansweredrespruleactions;
std::vector<rules::ResponseRuleAction> d_cacheInsertedRespRuleActions;
std::vector<rules::ResponseRuleAction> d_XFRRespRuleActions;
*/
rules::RuleChains d_ruleChains;
servers_t d_backends;
std::map<std::string, std::shared_ptr<ServerPool>> d_pools;
std::shared_ptr<ServerPolicy> d_lbPolicy;
Expand Down
19 changes: 10 additions & 9 deletions pdns/dnsdistdist/dnsdist-lua-actions.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2376,8 +2376,8 @@ class SetExtendedDNSErrorResponseAction : public DNSResponseAction
EDNSExtendedError d_ede;
};

template <typename T, typename ActionT>
static void addAction(GlobalStateHolder<vector<T>>* someRuleActions, const luadnsrule_t& var, const std::shared_ptr<ActionT>& action, boost::optional<luaruleparams_t>& params)
template <typename ActionT, typename IdentifierT>
static void addAction(IdentifierT identifier, const luadnsrule_t& var, const std::shared_ptr<ActionT>& action, boost::optional<luaruleparams_t>& params)
{
setLuaSideEffect();

Expand All @@ -2388,8 +2388,8 @@ static void addAction(GlobalStateHolder<vector<T>>* someRuleActions, const luadn
checkAllParametersConsumed("addAction", params);

auto rule = makeRule(var, "addAction");
someRuleActions->modify([&rule, &action, &uuid, creationOrder, &name](vector<T>& ruleactions) {
ruleactions.push_back({std::move(rule), std::move(action), std::move(name), uuid, creationOrder});
dnsdist::configuration::updateRuntimeConfiguration([identifier, &rule, &action, &name, &uuid, creationOrder](dnsdist::configuration::RuntimeConfiguration& config) {
dnsdist::rules::add(config.d_ruleChains, identifier, std::move(rule), action, std::move(name), uuid, creationOrder);
});
}

Expand Down Expand Up @@ -2418,35 +2418,36 @@ void setupLuaActions(LuaContext& luaCtx)
return std::make_shared<dnsdist::rules::RuleAction>(ruleaction);
});

for (const auto& chain : dnsdist::rules::getRuleChains()) {
for (const auto& chain : dnsdist::rules::getRuleChainDescriptions()) {
auto fullName = std::string("add") + chain.prefix + std::string("Action");
luaCtx.writeFunction(fullName, [&fullName, &chain](const luadnsrule_t& var, boost::variant<std::shared_ptr<DNSAction>, std::shared_ptr<DNSResponseAction>> era, boost::optional<luaruleparams_t> params) {
if (era.type() != typeid(std::shared_ptr<DNSAction>)) {
throw std::runtime_error(fullName + "() can only be called with query-related actions, not response-related ones. Are you looking for addResponseAction()?");
}

addAction(&chain.holder, var, boost::get<std::shared_ptr<DNSAction>>(era), params);
addAction(chain.identifier, var, boost::get<std::shared_ptr<DNSAction>>(era), params);
});
fullName = std::string("get") + chain.prefix + std::string("Action");
luaCtx.writeFunction(fullName, [&chain](unsigned int num) {
setLuaNoSideEffect();
boost::optional<std::shared_ptr<DNSAction>> ret;
auto ruleactions = chain.holder.getCopy();
const auto& chains = dnsdist::configuration::getCurrentRuntimeConfiguration().d_ruleChains;
const auto& ruleactions = dnsdist::rules::getRuleChain(chains, chain.identifier);
if (num < ruleactions.size()) {
ret = ruleactions[num].d_action;
}
return ret;
});
}

for (const auto& chain : dnsdist::rules::getResponseRuleChains()) {
for (const auto& chain : dnsdist::rules::getResponseRuleChainDescriptions()) {
const auto fullName = std::string("add") + chain.prefix + std::string("ResponseAction");
luaCtx.writeFunction(fullName, [&fullName, &chain](const luadnsrule_t& var, boost::variant<std::shared_ptr<DNSAction>, std::shared_ptr<DNSResponseAction>> era, boost::optional<luaruleparams_t> params) {
if (era.type() != typeid(std::shared_ptr<DNSResponseAction>)) {
throw std::runtime_error(fullName + "() can only be called with response-related actions, not query-related ones. Are you looking for addAction()?");
}

addAction(&chain.holder, var, boost::get<std::shared_ptr<DNSResponseAction>>(era), params);
addAction(chain.identifier, var, boost::get<std::shared_ptr<DNSResponseAction>>(era), params);
});
}

Expand Down
2 changes: 1 addition & 1 deletion pdns/dnsdistdist/dnsdist-lua-bindings.cc
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ void setupLuaBindings(LuaContext& luaCtx, bool client, bool configCheck)
/* DownstreamState */
luaCtx.registerFunction<void (DownstreamState::*)(int)>("setQPS", [](DownstreamState& state, int lim) { state.qps = lim > 0 ? QPSLimiter(lim, lim) : QPSLimiter(); });
luaCtx.registerFunction<void (std::shared_ptr<DownstreamState>::*)(string)>("addPool", [](const std::shared_ptr<DownstreamState>& state, const string& pool) {
addServerToPool( pool, state);
addServerToPool(pool, state);
state->d_config.pools.insert(pool);
});
luaCtx.registerFunction<void (std::shared_ptr<DownstreamState>::*)(string)>("rmPool", [](const std::shared_ptr<DownstreamState>& state, const string& pool) {
Expand Down
Loading

0 comments on commit 51d8cc3

Please sign in to comment.