From f86b9e0be73d249e50a4d9ae33d4fd09faa8ae3d Mon Sep 17 00:00:00 2001 From: woogerboy21 Date: Wed, 7 Dec 2016 01:35:35 -0500 Subject: [PATCH] Remedy connection type query at every login (#2298) Fix #2285 This change adds an internal counter for each tcp/web socket connection that the server makes and queries the stored memory count at login rather than the previous way that quired the database during each login. Each login that quired the DB put a significant load on the server as the user base grew. --- common/server.cpp | 15 ++++++++++++++- common/server.h | 4 +++- servatrice/src/serversocketinterface.cpp | 4 ++-- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/common/server.cpp b/common/server.cpp index 69c08e31..3a413540 100644 --- a/common/server.cpp +++ b/common/server.cpp @@ -38,7 +38,7 @@ #include Server::Server(QObject *parent) - : QObject(parent), nextLocalGameId(0) + : QObject(parent), nextLocalGameId(0), tcpUserCount(0), webSocketUserCount(0) { qRegisterMetaType("ServerInfo_Ban"); qRegisterMetaType("ServerInfo_Game"); @@ -202,12 +202,25 @@ Server_AbstractUserInterface *Server::findUser(const QString &userName) const void Server::addClient(Server_ProtocolHandler *client) { + if (client->getConnectionType() == "tcp") + tcpUserCount++; + + if (client->getConnectionType() == "websocket") + webSocketUserCount++; + QWriteLocker locker(&clientsLock); clients << client; } void Server::removeClient(Server_ProtocolHandler *client) { + + if (client->getConnectionType() == "tcp") + tcpUserCount--; + + if (client->getConnectionType() == "websocket") + webSocketUserCount--; + QWriteLocker locker(&clientsLock); clients.removeAt(clients.indexOf(client)); ServerInfo_User *data = client->getUserInfo(); diff --git a/common/server.h b/common/server.h index 3cb7cbf3..bdf172c9 100644 --- a/common/server.h +++ b/common/server.h @@ -97,10 +97,12 @@ public: QList getPersistentPlayerReferences(const QString &userName) const; int getUsersCount() const; int getGamesCount() const; + int getTCPUserCount() const { return tcpUserCount; } + int getWebSocketUserCount() const { return webSocketUserCount; } private: QMultiMap persistentPlayers; mutable QReadWriteLock persistentPlayersLock; - int nextLocalGameId; + int nextLocalGameId, tcpUserCount, webSocketUserCount; QMutex nextLocalGameIdMutex; protected slots: diff --git a/servatrice/src/serversocketinterface.cpp b/servatrice/src/serversocketinterface.cpp index a886f207..d749108a 100644 --- a/servatrice/src/serversocketinterface.cpp +++ b/servatrice/src/serversocketinterface.cpp @@ -1259,7 +1259,7 @@ bool TcpServerSocketInterface::initTcpSession() bool enforceUserLimit = settingsCache->value("security/enable_max_user_limit", false).toBool(); if (enforceUserLimit) { int userLimit = settingsCache->value("security/max_users_tcp", 500).toInt(); - int playerCount = (databaseInterface->getActiveUserCount(getConnectionType()) + 1); + int playerCount = (server->getTCPUserCount() + 1); if (playerCount > userLimit){ std::cerr << "Max Tcp Users Limit Reached, please increase the max_users_tcp setting." << std::endl; logger->logMessage(QString("Max Tcp Users Limit Reached, please increase the max_users_tcp setting."), this); @@ -1313,7 +1313,7 @@ bool WebsocketServerSocketInterface::initWebsocketSession() bool enforceUserLimit = settingsCache->value("security/enable_max_user_limit", false).toBool(); if (enforceUserLimit) { int userLimit = settingsCache->value("security/max_users_websocket", 500).toInt(); - int playerCount = (databaseInterface->getActiveUserCount(getConnectionType()) + 1); + int playerCount = (server->getWebSocketUserCount() + 1); if (playerCount > userLimit){ std::cerr << "Max Websocket Users Limit Reached, please increase the max_users_websocket setting." << std::endl; logger->logMessage(QString("Max Websocket Users Limit Reached, please increase the max_users_websocket setting."), this);