Removed Client cleanup.
Modified server monitor process handling.
This commit is contained in:
parent
6904f9cf3d
commit
ea320e7f5b
@ -227,6 +227,7 @@ public class CoreClientManager implements Listener
|
||||
}, name, rank, perm);
|
||||
}
|
||||
|
||||
/*
|
||||
@EventHandler
|
||||
public void cleanGlitchedClients(UpdateEvent event)
|
||||
{
|
||||
@ -249,4 +250,5 @@ public class CoreClientManager implements Listener
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
@ -29,7 +29,7 @@ public class GroupStatusData
|
||||
// Lobby joinable checking
|
||||
if (serverStatusData.Motd.isEmpty() || serverStatusData.Motd.equals(""))
|
||||
{
|
||||
if (serverStatusData.Players / serverStatusData.MaxPlayers < .9)
|
||||
if (serverStatusData.Players / serverStatusData.MaxPlayers < 10)
|
||||
_joinableCount++;
|
||||
}
|
||||
else
|
||||
|
@ -20,7 +20,7 @@ public class Repository
|
||||
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.privateAddress, '%') 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), privateAddress VARCHAR(256), US BOOLEAN NOT NULL DEFAULT 'true', PRIMARY KEY (id));";
|
||||
private static String RETRIEVE_AVAILABLE_SERVERS = "SELECT DynamicServers.serverName, DynamicServers.address, DynamicServers.privateAddress, DynamicServers.US, DynamicServers.availableCpu, DynamicServers.availableRam, 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_AVAILABLE_SERVERS = "SELECT DynamicServers.serverName, DynamicServers.address, DynamicServers.privateAddress, DynamicServers.US, DynamicServers.availableCpu, DynamicServers.availableRam, ServerStatus.serverGroup, COUNT(*) As serverCount FROM DynamicServers LEFT JOIN ServerStatus ON ServerStatus.address LIKE CONCAT(DynamicServers.privateAddress, '%') 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.privateAddress, '%') 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 = ?;";
|
||||
|
@ -1,17 +1,18 @@
|
||||
package mineplex.servermonitor;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.InputStreamReader;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
public class ServerMonitor
|
||||
{
|
||||
private static Repository _repository = new Repository();
|
||||
private static int _count = 0;
|
||||
private static HashSet<ProcessRunner> _processes = new HashSet<ProcessRunner>();
|
||||
|
||||
public static void main (String args[])
|
||||
{
|
||||
@ -19,71 +20,109 @@ public class ServerMonitor
|
||||
|
||||
while (true)
|
||||
{
|
||||
if (_count % 10 == 0)
|
||||
while (_processes.size() > 0)
|
||||
{
|
||||
for (ServerStatusData statusData : _repository.retrieveOldServerStatuses())
|
||||
for (Iterator<ProcessRunner> iterator = _processes.iterator(); iterator.hasNext();)
|
||||
{
|
||||
System.out.println("----Old Server Status----> " + statusData.Address + ", " + statusData.Name);
|
||||
killServer(statusData);
|
||||
//restartServer(statusData);
|
||||
ProcessRunner pr = iterator.next();
|
||||
|
||||
try
|
||||
{
|
||||
pr.join(100);
|
||||
}
|
||||
catch (InterruptedException e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
if (pr.isDone())
|
||||
iterator.remove();
|
||||
}
|
||||
|
||||
List<DynamicServerData> dynamicServers = new ArrayList<DynamicServerData>(_repository.retrieveDynamicServers());
|
||||
Collection<ServerGroupData> serverGroups = _repository.retrieveServerGroups();
|
||||
HashMap<String, GroupStatusData> groupStatusList = _repository.retrieveGroupStatusData();
|
||||
|
||||
for (ServerGroupData serverGroup : serverGroups)
|
||||
try
|
||||
{
|
||||
if (!groupStatusList.containsKey(serverGroup.Name))
|
||||
{
|
||||
groupStatusList.put(serverGroup.Name, new GroupStatusData());
|
||||
}
|
||||
System.out.println("Sleeping while processes run...");
|
||||
Thread.sleep(6000);
|
||||
}
|
||||
catch (InterruptedException e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
GroupStatusData groupStatus = groupStatusList.get(serverGroup.Name);
|
||||
if (_count >= 10)
|
||||
{
|
||||
System.out.println("Killing stale processes.");
|
||||
|
||||
|
||||
|
||||
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)
|
||||
for (Iterator<ProcessRunner> iterator = _processes.iterator(); iterator.hasNext();)
|
||||
{
|
||||
int serverNum = groupStatus.getNextServerNumber();
|
||||
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;
|
||||
}
|
||||
|
||||
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);
|
||||
iterator.next().abort();
|
||||
iterator.remove();
|
||||
}
|
||||
}
|
||||
|
||||
_count++;
|
||||
}
|
||||
|
||||
_count = 0;
|
||||
|
||||
for (ServerStatusData statusData : _repository.retrieveOldServerStatuses())
|
||||
{
|
||||
System.out.println("----Old Server Status----> " + statusData.Address + ", " + statusData.Name);
|
||||
killServer(statusData);
|
||||
//restartServer(statusData);
|
||||
}
|
||||
|
||||
List<DynamicServerData> dynamicServers = new ArrayList<DynamicServerData>(_repository.retrieveDynamicServers());
|
||||
Collection<ServerGroupData> serverGroups = _repository.retrieveServerGroups();
|
||||
HashMap<String, GroupStatusData> groupStatusList = _repository.retrieveGroupStatusData();
|
||||
|
||||
for (ServerGroupData serverGroup : serverGroups)
|
||||
{
|
||||
if (!groupStatusList.containsKey(serverGroup.Name))
|
||||
{
|
||||
groupStatusList.put(serverGroup.Name, new GroupStatusData());
|
||||
}
|
||||
|
||||
GroupStatusData groupStatus = groupStatusList.get(serverGroup.Name);
|
||||
|
||||
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;
|
||||
|
||||
serversToAdd--;
|
||||
while (serversToAdd > 0)
|
||||
{
|
||||
int serverNum = groupStatus.getNextServerNumber();
|
||||
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;
|
||||
}
|
||||
|
||||
while (serversToKill > 0)
|
||||
{
|
||||
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--;
|
||||
}
|
||||
System.out.println("[" + bestServer.Name + ":" + bestServer.Address + "] Adding " + serverGroup.Name + " Req Total: " + serverGroup.RequiredTotalServers + " Req Joinable: " + serverGroup.RequiredJoinableServers + " | Actual Total: " + groupStatus.getTotalServers() + " Actual Joinable: " + groupStatus.getJoinableCount());
|
||||
startServer(bestServer, serverGroup, serverNum);
|
||||
|
||||
serversToAdd--;
|
||||
}
|
||||
|
||||
while (serversToKill > 0)
|
||||
{
|
||||
System.out.println("[" + groupStatus.EmptyServers.get(0).Name + ":" + groupStatus.EmptyServers.get(0).Address + "] Killing " + serverGroup.Name + " Req Total: " + serverGroup.RequiredTotalServers + " Req Joinable: " + serverGroup.RequiredJoinableServers + " | Actual Total: " + groupStatus.getTotalServers() + " Actual Joinable: " + groupStatus.getJoinableCount());
|
||||
killServer(groupStatus.EmptyServers.remove(0));
|
||||
serversToKill--;
|
||||
}
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
Thread.sleep(1000);
|
||||
System.out.println("Natural sleep.");
|
||||
Thread.sleep(5000);
|
||||
}
|
||||
catch (InterruptedException e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
_count++;
|
||||
_count %= 10000;
|
||||
}
|
||||
}
|
||||
|
||||
@ -93,8 +132,6 @@ public class ServerMonitor
|
||||
|
||||
for (DynamicServerData serverData : dynamicServers)
|
||||
{
|
||||
System.out.println("Checking " + serverData.Name + " Cpu:" + serverData.AvailableCPU + " Ram:" + serverData.AvailableRAM);
|
||||
|
||||
if (serverData.AvailableRAM > serverGroup.RequiredRAM && serverData.AvailableCPU > serverGroup.RequiredCPU)
|
||||
{
|
||||
if (bestServer == null)
|
||||
@ -118,116 +155,82 @@ public class ServerMonitor
|
||||
private static void restartServer(final ServerStatusData serverToKill)
|
||||
{
|
||||
String cmd = "/home/mineplex/restartServer.sh";
|
||||
Process process = null;
|
||||
|
||||
try
|
||||
{
|
||||
process = new ProcessBuilder(new String[] {"/bin/sh", cmd, serverToKill.Address, serverToKill.Name}).start();
|
||||
|
||||
synchronized (process)
|
||||
{
|
||||
process.wait(1000);
|
||||
}
|
||||
|
||||
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 " + serverToKill.Address + " for " + serverToKill.Name);
|
||||
ProcessRunner pr = new ProcessRunner(new String[] {"/bin/sh", cmd, serverToKill.Address, serverToKill.Name});
|
||||
pr.start(new Runnable()
|
||||
{
|
||||
public void run()
|
||||
{
|
||||
System.out.println("Restart command to " + serverToKill.Address + " for " + serverToKill.Name + " completed");
|
||||
}
|
||||
});
|
||||
|
||||
try
|
||||
{
|
||||
pr.join(500);
|
||||
}
|
||||
catch (InterruptedException e1)
|
||||
{
|
||||
e1.printStackTrace();
|
||||
}
|
||||
|
||||
if (!pr.isDone())
|
||||
_processes.add(pr);
|
||||
}
|
||||
|
||||
private static void killServer(final ServerStatusData serverToKill)
|
||||
{
|
||||
String cmd = "/home/mineplex/easyRemoteKillServer.sh";
|
||||
Process process = null;
|
||||
|
||||
try
|
||||
{
|
||||
process = new ProcessBuilder(new String[] {"/bin/sh", cmd, serverToKill.Address, serverToKill.Name}).start();
|
||||
|
||||
synchronized (process)
|
||||
{
|
||||
process.wait(1000);
|
||||
}
|
||||
|
||||
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);
|
||||
ProcessRunner pr = new ProcessRunner(new String[] {"/bin/sh", cmd, serverToKill.Address, serverToKill.Name});
|
||||
pr.start(new Runnable()
|
||||
{
|
||||
public void run()
|
||||
{
|
||||
_repository.removeServerRecord(serverToKill);
|
||||
System.out.println("Sent kill command to " + serverToKill.Address + " for " + serverToKill.Name + " completed");
|
||||
}
|
||||
});
|
||||
|
||||
try
|
||||
{
|
||||
pr.join(500);
|
||||
}
|
||||
catch (InterruptedException e1)
|
||||
{
|
||||
e1.printStackTrace();
|
||||
}
|
||||
|
||||
|
||||
if (!pr.isDone())
|
||||
_processes.add(pr);
|
||||
}
|
||||
|
||||
private static void startServer(final DynamicServerData serverSpace, final ServerGroupData serverGroup, final int serverNum)
|
||||
{
|
||||
String cmd = "/home/mineplex/easyRemoteStartServer.sh";
|
||||
Process process = null;
|
||||
|
||||
try
|
||||
{
|
||||
process = new ProcessBuilder(new String[] {"/bin/sh", cmd, serverSpace.Address, serverSpace.PrivateAddress, serverGroup.ScriptName, serverGroup.Prefix + "-" + serverNum, "1", serverSpace.US ? "us" : "eu"}).start();
|
||||
|
||||
synchronized (process)
|
||||
{
|
||||
process.wait(1000);
|
||||
}
|
||||
|
||||
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 (" + serverSpace.Address + "," + serverGroup.ScriptName + "," + serverGroup.Prefix + "-" + serverNum + ", 1," + (serverSpace.US ? "us" : "eu") + ")");
|
||||
ProcessRunner pr = new ProcessRunner(new String[] {"/bin/sh", cmd, serverSpace.Address, serverSpace.PrivateAddress, serverGroup.ScriptName, serverGroup.Prefix + "-" + serverNum, "1", serverSpace.US ? "us" : "eu"});
|
||||
pr.start(new Runnable()
|
||||
{
|
||||
public void run()
|
||||
{
|
||||
serverSpace.setServerGroupCount(serverGroup, serverSpace.ServerGroupCount.containsKey(serverGroup.Name) ? (serverSpace.ServerGroupCount.get(serverGroup.Name) + 1) : 1);
|
||||
System.out.println("Start command (" + serverSpace.Address + "," + serverGroup.ScriptName + "," + serverGroup.Prefix + "-" + serverNum + ", 1," + (serverSpace.US ? "us" : "eu") + ") completed");
|
||||
}
|
||||
});
|
||||
|
||||
try
|
||||
{
|
||||
pr.join(500);
|
||||
}
|
||||
catch (InterruptedException e1)
|
||||
{
|
||||
e1.printStackTrace();
|
||||
}
|
||||
|
||||
|
||||
if (!pr.isDone())
|
||||
_processes.add(pr);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user