Refactored statmanager to only upload stats on disconnect and only one player per tick.
Fixed derp json crap with redis treating a name with only numbers as a number and adding .0 on it.
This commit is contained in:
parent
2a29def670
commit
cc06b0ad33
@ -22,10 +22,11 @@ public class ServerConfiguration extends MiniPlugin
|
|||||||
super("Server Configuration", plugin);
|
super("Server Configuration", plugin);
|
||||||
|
|
||||||
Region region = plugin.getConfig().getBoolean("serverstatus.us") ? Region.US : Region.EU;
|
Region region = plugin.getConfig().getBoolean("serverstatus.us") ? Region.US : Region.EU;
|
||||||
|
String groupName = plugin.getConfig().getString("serverstatus.group").replace(".0", "");
|
||||||
|
|
||||||
for (ServerGroup serverGroup : ServerManager.getServerRepository(region).getServerGroups(null))
|
for (ServerGroup serverGroup : ServerManager.getServerRepository(region).getServerGroups(null))
|
||||||
{
|
{
|
||||||
if (serverGroup.getName().equalsIgnoreCase(plugin.getConfig().getString("serverstatus.group")))
|
if (serverGroup.getName().equalsIgnoreCase(groupName))
|
||||||
{
|
{
|
||||||
_serverGroup = serverGroup;
|
_serverGroup = serverGroup;
|
||||||
break;
|
break;
|
||||||
|
@ -2,6 +2,7 @@ package mineplex.core.stats;
|
|||||||
|
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
@ -22,7 +23,7 @@ public class StatsManager extends MiniDbClientPlugin<PlayerStats>
|
|||||||
private StatsRepository _repository;
|
private StatsRepository _repository;
|
||||||
|
|
||||||
private NautHashMap<String, Integer> _stats = new NautHashMap<String, Integer>();
|
private NautHashMap<String, Integer> _stats = new NautHashMap<String, Integer>();
|
||||||
private NautHashMap<String, NautHashMap<String, Integer>> _statUploadQueue = new NautHashMap<String, NautHashMap<String, Integer>>();
|
private NautHashMap<Player, NautHashMap<String, Integer>> _statUploadQueue = new NautHashMap<Player, NautHashMap<String, Integer>>();
|
||||||
private Runnable _saveRunnable;
|
private Runnable _saveRunnable;
|
||||||
|
|
||||||
public StatsManager(JavaPlugin plugin, CoreClientManager clientManager)
|
public StatsManager(JavaPlugin plugin, CoreClientManager clientManager)
|
||||||
@ -41,7 +42,7 @@ public class StatsManager extends MiniDbClientPlugin<PlayerStats>
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
plugin.getServer().getScheduler().runTaskTimerAsynchronously(plugin, _saveRunnable, 40L, 40L);
|
plugin.getServer().getScheduler().runTaskTimerAsynchronously(plugin, _saveRunnable, 1L, 1L);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Stat stat : _repository.retrieveStats())
|
for (Stat stat : _repository.retrieveStats())
|
||||||
@ -50,80 +51,13 @@ public class StatsManager extends MiniDbClientPlugin<PlayerStats>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void incrementStat(Player player, final String statName, final int value)
|
public void incrementStat(final Player player, final String statName, final int value)
|
||||||
{
|
{
|
||||||
int newValue = Get(player).addStat(statName, value);
|
int newValue = Get(player).addStat(statName, value);
|
||||||
|
|
||||||
//Event
|
//Event
|
||||||
UtilServer.getServer().getPluginManager().callEvent(new StatChangeEvent(player.getName(), statName, newValue - value, newValue));
|
UtilServer.getServer().getPluginManager().callEvent(new StatChangeEvent(player.getName(), statName, newValue - value, newValue));
|
||||||
|
|
||||||
final String uuidString = player.getUniqueId().toString();
|
|
||||||
|
|
||||||
incrementStat(uuidString, statName, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void addToQueue(String statName, String uuidString, int value)
|
|
||||||
{
|
|
||||||
if (!_statUploadQueue.containsKey(uuidString))
|
|
||||||
{
|
|
||||||
_statUploadQueue.put(uuidString, new NautHashMap<String, Integer>());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!_statUploadQueue.get(uuidString).containsKey(statName))
|
|
||||||
{
|
|
||||||
_statUploadQueue.get(uuidString).put(statName, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
_statUploadQueue.get(uuidString).put(statName, value);
|
|
||||||
System.out.println("added to stat upload queue.");
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void saveStats()
|
|
||||||
{
|
|
||||||
if (_statUploadQueue.isEmpty())
|
|
||||||
return;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
NautHashMap<String, NautHashMap<Integer, Integer>> uploadQueue = new NautHashMap<String, NautHashMap<Integer, Integer>>();
|
|
||||||
|
|
||||||
synchronized (_statSync)
|
|
||||||
{
|
|
||||||
for (String key : _statUploadQueue.keySet())
|
|
||||||
{
|
|
||||||
uploadQueue.put(key, new NautHashMap<Integer, Integer>());
|
|
||||||
|
|
||||||
for (String statName : _statUploadQueue.get(key).keySet())
|
|
||||||
{
|
|
||||||
int statId = _stats.get(statName);
|
|
||||||
uploadQueue.get(key).put(statId, _statUploadQueue.get(key).get(statName));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_statUploadQueue.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
_repository.saveStats(uploadQueue);
|
|
||||||
}
|
|
||||||
catch (Exception exception)
|
|
||||||
{
|
|
||||||
exception.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected PlayerStats AddPlayer(String player)
|
|
||||||
{
|
|
||||||
return new PlayerStats();
|
|
||||||
}
|
|
||||||
|
|
||||||
public PlayerStats getOfflinePlayerStats(String playerName) throws SQLException
|
|
||||||
{
|
|
||||||
return _repository.loadOfflinePlayerStats(playerName);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void incrementStat(final String uuidString, final String statName, final int value)
|
|
||||||
{
|
|
||||||
// Verify stat is in our local cache, if not add it remotely.
|
// Verify stat is in our local cache, if not add it remotely.
|
||||||
if (!_stats.containsKey(statName))
|
if (!_stats.containsKey(statName))
|
||||||
{
|
{
|
||||||
@ -138,7 +72,7 @@ public class StatsManager extends MiniDbClientPlugin<PlayerStats>
|
|||||||
// Then it pops into queue and forgets adding the new stat to db.
|
// Then it pops into queue and forgets adding the new stat to db.
|
||||||
if (_stats.containsKey(statName))
|
if (_stats.containsKey(statName))
|
||||||
{
|
{
|
||||||
addToQueue(statName, uuidString, value);
|
addToQueue(statName, player, value);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -151,7 +85,7 @@ public class StatsManager extends MiniDbClientPlugin<PlayerStats>
|
|||||||
_stats.put(stat.Name, stat.Id);
|
_stats.put(stat.Name, stat.Id);
|
||||||
}
|
}
|
||||||
|
|
||||||
addToQueue(statName, uuidString, value);
|
addToQueue(statName, player, value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -160,10 +94,100 @@ public class StatsManager extends MiniDbClientPlugin<PlayerStats>
|
|||||||
{
|
{
|
||||||
synchronized (_statSync)
|
synchronized (_statSync)
|
||||||
{
|
{
|
||||||
addToQueue(statName, uuidString, value);
|
addToQueue(statName, player, value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void addToQueue(String statName, Player player, int value)
|
||||||
|
{
|
||||||
|
if (!_statUploadQueue.containsKey(player))
|
||||||
|
{
|
||||||
|
_statUploadQueue.put(player, new NautHashMap<String, Integer>());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!_statUploadQueue.get(player).containsKey(statName))
|
||||||
|
{
|
||||||
|
_statUploadQueue.get(player).put(statName, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
_statUploadQueue.get(player).put(statName, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void saveStats()
|
||||||
|
{
|
||||||
|
if (_statUploadQueue.isEmpty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
NautHashMap<String, NautHashMap<Integer, Integer>> uploadQueue = new NautHashMap<String, NautHashMap<Integer, Integer>>();
|
||||||
|
|
||||||
|
synchronized (_statSync)
|
||||||
|
{
|
||||||
|
for (Iterator<Player> statIterator = _statUploadQueue.keySet().iterator(); statIterator.hasNext();)
|
||||||
|
{
|
||||||
|
Player player = statIterator.next();
|
||||||
|
|
||||||
|
if (player.isOnline())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
String uploadKey = player.getUniqueId().toString();
|
||||||
|
|
||||||
|
uploadQueue.put(uploadKey, new NautHashMap<Integer, Integer>());
|
||||||
|
|
||||||
|
for (String statName : _statUploadQueue.get(player).keySet())
|
||||||
|
{
|
||||||
|
int statId = _stats.get(statName);
|
||||||
|
uploadQueue.get(uploadKey).put(statId, _statUploadQueue.get(player).get(statName));
|
||||||
|
System.out.println(player.getName() + " saving stat : " + statName + " adding " + _statUploadQueue.get(player).get(statName));
|
||||||
|
}
|
||||||
|
|
||||||
|
statIterator.remove();
|
||||||
|
|
||||||
|
// Only process one player per tick/call.
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_repository.saveStats(uploadQueue);
|
||||||
|
}
|
||||||
|
catch (Exception exception)
|
||||||
|
{
|
||||||
|
exception.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean incrementStat(final String uuidString, final String statName, final int value)
|
||||||
|
{
|
||||||
|
if (_stats.containsKey(statName))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
final NautHashMap<String, NautHashMap<Integer, Integer>> uploadQueue = new NautHashMap<String, NautHashMap<Integer, Integer>>();
|
||||||
|
uploadQueue.put(uuidString, new NautHashMap<Integer, Integer>());
|
||||||
|
uploadQueue.get(uuidString).put(_stats.get(statName), value);
|
||||||
|
|
||||||
|
runAsync(new Runnable()
|
||||||
|
{
|
||||||
|
public void run()
|
||||||
|
{
|
||||||
|
_repository.saveStats(uploadQueue);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected PlayerStats AddPlayer(String player)
|
||||||
|
{
|
||||||
|
return new PlayerStats();
|
||||||
|
}
|
||||||
|
|
||||||
|
public PlayerStats getOfflinePlayerStats(String playerName) throws SQLException
|
||||||
|
{
|
||||||
|
return _repository.loadOfflinePlayerStats(playerName);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void AddCommands()
|
public void AddCommands()
|
||||||
|
@ -152,7 +152,7 @@ public class ServerStatusManager extends MiniPlugin
|
|||||||
int tps = (int) _lagMeter.getTicksPerSecond();
|
int tps = (int) _lagMeter.getTicksPerSecond();
|
||||||
String address = Bukkit.getServer().getIp().isEmpty() ? "localhost" : Bukkit.getServer().getIp();
|
String address = Bukkit.getServer().getIp().isEmpty() ? "localhost" : Bukkit.getServer().getIp();
|
||||||
int port = _plugin.getServer().getPort();
|
int port = _plugin.getServer().getPort();
|
||||||
String group = _plugin.getConfig().getString("serverstatus.group");
|
String group = _plugin.getConfig().getString("serverstatus.group") + "";
|
||||||
int ram = (int) ((Runtime.getRuntime().maxMemory() - Runtime.getRuntime().freeMemory()) / 1048576);
|
int ram = (int) ((Runtime.getRuntime().maxMemory() - Runtime.getRuntime().freeMemory()) / 1048576);
|
||||||
int maxRam = (int) (Runtime.getRuntime().maxMemory() / 1048576);
|
int maxRam = (int) (Runtime.getRuntime().maxMemory() / 1048576);
|
||||||
|
|
||||||
|
@ -257,7 +257,7 @@ public class ServerGroup
|
|||||||
|
|
||||||
for (MinecraftServer server : servers)
|
for (MinecraftServer server : servers)
|
||||||
{
|
{
|
||||||
if (_name.equalsIgnoreCase(server.getGroup()))
|
if (_name.equalsIgnoreCase(server.getGroup().replace(".0", "")))
|
||||||
{
|
{
|
||||||
_servers.add(server);
|
_servers.add(server);
|
||||||
}
|
}
|
||||||
|
@ -47,7 +47,7 @@ public class ServerMonitor
|
|||||||
private static Region _region;
|
private static Region _region;
|
||||||
|
|
||||||
private static boolean _debug = false;
|
private static boolean _debug = false;
|
||||||
|
|
||||||
public static void main (String args[])
|
public static void main (String args[])
|
||||||
{
|
{
|
||||||
_region = !new File("eu.dat").exists() ? Region.US : Region.EU;
|
_region = !new File("eu.dat").exists() ? Region.US : Region.EU;
|
||||||
@ -112,6 +112,9 @@ public class ServerMonitor
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double totalCPU = 0.0;
|
||||||
|
double totalRAM = 0.0;
|
||||||
|
|
||||||
if (_count % 15 == 0)
|
if (_count % 15 == 0)
|
||||||
{
|
{
|
||||||
_badServers.clear();
|
_badServers.clear();
|
||||||
@ -123,6 +126,11 @@ public class ServerMonitor
|
|||||||
log("------=[OFFLINE]=------=[" + serverData.getName() + ":" + serverData.getPublicAddress() + "]=------=[OFFLINE]=------");
|
log("------=[OFFLINE]=------=[" + serverData.getName() + ":" + serverData.getPublicAddress() + "]=------=[OFFLINE]=------");
|
||||||
_badServers.put(serverData.getName(), true);
|
_badServers.put(serverData.getName(), true);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
totalCPU += serverData.getAvailableCpu();
|
||||||
|
totalRAM += serverData.getAvailableRam();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
log(_badServers.size() + " bad servers.");
|
log(_badServers.size() + " bad servers.");
|
||||||
@ -155,6 +163,14 @@ public class ServerMonitor
|
|||||||
serverMap.put(serverNum, server);
|
serverMap.put(serverNum, server);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
if (groupStatus.getHost() == null || groupStatus.getHost().isEmpty())
|
||||||
|
{
|
||||||
|
int serverCount = groupStatus.getServers().size();
|
||||||
|
log(groupStatus.getName() + " : " + groupStatus.getPlayerCount() + " players on " + serverCount + " servers " + String.format("%.2f", ((double)serverCount * (double)groupStatus.getRequiredCpu() / totalCPU)) + "% CPU," + String.format("%.2f", ((double)serverCount * (double)groupStatus.getRequiredRam() / totalRAM)) + "% RAM", true);
|
||||||
|
}
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
HashSet<String> onlineServers = new HashSet<String>();
|
HashSet<String> onlineServers = new HashSet<String>();
|
||||||
@ -418,7 +434,7 @@ public class ServerMonitor
|
|||||||
boolean success = false;
|
boolean success = false;
|
||||||
|
|
||||||
if (_debug)
|
if (_debug)
|
||||||
return true;
|
return false;
|
||||||
|
|
||||||
Process process = null;
|
Process process = null;
|
||||||
String cmd = "/home/mineplex/isServerOnline.sh";
|
String cmd = "/home/mineplex/isServerOnline.sh";
|
||||||
@ -515,8 +531,15 @@ public class ServerMonitor
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static void log(String message)
|
private static void log(String message)
|
||||||
|
{
|
||||||
|
log(message, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void log(String message, boolean fileOnly)
|
||||||
{
|
{
|
||||||
_logger.info("[" + _dateFormat.format(new Date()) + "] " + message);
|
_logger.info("[" + _dateFormat.format(new Date()) + "] " + message);
|
||||||
System.out.println("[" + _dateFormat.format(new Date()) + "] " + message);
|
|
||||||
|
if (!fileOnly)
|
||||||
|
System.out.println("[" + _dateFormat.format(new Date()) + "] " + message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user