collectBackend called every hour

This commit is contained in:
HanzZ 2011-07-29 00:50:43 +02:00
parent 62e6bdab3c
commit e9e2991f8e
3 changed files with 28 additions and 2 deletions

View file

@ -104,6 +104,7 @@ class NetworkPluginServer {
void send(boost::shared_ptr<Swift::Connection> &, const std::string &data);
void pingTimeout();
void collectBackend();
void sendPing(Backend *c);
Backend *getFreeClient();
@ -115,6 +116,7 @@ class NetworkPluginServer {
boost::shared_ptr<Swift::BoostConnectionServer> m_server;
std::list<Backend *> m_clients;
Swift::Timer::ref m_pingTimer;
Swift::Timer::ref m_collectTimer;
Component *m_component;
std::list<User *> m_waitingUsers;
};

View file

@ -46,6 +46,7 @@ bool Config::load(const std::string &configfile, boost::program_options::options
("service.cert_password", value<std::string>()->default_value(""), "PKCS#12 Certificate password.")
("service.admin_username", value<std::string>()->default_value(""), "Administrator username.")
("service.admin_password", value<std::string>()->default_value(""), "Administrator password.")
("service.reuse_old_backends", value<bool>()->default_value(true), "True if Spectrum should use old backends which were full in the past.")
("identity.name", value<std::string>()->default_value("Spectrum 2 Transport"), "Name showed in service discovery.")
("identity.category", value<std::string>()->default_value("gateway"), "Disco#info identity category. 'gateway' by default.")
("identity.type", value<std::string>()->default_value(""), "Type of transport ('icq','msn','gg','irc', ...)")

View file

@ -146,6 +146,10 @@ NetworkPluginServer::NetworkPluginServer(Component *component, Config *config, U
m_pingTimer->onTick.connect(boost::bind(&NetworkPluginServer::pingTimeout, this));
m_pingTimer->start();
m_collectTimer = component->getNetworkFactories()->getTimerFactory()->createTimer(3600000);
m_collectTimer->onTick.connect(boost::bind(&NetworkPluginServer::collectBackend, this));
m_collectTimer->start();
m_vcardResponder = new VCardResponder(component->getIQRouter(), userManager);
m_vcardResponder->onVCardRequired.connect(boost::bind(&NetworkPluginServer::handleVCardRequired, this, _1, _2, _3));
m_vcardResponder->onVCardUpdated.connect(boost::bind(&NetworkPluginServer::handleVCardUpdated, this, _1, _2));
@ -585,6 +589,23 @@ void NetworkPluginServer::pingTimeout() {
m_pingTimer->start();
}
void NetworkPluginServer::collectBackend() {
LOG4CXX_INFO(logger, "Collect backend called, finding backend which will be set to die");
unsigned long max = 0;
Backend *backend = NULL;
for (std::list<Backend *>::const_iterator it = m_clients.begin(); it != m_clients.end(); it++) {
if ((*it)->res > max) {
max = (*it)->res;
backend = (*it);
}
}
if (backend) {
LOG4CXX_INFO(logger, "Backend " << backend << "is set to die");
backend->acceptUsers = false;
}
}
void NetworkPluginServer::handleUserCreated(User *user) {
Backend *c = getFreeClient();
@ -946,8 +967,10 @@ NetworkPluginServer::Backend *NetworkPluginServer::getFreeClient() {
// This backend is free.
if ((*it)->acceptUsers && (*it)->users.size() < CONFIG_INT(m_config, "service.users_per_backend") && (*it)->connection) {
c = *it;
if (c->users.size() + 1 >= CONFIG_INT(m_config, "service.users_per_backend")) {
c->acceptUsers = false;
if (!CONFIG_BOOL(m_config, "service.reuse_old_backends")) {
if (c->users.size() + 1 >= CONFIG_INT(m_config, "service.users_per_backend")) {
c->acceptUsers = false;
}
}
break;
}