diff --git a/include/transport/config.h b/include/transport/config.h index 3cf03973ede429e068fb33f1167adc92f84c8e7b..70660c3fdda10ffbb075d40dcd4700efcf9ff4b6 100644 --- a/include/transport/config.h +++ b/include/transport/config.h @@ -69,6 +69,8 @@ class Config { /// \param configfile path to config file bool load(const std::string &configfile); + bool reload(); + /// Returns value of variable defined by key. /// For variables in sections you can use "section.variable" key format. diff --git a/src/admininterface.cpp b/src/admininterface.cpp index 12d7ac8bd57063f6373f1798edd1c758a4b5104d..1185151fa90b49c50381dcb6de95fecc7c622b0d 100644 --- a/src/admininterface.cpp +++ b/src/admininterface.cpp @@ -89,6 +89,15 @@ void AdminInterface::handleMessageReceived(Swift::Message::ref message) { int users = m_userManager->getUserCount(); message->setBody(boost::lexical_cast(users)); } + else if (message->getBody() == "reload") { + bool done = m_component->getConfig()->reload(); + if (done) { + message->setBody("Config reloaded"); + } + else { + message->setBody("Error during config reload"); + } + } else if (message->getBody() == "online_users_per_backend") { std::string lst; int id = 1; @@ -125,8 +134,10 @@ void AdminInterface::handleMessageReceived(Swift::Message::ref message) { help += "status - shows instance status\n"; help += "online_users - returns list of all online users\n"; help += "online_users_count - number of online users\n"; + help += "online_users_per_backend - shows online users per backends\n"; help += "has_online_user - returns 1 if user is online\n"; help += "backends_count - number of active backends\n"; + help += "reload - Reloads config file\n"; message->setBody(help); } else { diff --git a/src/config.cpp b/src/config.cpp index 737ca7e211fae32f09e0a879a92ba796a3e7dc18..45728c77c4308e9778d876687a5a2943e13ca75c 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -74,4 +74,12 @@ bool Config::load(const std::string &configfile) { return load(configfile, opts); } +bool Config::reload() { + if (m_file.empty()) { + return false; + } + + return load(m_file); +} + } diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index f29aae93105821d6de2e96917d2449b43db14ed0..0252d79edac78ba084cd1088915531d1210ecd18 100644 --- a/src/networkpluginserver.cpp +++ b/src/networkpluginserver.cpp @@ -519,7 +519,7 @@ void NetworkPluginServer::handleUserCreated(User *user) { Backend *c = getFreeClient(); if (!c) { LOG4CXX_ERROR(logger, "There is no backend to handle user " << user->getJID().toString()); - user->handleDisconnected("Internal Server Error, please reconnect."); + user->handleDisconnected("Internal Server Error (no free backend to handle your session), please reconnect."); return; } user->setData(c); @@ -804,10 +804,13 @@ NetworkPluginServer::Backend *NetworkPluginServer::getFreeClient() { NetworkPluginServer::Backend *c = NULL; bool spawnNew = false; for (std::list::const_iterator it = m_clients.begin(); it != m_clients.end(); it++) { + // This backend is free. if ((*it)->users.size() < CONFIG_INT(m_config, "service.users_per_backend")) { - if ((*it)->users.size() + 1 == CONFIG_INT(m_config, "service.users_per_backend")) { + // After this user, this backend could be full, so we have to spawn new one... + if ((*it)->users.size() + 1 >= CONFIG_INT(m_config, "service.users_per_backend")) { spawnNew = true; } + if (c == NULL) { c = *it; }