addServerToPool(localPools, "", ret);
g_pools.setState(localPools);
- if(g_launchWork) {
- g_launchWork->push_back([ret]() {
- ret->tid = move(thread(responderThread, ret));
+ if (ret->connected) {
+ if(g_launchWork) {
+ g_launchWork->push_back([ret]() {
+ ret->tid = move(thread(responderThread, ret));
});
- }
- else {
- ret->tid = move(thread(responderThread, ret));
+ }
+ else {
+ ret->tid = move(thread(responderThread, ret));
+ }
}
return ret;
ret->maxCheckFailures=std::stoi(boost::get<string>(vars["maxCheckFailures"]));
}
- if(g_launchWork) {
- g_launchWork->push_back([ret]() {
+ if (ret->connected) {
+ if(g_launchWork) {
+ g_launchWork->push_back([ret]() {
ret->tid = move(thread(responderThread, ret));
});
- }
- else {
- ret->tid = move(thread(responderThread, ret));
+ }
+ else {
+ ret->tid = move(thread(responderThread, ret));
+ }
}
auto states = g_dstates.getCopy();
SSetsockopt(fd, SOL_SOCKET, SO_REUSEADDR, 1);
SBind(fd, sourceAddr);
}
- SConnect(fd, remote);
+ try {
+ SConnect(fd, remote);
+ connected = true;
+ }
+ catch(const std::runtime_error& error) {
+ infolog("Error connecting to new server with address %s: %s", remote.toStringWithPort(), error.what());
+ }
idStates.resize(g_maxOutstanding);
sw.start();
infolog("Added downstream server %s", remote.toStringWithPort());
if(newState != dss->upStatus) {
warnlog("Marking downstream %s as '%s'", dss->getNameWithAddr(), newState ? "up" : "down");
+
+ if (newState && !dss->connected) {
+ try {
+ SConnect(dss->fd, dss->remote);
+ dss->connected = true;
+ dss->tid = move(thread(responderThread, dss));
+ }
+ catch(const std::runtime_error& error) {
+ infolog("Error connecting to new server with address %s: %s", dss->remote.toStringWithPort(), error.what());
+ }
+ }
+
dss->upStatus = newState;
dss->currentCheckFailures = 0;
}
for(const auto& address : g_cmdLine.remotes) {
auto ret=std::make_shared<DownstreamState>(ComboAddress(address, 53));
addServerToPool(localPools, "", ret);
- ret->tid = move(thread(responderThread, ret));
+ if (ret->connected) {
+ ret->tid = move(thread(responderThread, ret));
+ }
g_dstates.modify([ret](servers_t& servers) { servers.push_back(ret); });
}
}