Browse Source

NetworkPluginServer: avoid doing crazy pid tricks, remove signal blocking crap

- Seriously, what?
master
eta 3 years ago
parent
commit
34ff29d773
  1. 2
      include/transport/NetworkPluginServer.h
  2. 2
      libtransport/Logging.cpp
  3. 69
      libtransport/NetworkPluginServer.cpp

2
include/transport/NetworkPluginServer.h

@ -105,7 +105,7 @@ class NetworkPluginServer : Swift::XMPPParserClient { @@ -105,7 +105,7 @@ class NetworkPluginServer : Swift::XMPPParserClient {
void handleMessageReceived(NetworkConversation *conv, std::shared_ptr<Swift::Message> &message);
public:
unsigned long spawnBackend(const char *backend_id);
unsigned long spawnBackend();
void handleNewClientConnection(std::shared_ptr<Swift::Connection> c);
void handleSessionFinished(Backend *c);
void handlePongReceived(Backend *c);

2
libtransport/Logging.cpp

@ -110,10 +110,8 @@ static void initLogging(Config *config, std::string key, bool only_create_dir = @@ -110,10 +110,8 @@ static void initLogging(Config *config, std::string key, bool only_create_dir =
LogString pid, jid, id;
log4cxx::helpers::Transcoder::decode(boost::lexical_cast<std::string>(getpid()), pid);
log4cxx::helpers::Transcoder::decode(CONFIG_STRING(config, "service.jid"), jid);
log4cxx::helpers::Transcoder::decode(CONFIG_STRING_DEFAULTED(config, "service.backend_id", ""), id);
p.setProperty("pid", pid);
p.setProperty("jid", jid);
p.setProperty("id", id);
if (only_create_dir) {
return;

69
libtransport/NetworkPluginServer.cpp

@ -65,7 +65,6 @@ using namespace Transport::Util; @@ -65,7 +65,6 @@ using namespace Transport::Util;
namespace Transport {
static unsigned long backend_id;
static unsigned long bytestream_id;
DEFINE_LOGGER(logger, "NetworkPluginServer");
@ -260,7 +259,7 @@ NetworkPluginServer::~NetworkPluginServer() { @@ -260,7 +259,7 @@ NetworkPluginServer::~NetworkPluginServer() {
// delete m_rosterResponder;
// delete m_blockResponder;
}
unsigned long NetworkPluginServer::spawnBackend(const char *backend_id) {
unsigned long NetworkPluginServer::spawnBackend() {
std::string binaryPath = CONFIG_STRING(m_config, "service.backend");
std::vector<const char *> binaryArgs = {binaryPath.c_str()};
binaryArgs.push_back("--host");
@ -308,7 +307,7 @@ void NetworkPluginServer::start() { @@ -308,7 +307,7 @@ void NetworkPluginServer::start() {
<< CONFIG_STRING(m_config, "service.backend_port"));
while (true) {
unsigned long pid = spawnBackend("1");
unsigned long pid = spawnBackend();
LOG4CXX_INFO(logger, "Tried to spawn first backend with pid " << pid);
LOG4CXX_INFO(logger, "Backend should now connect to Spectrum2 instance. Spectrum2 "
"won't accept any connection before backend connects");
@ -1984,7 +1983,6 @@ void NetworkPluginServer::sendPing(Backend *c) { @@ -1984,7 +1983,6 @@ void NetworkPluginServer::sendPing(Backend *c) {
} else {
LOG4CXX_WARN(logger, "Tried to send PING to backend without connection: " << c << " (ID=" << c->id << ")");
}
// LOG4CXX_INFO(logger, "PING to " << c);
}
void NetworkPluginServer::sendAPIVersion(Backend *c) {
@ -2003,50 +2001,7 @@ void NetworkPluginServer::sendAPIVersion(Backend *c) { @@ -2003,50 +2001,7 @@ void NetworkPluginServer::sendAPIVersion(Backend *c) {
}
void NetworkPluginServer::handlePIDTerminated(unsigned long pid) {
std::vector<unsigned long>::iterator log_id_it;
log_id_it = std::find(m_pids.begin(), m_pids.end(), pid);
if (log_id_it != m_pids.end()) {
*log_id_it = 0;
}
}
static int sig_block_count = 0;
static sigset_t block_mask;
static void __block_signals(void) {
static int init_done = 0;
if ((sig_block_count++) != 1)
return;
if (init_done == 0) {
sigemptyset(&block_mask);
sigaddset(&block_mask, SIGPIPE);
sigaddset(&block_mask, SIGHUP);
sigaddset(&block_mask, SIGINT);
sigaddset(&block_mask, SIGQUIT);
sigaddset(&block_mask, SIGTERM);
sigaddset(&block_mask, SIGABRT);
sigaddset(&block_mask, SIGCHLD);
init_done = 1;
}
sigprocmask(SIG_BLOCK, &block_mask, NULL);
return;
}
static void __unblock_signals(void) {
sigset_t sigset;
if ((sig_block_count--) != 0)
return;
sigprocmask(SIG_UNBLOCK, &block_mask, NULL);
if (sigpending(&sigset) == 0) {
if (sigismember(&sigset, SIGCHLD)) {
raise(SIGCHLD);
}
}
m_pids.erase(std::remove(m_pids.begin(), m_pids.end(), pid), m_pids.end());
}
NetworkPluginServer::Backend *NetworkPluginServer::getFreeClient(bool acceptUsers, bool longRun, bool check) {
@ -2090,22 +2045,8 @@ NetworkPluginServer::Backend *NetworkPluginServer::getFreeClient(bool acceptUser @@ -2090,22 +2045,8 @@ NetworkPluginServer::Backend *NetworkPluginServer::getFreeClient(bool acceptUser
m_isNextLongRun = longRun;
m_startingBackend = true;
__block_signals();
std::vector<unsigned long>::iterator log_id_it;
log_id_it = std::find(m_pids.begin(), m_pids.end(), 0);
std::string log_id = "";
if (log_id_it == m_pids.end()) {
log_id = boost::lexical_cast<std::string>(m_pids.size() + 1);
} else {
log_id = boost::lexical_cast<std::string>(log_id_it - m_pids.begin() + 1);
}
unsigned long pid = spawnBackend(log_id.c_str());
if (log_id_it == m_pids.end()) {
m_pids.push_back(pid);
} else {
*log_id_it = pid;
}
__unblock_signals();
unsigned long pid = spawnBackend();
m_pids.push_back(pid);
}
return c;

Loading…
Cancel
Save