service.login_delay

This commit is contained in:
HanzZ 2012-12-27 15:02:21 +01:00
parent 984a075019
commit 2ae5cba932
3 changed files with 52 additions and 22 deletions

View file

@ -141,7 +141,9 @@ class NetworkPluginServer {
void pingTimeout();
void sendPing(Backend *c);
Backend *getFreeClient(bool acceptUsers = true, bool longRun = false);
Backend *getFreeClient(bool acceptUsers = true, bool longRun = false, bool check = false);
void connectWaitingUsers();
void loginDelayFinished();
UserManager *m_userManager;
VCardResponder *m_vcardResponder;
@ -152,6 +154,7 @@ class NetworkPluginServer {
std::list<Backend *> m_clients;
Swift::Timer::ref m_pingTimer;
Swift::Timer::ref m_collectTimer;
Swift::Timer::ref m_loginTimer;
Component *m_component;
std::list<User *> m_waitingUsers;
bool m_isNextLongRun;
@ -161,6 +164,7 @@ class NetworkPluginServer {
AdminInterface *m_adminInterface;
bool m_startingBackend;
DiscoItemsResponder *m_discoItemsResponder;
time_t m_lastLogin;
};
}

View file

@ -98,6 +98,7 @@ bool Config::load(std::istream &ifs, boost::program_options::options_description
("service.enable_privacy_lists", value<bool>()->default_value(true), "")
("service.enable_xhtml", value<bool>()->default_value(true), "")
("service.max_room_list_size", value<int>()->default_value(100), "")
("service.login_delay", value<int>()->default_value(0), "")
("service.jid_escaping", value<bool>()->default_value(true), "")
("service.vip_only", value<bool>()->default_value(false), "")
("service.vip_message", value<std::string>()->default_value(""), "")

View file

@ -258,6 +258,7 @@ NetworkPluginServer::NetworkPluginServer(Component *component, Config *config, U
m_isNextLongRun = false;
m_adminInterface = NULL;
m_startingBackend = false;
m_lastLogin = 0;
m_discoItemsResponder = discoItemsResponder;
m_component->m_factory = new NetworkFactory(this);
m_userManager->onUserCreated.connect(boost::bind(&NetworkPluginServer::handleUserCreated, this, _1));
@ -267,6 +268,10 @@ NetworkPluginServer::NetworkPluginServer(Component *component, Config *config, U
m_pingTimer->onTick.connect(boost::bind(&NetworkPluginServer::pingTimeout, this));
m_pingTimer->start();
m_loginTimer = component->getNetworkFactories()->getTimerFactory()->createTimer(CONFIG_INT(config, "service.login_delay") * 1000);
m_loginTimer->onTick.connect(boost::bind(&NetworkPluginServer::loginDelayFinished, this));
m_loginTimer->start();
if (CONFIG_INT(m_config, "service.memory_collector_time") != 0) {
m_collectTimer = component->getNetworkFactories()->getTimerFactory()->createTimer(CONFIG_INT(m_config, "service.memory_collector_time"));
m_collectTimer->onTick.connect(boost::bind(&NetworkPluginServer::collectBackend, this));
@ -355,6 +360,11 @@ void NetworkPluginServer::start() {
}
}
void NetworkPluginServer::loginDelayFinished() {
m_loginTimer->stop();
connectWaitingUsers();
}
void NetworkPluginServer::handleNewClientConnection(boost::shared_ptr<Swift::Connection> c) {
// Create new Backend instance
Backend *client = new Backend;
@ -857,6 +867,29 @@ void NetworkPluginServer::handleFTDataNeeded(Backend *b, unsigned long ftid) {
send(b->connection, message);
}
void NetworkPluginServer::connectWaitingUsers() {
// some users are in queue waiting for this backend
while(!m_waitingUsers.empty()) {
// There's no new backend, so stop associating users and wait for new backend,
// which has been already spawned in getFreeClient() call.
if (getFreeClient(true, false, true) == NULL)
break;
User *u = m_waitingUsers.front();
m_waitingUsers.pop_front();
LOG4CXX_INFO(logger, "Associating " << u->getJID().toString() << " with this backend");
// associate backend with user
handleUserCreated(u);
// connect user if it's ready
if (u->isReadyToConnect()) {
handleUserReadyToConnect(u);
}
}
}
void NetworkPluginServer::handlePongReceived(Backend *c) {
// This could be first PONG from the backend
if (c->pongReceived == -1) {
@ -868,26 +901,7 @@ void NetworkPluginServer::handlePongReceived(Backend *c) {
m_component->start();
}
// some users are in queue waiting for this backend
while(!m_waitingUsers.empty()) {
// There's no new backend, so stop associating users and wait for new backend,
// which has been already spawned in getFreeClient() call.
if (getFreeClient() == NULL)
break;
User *u = m_waitingUsers.front();
m_waitingUsers.pop_front();
LOG4CXX_INFO(logger, "Associating " << u->getJID().toString() << " with this backend");
// associate backend with user
handleUserCreated(u);
// connect user if it's ready
if (u->isReadyToConnect()) {
handleUserReadyToConnect(u);
}
}
connectWaitingUsers();
}
c->pongReceived = true;
@ -1642,9 +1656,20 @@ void NetworkPluginServer::sendPing(Backend *c) {
// LOG4CXX_INFO(logger, "PING to " << c);
}
NetworkPluginServer::Backend *NetworkPluginServer::getFreeClient(bool acceptUsers, bool longRun) {
NetworkPluginServer::Backend *NetworkPluginServer::getFreeClient(bool acceptUsers, bool longRun, bool check) {
NetworkPluginServer::Backend *c = NULL;
unsigned long diff = CONFIG_INT(m_config, "service.login_delay");
time_t now = time(NULL);
if (diff && (now - m_lastLogin < diff)) {
m_loginTimer->start();
return NULL;
}
if (!check) {
m_lastLogin = time(NULL);
}
// Check all backends and find free one
for (std::list<Backend *>::const_iterator it = m_clients.begin(); it != m_clients.end(); it++) {
if ((*it)->willDie == false && (*it)->acceptUsers == acceptUsers && (*it)->users.size() < CONFIG_INT(m_config, "service.users_per_backend") && (*it)->connection && (*it)->longRun == longRun) {