From cae10fe7b41dae47c75407d2570f04ed23e40701 Mon Sep 17 00:00:00 2001 From: Jonathan Williams Date: Fri, 8 Nov 2013 10:52:56 -0800 Subject: [PATCH] Fixes to DynamicServer Monitor Fixed SSM disguise clunky movement. --- .../bungee/lobbyBalancer/LobbyBalancer.java | 2 +- .../playerCount/PlayerCountRepository.java | 1 + .../core/disguise/DisguiseManager.java | 8 +- .../core/status/ServerStatusRepository.java | 2 + .../servermonitor/GroupStatusData.java | 22 +- .../mineplex/servermonitor/Repository.java | 50 +++- .../mineplex/servermonitor/ServerMonitor.java | 221 ++++++++---------- 7 files changed, 171 insertions(+), 135 deletions(-) diff --git a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/lobbyBalancer/LobbyBalancer.java b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/lobbyBalancer/LobbyBalancer.java index f019ad137..568a0fc65 100644 --- a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/lobbyBalancer/LobbyBalancer.java +++ b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/lobbyBalancer/LobbyBalancer.java @@ -27,7 +27,7 @@ public class LobbyBalancer implements Listener, Runnable { _plugin = plugin; _repository = new LobbyBalancerRepository(); - _repository.initialize(true); + _repository.initialize(false); loadLobbyServers(); diff --git a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerCount/PlayerCountRepository.java b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerCount/PlayerCountRepository.java index fdfac5111..dccb1be82 100644 --- a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerCount/PlayerCountRepository.java +++ b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerCount/PlayerCountRepository.java @@ -74,6 +74,7 @@ public class PlayerCountRepository throw new SQLException("Creating bungee server failed, no rows affected."); } + resultSet.close(); resultSet = preparedStatementInsert.getGeneratedKeys(); if (resultSet.next()) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/disguise/DisguiseManager.java b/Plugins/Mineplex.Core/src/mineplex/core/disguise/DisguiseManager.java index dabc7d0f5..239a98c90 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/disguise/DisguiseManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/disguise/DisguiseManager.java @@ -390,7 +390,7 @@ public class DisguiseManager extends MiniPlugin implements IPacketRunnable _movePacketMap.put(movePacket.a, velocityPacket); - //XXX packetList.forceAdd(velocityPacket); + packetList.forceAdd(velocityPacket); if (_goingUp.contains(movePacket.a) && movePacket.c != 0 && movePacket.c > 20) { @@ -398,7 +398,7 @@ public class DisguiseManager extends MiniPlugin implements IPacketRunnable { public void run() { - //XXX packetList.forceAdd(velocityPacket); + packetList.forceAdd(velocityPacket); } }); } @@ -437,7 +437,7 @@ public class DisguiseManager extends MiniPlugin implements IPacketRunnable _movePacketMap.put(movePacket.a, velocityPacket); - //XXX packetList.forceAdd(velocityPacket); + packetList.forceAdd(velocityPacket); if (_goingUp.contains(movePacket.a) && movePacket.c != 0 && movePacket.c > 20) { @@ -445,7 +445,7 @@ public class DisguiseManager extends MiniPlugin implements IPacketRunnable { public void run() { - //XXX packetList.forceAdd(velocityPacket); + packetList.forceAdd(velocityPacket); } }); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/status/ServerStatusRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/status/ServerStatusRepository.java index e893088d7..922ae3241 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/status/ServerStatusRepository.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/status/ServerStatusRepository.java @@ -88,6 +88,8 @@ public class ServerStatusRepository throw new SQLException("Creating server status failed, no rows affected."); } + resultSet.close(); + resultSet = preparedStatementInsert.getGeneratedKeys(); if (resultSet.next()) diff --git a/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/GroupStatusData.java b/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/GroupStatusData.java index f40d77f5b..02c65cb6b 100644 --- a/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/GroupStatusData.java +++ b/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/GroupStatusData.java @@ -1,18 +1,21 @@ package mineplex.servermonitor; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; public class GroupStatusData { + private int _serverNum = 0; private int _totalCount = 0; private int _joinableCount = 0; public int Players; public int MaxPlayers; + public int MaxServerNumber; public List EmptyServers = new ArrayList(); - public List Servers = new ArrayList(); + public HashMap Servers = new HashMap(); public void addServer(ServerStatusData serverStatusData) { @@ -43,7 +46,7 @@ public class GroupStatusData EmptyServers.add(serverStatusData); } - Servers.add(serverStatusData); + Servers.put(Integer.parseInt(serverStatusData.Name.split("-")[1]), serverStatusData); } public int getTotalServers() @@ -55,4 +58,19 @@ public class GroupStatusData { return _joinableCount; } + + public int getNextServerNumber() + { + _serverNum++; + + while (true) + { + if (!Servers.containsKey(_serverNum)) + { + return _serverNum; + } + + _serverNum++; + } + } } diff --git a/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/Repository.java b/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/Repository.java index 72755e003..6076489f3 100644 --- a/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/Repository.java +++ b/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/Repository.java @@ -17,13 +17,13 @@ public class Repository private String _password = "y2D4atu3Pene2asw"; private static String CREATE_TABLE = "CREATE TABLE IF NOT EXISTS ServerStatus (id INT NOT NULL AUTO_INCREMENT, serverName VARCHAR(256), serverGroup VARCHAR(256), address VARCHAR(256), updated LONG, lastTimeWithPlayers LONG, motd VARCHAR(256), players INT, maxPlayers INT, tps INT, ram INT, maxRam INT, PRIMARY KEY (id));"; - private static String RETRIEVE_OLD_SERVER_STATUSES = "SELECT serverName, address, motd, players, maxPlayers FROM ServerStatus WHERE TIME_TO_SEC(TIMEDIFF(now(), ServerStatus.updated)) > 10;"; + private static String RETRIEVE_OLD_SERVER_STATUSES = "SELECT ServerStatus.serverName, ServerStatus.address, motd, players, maxPlayers FROM ServerStatus INNER JOIN DynamicServers ON ServerStatus.address LIKE CONCAT(DynamicServers.address, '%') WHERE DynamicServers.US = false AND TIME_TO_SEC(TIMEDIFF(now(), ServerStatus.updated)) > 10;"; private static String CREATE_DYNAMIC_TABLE = "CREATE TABLE IF NOT EXISTS DynamicServers (id INT NOT NULL AUTO_INCREMENT, serverName VARCHAR(256), address VARCHAR(256), US BOOLEAN NOT NULL DEFAULT 'true', PRIMARY KEY (id));"; private static String RETRIEVE_AVAILABLE_SERVERS = "SELECT DynamicServers.serverName, DynamicServers.address, DynamicServers.US, ServerStatus.serverGroup, COUNT(*) As serverCount FROM DynamicServers LEFT JOIN ServerStatus ON ServerStatus.address LIKE CONCAT(DynamicServers.address, '%') WHERE DynamicServers.US = false GROUP BY DynamicServers.address, ServerStatus.serverGroup;"; private static String RETRIEVE_SERVERGROUP_STATUSES = "SELECT ServerStatus.serverName, serverGroup, motd, ServerStatus.address, players, maxPlayers, case when TIME_TO_SEC(TIMEDIFF(now(), ServerStatus.lastTimeWithPlayers)) > 300 then 1 else 0 end as empty FROM ServerStatus INNER JOIN DynamicServers ON ServerStatus.address LIKE CONCAT(DynamicServers.address, '%') WHERE DynamicServers.US = false AND TIME_TO_SEC(TIMEDIFF(now(), ServerStatus.updated)) <= 10"; private static String RETRIEVE_SERVER_GROUP_DATA = "SELECT groupName, prefix, scriptName, requiredRam, cpuRequired, requiredTotal, requiredJoinable FROM ServerGroups;"; - + private static String DELETE_SERVER_STATUS = "DELETE FROM ServerStatus WHERE address = ? AND serverName = ?;"; public void initialize() { @@ -448,4 +448,50 @@ public class Repository return serverGroupMap.values(); } + + public void removeServerRecord(ServerStatusData serverToKill) + { + Connection connection = null; + PreparedStatement preparedStatement = null; + + try + { + connection = DriverManager.getConnection(_connectionString, _userName, _password); + + preparedStatement = connection.prepareStatement(DELETE_SERVER_STATUS); + preparedStatement.setString(1, serverToKill.Address + ":" + serverToKill.Port); + preparedStatement.setString(2, serverToKill.Name); + preparedStatement.execute(); + } + catch (Exception exception) + { + exception.printStackTrace(); + } + finally + { + if (preparedStatement != null) + { + try + { + preparedStatement.close(); + } + catch (SQLException e) + { + e.printStackTrace(); + } + } + + if (connection != null) + { + try + { + connection.close(); + } + catch (SQLException e) + { + e.printStackTrace(); + } + } + } + } } diff --git a/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/ServerMonitor.java b/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/ServerMonitor.java index 8122c2256..63618d27c 100644 --- a/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/ServerMonitor.java +++ b/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/ServerMonitor.java @@ -7,8 +7,6 @@ import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; -import java.util.Map.Entry; - public class ServerMonitor { @@ -21,55 +19,20 @@ public class ServerMonitor while (true) { - /* - if (_count % 20 == 0) + if (_count % 10 == 0) { for (ServerStatusData statusData : _repository.retrieveOldServerStatuses()) { - String key = statusData.Address + " " + statusData.Name; - - String cmd = "/home/mineplex/restartServer.sh"; - Process process = null; - - try - { - process = new ProcessBuilder(new String[] {"/bin/sh", "-x", cmd, statusData.Address, statusData.Name}).start(); - process.waitFor(); - BufferedReader reader=new BufferedReader(new InputStreamReader(process.getInputStream())); - String line = reader.readLine(); - - while(line != null) - { - System.out.println(line); - line=reader.readLine(); - } - } - catch (Exception e) - { - e.printStackTrace(); - } - finally - { - if (process != null) - { - process.destroy(); - } - } - - System.out.println("Sent restart command to " + key + ""); + System.out.println("----Old Server Status----"); + killServer(statusData); } - } - */ - if (_count % 10 == 0) - { + List dynamicServers = new ArrayList(_repository.retrieveDynamicServers()); Collection serverGroups = _repository.retrieveServerGroups(); HashMap groupStatusList = _repository.retrieveGroupStatusData(); for (ServerGroupData serverGroup : serverGroups) { - System.out.println("Checking Server Group " + serverGroup.Name); - if (!groupStatusList.containsKey(serverGroup.Name)) { groupStatusList.put(serverGroup.Name, new GroupStatusData()); @@ -77,94 +40,34 @@ public class ServerMonitor GroupStatusData groupStatus = groupStatusList.get(serverGroup.Name); - int serversToAdd = Math.max(serverGroup.RequiredTotalServers - groupStatus.getTotalServers(), serverGroup.RequiredJoinableServers - groupStatus.getJoinableCount()); - int serversToKill = groupStatus.EmptyServers.size() - serverGroup.RequiredJoinableServers; - int serverNum = groupStatus.getTotalServers() + 1; - if (serversToAdd > 0) + + int serversToAdd = Math.max(serverGroup.RequiredTotalServers - groupStatus.getTotalServers(), serverGroup.RequiredJoinableServers - groupStatus.getJoinableCount()); + int serversToKill = (groupStatus.getTotalServers() > serverGroup.RequiredTotalServers && groupStatus.getJoinableCount() > serverGroup.RequiredJoinableServers) ? Math.min(groupStatus.getJoinableCount() - serverGroup.RequiredJoinableServers, groupStatus.EmptyServers.size()) : 0; + + while (serversToAdd > 0) { - while (serversToAdd > 0) + int serverNum = groupStatus.getNextServerNumber(); + Collections.sort(dynamicServers, new DynamicServerSorter()); + DynamicServerData bestServer = getBestDynamicServer(dynamicServers, serverGroup); + + if (bestServer == null) { - Collections.sort(dynamicServers, new DynamicServerSorter()); - DynamicServerData bestServer = getBestDynamicServer(dynamicServers, serverGroup); - - if (bestServer == null) - { - System.out.println("No best dynamic server available for group " + serverGroup.Name); - break; - } - - String cmd = "/home/mineplex/easyRemoteStartServer.sh"; - Process process = null; - - try - { - process = new ProcessBuilder(new String[] {"/bin/sh", "-x", cmd, bestServer.Address, serverGroup.ScriptName, serverGroup.Prefix + "-" + serverNum, "1", bestServer.US + ""}).start(); - process.waitFor(); - BufferedReader reader=new BufferedReader(new InputStreamReader(process.getInputStream())); - String line = reader.readLine(); - - while(line != null) - { - System.out.println(line); - line=reader.readLine(); - } - } - catch (Exception e) - { - e.printStackTrace(); - } - finally - { - if (process != null) - { - process.destroy(); - } - } - - bestServer.setServerGroupCount(serverGroup, bestServer.ServerGroupCount.containsKey(serverGroup.Name) ? (bestServer.ServerGroupCount.get(serverGroup.Name) + 1) : 1); - System.out.println("Sent start command to " + bestServer.Address + " for " + serverGroup.Prefix + "-" + (groupStatus.getTotalServers() + 1)); - serversToAdd--; - serverNum++; + System.out.println("No best dynamic server available for group " + serverGroup.Name); + break; } + + System.out.println("Adding server for Server Group " + serverGroup.Name + " Req Total: " + serverGroup.RequiredTotalServers + " Req Joinable: " + serverGroup.RequiredJoinableServers + " | Actual Total: " + groupStatus.getTotalServers() + " Actual Joinable: " + groupStatus.getJoinableCount()); + startServer(bestServer, serverGroup, serverNum); + + serversToAdd--; } - else if (serversToKill > 0) + + while (serversToKill > 0) { - while (serversToKill > 0) - { - String cmd = "/home/mineplex/easyRemoteKillServer.sh"; - Process process = null; - - ServerStatusData serverToKill = groupStatus.EmptyServers.get(0); - - try - { - process = new ProcessBuilder(new String[] {"/bin/sh", "-x", cmd, serverToKill.Address, serverToKill.Name}).start(); - process.waitFor(); - BufferedReader reader=new BufferedReader(new InputStreamReader(process.getInputStream())); - String line = reader.readLine(); - - while(line != null) - { - System.out.println(line); - line=reader.readLine(); - } - } - catch (Exception e) - { - e.printStackTrace(); - } - finally - { - if (process != null) - { - process.destroy(); - } - } - - System.out.println("Sent start command to " + serverToKill.Address + " for " + serverToKill.Name); - serversToKill--; - } + System.out.println("Killing excess server for Server Group " + serverGroup.Name + " Req Total: " + serverGroup.RequiredTotalServers + " Req Joinable: " + serverGroup.RequiredJoinableServers + " | Actual Total: " + groupStatus.getTotalServers() + " Actual Joinable: " + groupStatus.getJoinableCount()); + killServer(groupStatus.EmptyServers.get(0)); + serversToKill--; } } } @@ -179,7 +82,7 @@ public class ServerMonitor } _count++; - _count %= 20; + _count %= 10000; } } @@ -189,8 +92,6 @@ public class ServerMonitor for (DynamicServerData serverData : dynamicServers) { - System.out.println("Checking Dynamic Server " + serverData.Name); - if (serverData.AvailableRAM > serverGroup.RequiredRAM && serverData.AvailableCPU > serverGroup.RequiredCPU) { if (bestServer == null) @@ -210,4 +111,72 @@ public class ServerMonitor return bestServer; } + + private static void killServer(ServerStatusData serverToKill) + { + String cmd = "/home/mineplex/easyRemoteKillServer.sh"; + Process process = null; + + try + { + process = new ProcessBuilder(new String[] {"/bin/sh", "-x", cmd, serverToKill.Address, serverToKill.Name}).start(); + process.waitFor(); + BufferedReader reader=new BufferedReader(new InputStreamReader(process.getInputStream())); + String line = reader.readLine(); + + while(line != null) + { + System.out.println(line); + line=reader.readLine(); + } + } + catch (Exception e) + { + e.printStackTrace(); + } + finally + { + if (process != null) + { + process.destroy(); + } + } + + _repository.removeServerRecord(serverToKill); + System.out.println("Sent kill command to " + serverToKill.Address + " for " + serverToKill.Name); + } + + private static void startServer(DynamicServerData serverSpace, ServerGroupData serverGroup, int serverNum) + { + String cmd = "/home/mineplex/easyRemoteStartServer.sh"; + Process process = null; + + try + { + process = new ProcessBuilder(new String[] {"/bin/sh", cmd, serverSpace.Address, serverGroup.ScriptName, serverGroup.Prefix + "-" + serverNum, "1", serverSpace.US ? "us" : "eu"}).start(); + process.waitFor(); + BufferedReader reader=new BufferedReader(new InputStreamReader(process.getInputStream())); + String line = reader.readLine(); + + while(line != null) + { + System.out.println(line); + line=reader.readLine(); + } + } + catch (Exception e) + { + e.printStackTrace(); + } + finally + { + if (process != null) + { + process.destroy(); + } + } + + serverSpace.setServerGroupCount(serverGroup, serverSpace.ServerGroupCount.containsKey(serverGroup.Name) ? (serverSpace.ServerGroupCount.get(serverGroup.Name) + 1) : 1); + System.out.println("Sent start command to " + serverSpace.Name + " for " + serverGroup.Prefix + "-" + serverNum); + } }