g_DoTToAuthNames.setState(std::move(dotauthNames));
}
+ {
+ CarbonConfig config;
+ stringtok(config.servers, arg()["carbon-server"], ", ");
+ config.hostname = arg()["carbon-server"];
+ config.instance_name = arg()["carbon-instance"];
+ config.namespace_name = arg()["carbon-namespace"];
+ g_carbonConfig.setState(std::move(config));
+ }
+
s_balancingFactor = ::arg().asDouble("distribution-load-factor");
if (s_balancingFactor != 0.0 && s_balancingFactor < 1.0) {
s_balancingFactor = 0.0;
#include "arguments.hh"
#include "lock.hh"
+GlobalStateHolder<CarbonConfig> g_carbonConfig;
void doCarbonDump(void*)
+{
try
{
- string hostname;
- string instance_name;
- string namespace_name;
- vector<string> carbonServers;
-
- {
- std::lock_guard<std::mutex> l(g_carbon_config_lock);
- stringtok(carbonServers, arg()["carbon-server"], ", ");
- namespace_name=arg()["carbon-namespace"];
- hostname=arg()["carbon-ourname"];
- instance_name=arg()["carbon-instance"];
- }
+ static thread_local auto configHolder = g_carbonConfig.getLocal();
- if(carbonServers.empty())
+ auto config = *configHolder;
+ if (config.servers.empty()) {
return;
+ }
- if(namespace_name.empty()) {
- namespace_name="pdns";
+ if (config.namespace_name.empty()) {
+ config.namespace_name = "pdns";
}
- if (hostname.empty()) {
+
+ if (config.hostname.empty()) {
try {
- hostname = getCarbonHostName();
+ config.hostname = getCarbonHostName();
}
catch(const std::exception& e) {
throw std::runtime_error(std::string("The 'carbon-ourname' setting has not been set and we are unable to determine the system's hostname: ") + e.what());
}
}
- if(instance_name.empty()) {
- instance_name="recursor";
+ if (config.instance_name.empty()) {
+ config.instance_name = "recursor";
}
registerAllStats();
PacketBuffer msg;
- for(const auto& carbonServer: carbonServers) {
+ for (const auto& carbonServer: config.servers) {
ComboAddress remote(carbonServer, 2003);
Socket s(remote.sin4.sin_family, SOCK_STREAM);
s.setNonBlocking();
time_t now=time(0);
for(const auto& val : all) {
- str<<namespace_name<<'.'<<hostname<<'.'<<instance_name<<'.'<<val.first<<' '<<val.second.d_value<<' '<<now<<"\r\n";
+ str<<config.namespace_name<<'.'<<config.hostname<<'.'<<config.instance_name<<'.'<<val.first<<' '<<val.second.d_value<<' '<<now<<"\r\n";
}
const string& x = str.str();
msg.insert(msg.end(), x.cbegin(), x.cend());
handler->close();
}
}
-catch(PDNSException& e)
+catch (const PDNSException& e)
{
g_log<<Logger::Error<<"Error in carbon thread: "<<e.reason<<endl;
}
-catch(std::exception& e)
+catch(const std::exception& e)
{
g_log<<Logger::Error<<"Error in carbon thread: "<<e.what()<<endl;
}
{
g_log<<Logger::Error<<"Unknown error in carbon thread"<<endl;
}
+}
StatsMap getAllStatsMap(StatComponent component);
-extern std::mutex g_carbon_config_lock;
+struct CarbonConfig
+{
+ std::string hostname;
+ std::string instance_name;
+ std::string namespace_name;
+ std::vector<std::string> servers;
+};
+
+extern GlobalStateHolder<CarbonConfig> g_carbonConfig;
+
std::vector<std::pair<DNSName, uint16_t> >* pleaseGetQueryRing();
std::vector<std::pair<DNSName, uint16_t> >* pleaseGetServfailQueryRing();
std::vector<std::pair<DNSName, uint16_t> >* pleaseGetBogusQueryRing();
return aa < bb;
}
-std::mutex g_carbon_config_lock;
-
static map<string, const uint32_t*> d_get32bitpointers;
static map<string, const std::atomic<uint64_t>*> d_getatomics;
static map<string, std::function<uint64_t()>> d_get64bitmembers;
template<typename T>
static string doSetCarbonServer(T begin, T end)
{
- std::lock_guard<std::mutex> l(g_carbon_config_lock);
- if(begin==end) {
- ::arg().set("carbon-server").clear();
+ auto config = g_carbonConfig.getCopy();
+ if (begin == end) {
+ config.servers.clear();
+ g_carbonConfig.setState(std::move(config));
return "cleared carbon-server setting\n";
}
+
string ret;
- ::arg().set("carbon-server")=*begin;
- ret="set carbon-server to '"+::arg()["carbon-server"]+"'\n";
+ stringtok(config.servers, *begin, ", ");
+ ret = "set carbon-server to '" + *begin + "'\n";
+
++begin;
- if(begin != end) {
- ::arg().set("carbon-ourname")=*begin;
- ret+="set carbon-ourname to '"+*begin+"'\n";
+ if (begin != end) {
+ config.hostname = *begin;
+ ret += "set carbon-ourname to '" + *begin + "'\n";
} else {
+ g_carbonConfig.setState(std::move(config));
return ret;
}
+
++begin;
- if(begin != end) {
- ::arg().set("carbon-namespace")=*begin;
- ret+="set carbon-namespace to '"+*begin+"'\n";
+ if (begin != end) {
+ config.namespace_name = *begin;
+ ret += "set carbon-namespace to '" + *begin + "'\n";
} else {
+ g_carbonConfig.setState(std::move(config));
return ret;
}
+
++begin;
- if(begin != end) {
- ::arg().set("carbon-instance")=*begin;
- ret+="set carbon-instance to '"+*begin+"'\n";
+ if (begin != end) {
+ config.instance_name = *begin;
+ ret += "set carbon-instance to '" + *begin + "'\n";
}
+
+ g_carbonConfig.setState(std::move(config));
return ret;
}