From d73ffcccfd56737e09841e7c9c2dd8aff0580cb9 Mon Sep 17 00:00:00 2001 From: Jonathan Williams Date: Mon, 18 Aug 2014 15:46:23 -0400 Subject: [PATCH] Added performance logging in ServerMonitor Added date tracking for gem/coin/account transactions in preparation for Customer Support server. --- .../donation/repository/token/DonorToken.java | 1 + .../repository/token/TransactionToken.java | 9 + .../mineplex/ddos/DDoSProtectionSwitcher.java | 6 +- .../mineplex/ddos/DnsMadeEasyRepository.java | 8 +- .../mineplex/servermonitor/ServerMonitor.java | 25 +- Website/LOC.Core/LOC.Core.csproj | 1 + .../Model/Sales/AccountTransaction.cs | 2 + .../LOC.Core/Model/Sales/CoinTransaction.cs | 2 + .../LOC.Core/Model/Sales/GemTransaction.cs | 2 + .../Tokens/Client/AccountTransactionToken.cs | 26 ++ Website/LOC.Core/Tokens/Client/ClientToken.cs | 2 + Website/LOC.Core/Tokens/Client/DonorToken.cs | 1 + .../Models/AccountAdministrator.cs | 7 +- .../LOC.Website.Web.Publish.xml | 442 +++++++++--------- Website/LOCWebsite.suo | Bin 474624 -> 474624 bytes 15 files changed, 294 insertions(+), 240 deletions(-) create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/donation/repository/token/TransactionToken.java create mode 100644 Website/LOC.Core/Tokens/Client/AccountTransactionToken.cs diff --git a/Plugins/Mineplex.Core/src/mineplex/core/donation/repository/token/DonorToken.java b/Plugins/Mineplex.Core/src/mineplex/core/donation/repository/token/DonorToken.java index 15888736a..8eec45471 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/donation/repository/token/DonorToken.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/donation/repository/token/DonorToken.java @@ -8,5 +8,6 @@ public class DonorToken public boolean Donated; public List SalesPackages; public List UnknownSalesPackages; + public List Transactions; public int Coins; } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/donation/repository/token/TransactionToken.java b/Plugins/Mineplex.Core/src/mineplex/core/donation/repository/token/TransactionToken.java new file mode 100644 index 000000000..de01b62ef --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/donation/repository/token/TransactionToken.java @@ -0,0 +1,9 @@ +package mineplex.core.donation.repository.token; + +public class TransactionToken +{ + public long Date; + public String SalesPackageName; + public int Gems; + public int Coins; +} diff --git a/Plugins/Mineplex.DDoSProtectionSwitcher/src/mineplex/ddos/DDoSProtectionSwitcher.java b/Plugins/Mineplex.DDoSProtectionSwitcher/src/mineplex/ddos/DDoSProtectionSwitcher.java index af5042bc5..fd22fa8fa 100644 --- a/Plugins/Mineplex.DDoSProtectionSwitcher/src/mineplex/ddos/DDoSProtectionSwitcher.java +++ b/Plugins/Mineplex.DDoSProtectionSwitcher/src/mineplex/ddos/DDoSProtectionSwitcher.java @@ -45,8 +45,8 @@ public class DDoSProtectionSwitcher _repository = new DnsMadeEasyRepository(); DateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss"); - while (true) - { + //while (true) + //{ if (_repository.switchToDDOSProt()) { System.out.println("Starting DDoS Protection Switch at " + dateFormat.format(new Date())); @@ -203,7 +203,7 @@ public class DDoSProtectionSwitcher { e.printStackTrace(); } - } + //} /* * // Switch off ddos protection for (DnsRecord record : records.data) { * if (record.type.equalsIgnoreCase("CNAME")) { if diff --git a/Plugins/Mineplex.DDoSProtectionSwitcher/src/mineplex/ddos/DnsMadeEasyRepository.java b/Plugins/Mineplex.DDoSProtectionSwitcher/src/mineplex/ddos/DnsMadeEasyRepository.java index f3d0edc77..2563df862 100644 --- a/Plugins/Mineplex.DDoSProtectionSwitcher/src/mineplex/ddos/DnsMadeEasyRepository.java +++ b/Plugins/Mineplex.DDoSProtectionSwitcher/src/mineplex/ddos/DnsMadeEasyRepository.java @@ -9,7 +9,8 @@ import java.text.SimpleDateFormat; public class DnsMadeEasyRepository { - private String _connectionString = "jdbc:mysql://db.mineplex.com:3306/BungeeServers?autoReconnect=true&failOverReadOnly=false&maxReconnects=10"; + // Yip Yip actual IP because if null route happens we can't resolve the HOSTNAME DERP FACE DEFEK7!!! -defek7 + private String _connectionString = "jdbc:mysql://10.35.74.133:3306/BungeeServers?autoReconnect=true&failOverReadOnly=false&maxReconnects=10"; private String _userName = "root"; private String _password = "tAbechAk3wR7tuTh"; @@ -119,6 +120,9 @@ public class DnsMadeEasyRepository } } - return countOffline >= 20; + //if (countOffline > 5) + System.out.println(countOffline + " offline bungees."); + + return true; } } diff --git a/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/ServerMonitor.java b/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/ServerMonitor.java index e15d4f4b1..6d9a2918f 100644 --- a/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/ServerMonitor.java +++ b/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/ServerMonitor.java @@ -76,7 +76,7 @@ public class ServerMonitor for (MinecraftServer deadServer : _repository.getDeadServers()) { - killServer(deadServer.getName(), deadServer.getPublicAddress(), true); + killServer(deadServer.getName(), deadServer.getPublicAddress(), "[KILLED] [DEAD] " + deadServer.getName() + ":" + deadServer.getPublicAddress(), true); } List dedicatedServers = new ArrayList(_repository.getDedicatedServers()); @@ -139,11 +139,9 @@ public class ServerMonitor iterator.remove(); else if (System.currentTimeMillis() - entry.getValue().getValue() > 20000) { - System.out.println("-=[SERVER STARTUP TOO SLOW]=- " + entry.getKey()); - String serverName = entry.getKey(); String serverAddress = entry.getValue().getKey(); - killServer(serverName, serverAddress, true); + killServer(serverName, serverAddress, "[KILLED] [SLOW-STARTUP] " + serverName + ":" + serverAddress, true); iterator.remove(); } } @@ -220,7 +218,6 @@ public class ServerMonitor private static void handleGroupChanges(List dedicatedServers, HashMap> serverTracker, ServerGroup serverGroup, boolean free) { int serverNum = 0; - //GroupStatusData groupStatus = groupStatusList.get(serverGroup.Name); int requiredTotal = serverGroup.getRequiredTotalServers(); int requiredJoinable = serverGroup.getRequiredJoinableServers(); int joinableServers = serverGroup.getJoinableCount(); @@ -231,8 +228,12 @@ public class ServerMonitor // Minimum 1500 slot bufferzone if (serverGroup.getName().equalsIgnoreCase("Lobby")) { - if (serverGroup.getMaxPlayerCount() - serverGroup.getPlayerCount() < 1500) - serversToAdd = requiredJoinable; + int availableSlots = serverGroup.getMaxPlayerCount() - serverGroup.getPlayerCount(); + + if (availableSlots < 1500) + serversToAdd = Math.max(1, (1500 / availableSlots) - serverGroup.getMaxPlayers()); + else if (serversToKill > 0) + serversToKill = Math.min(serversToKill, (availableSlots - 1500) / 80); } while (serversToAdd > 0) @@ -262,12 +263,12 @@ public class ServerMonitor { List emptyServers = new ArrayList(serverGroup.getEmptyServers()); MinecraftServer emptyServer = emptyServers.get(serversToKill - 1); - killServer(emptyServer); + killServer(emptyServer, "[KILLED] [EXCESS] " + emptyServer.getName() + ":" + emptyServer.getPublicAddress()); serversToKill--; } } - private static void killServer(final String serverName, final String serverAddress, final boolean announce) + private static void killServer(final String serverName, final String serverAddress, final String message, final boolean announce) { String cmd = "/home/mineplex/easyRemoteKillServer.sh"; @@ -291,7 +292,7 @@ public class ServerMonitor if (error) System.out.println("[" + serverName + ":" + serverAddress + "] Kill errored."); else - System.out.println("Sent kill command to " + serverAddress + " for " + serverName + " completed"); + System.out.println(message); } } }); @@ -366,9 +367,9 @@ public class ServerMonitor return bestServer; } - private static void killServer(final MinecraftServer serverToKill) + private static void killServer(final MinecraftServer serverToKill, String message) { - killServer(serverToKill.getName(), serverToKill.getPublicAddress(), true); + killServer(serverToKill.getName(), serverToKill.getPublicAddress(), message, true); } private static void startServer(final DedicatedServer serverSpace, final ServerGroup serverGroup, final int serverNum, final boolean free) diff --git a/Website/LOC.Core/LOC.Core.csproj b/Website/LOC.Core/LOC.Core.csproj index 3b92112f2..89d688b85 100644 --- a/Website/LOC.Core/LOC.Core.csproj +++ b/Website/LOC.Core/LOC.Core.csproj @@ -82,6 +82,7 @@ + diff --git a/Website/LOC.Core/Model/Sales/AccountTransaction.cs b/Website/LOC.Core/Model/Sales/AccountTransaction.cs index bf036eab2..01aacc663 100644 --- a/Website/LOC.Core/Model/Sales/AccountTransaction.cs +++ b/Website/LOC.Core/Model/Sales/AccountTransaction.cs @@ -6,6 +6,8 @@ public Account.Account Account { get; set; } + public long Date { get; set; } + public string SalesPackageName { get; set; } public int Gems { get; set; } diff --git a/Website/LOC.Core/Model/Sales/CoinTransaction.cs b/Website/LOC.Core/Model/Sales/CoinTransaction.cs index 273d375cb..03848b00f 100644 --- a/Website/LOC.Core/Model/Sales/CoinTransaction.cs +++ b/Website/LOC.Core/Model/Sales/CoinTransaction.cs @@ -6,6 +6,8 @@ public Account.Account Account { get; set; } + public long Date { get; set; } + public string Source { get; set; } public int Amount { get; set; } diff --git a/Website/LOC.Core/Model/Sales/GemTransaction.cs b/Website/LOC.Core/Model/Sales/GemTransaction.cs index b917705b7..7be893c7e 100644 --- a/Website/LOC.Core/Model/Sales/GemTransaction.cs +++ b/Website/LOC.Core/Model/Sales/GemTransaction.cs @@ -6,6 +6,8 @@ public Account.Account Account { get; set; } + public long Date { get; set; } + public string Source { get; set; } public int Amount { get; set; } diff --git a/Website/LOC.Core/Tokens/Client/AccountTransactionToken.cs b/Website/LOC.Core/Tokens/Client/AccountTransactionToken.cs new file mode 100644 index 000000000..afe1de694 --- /dev/null +++ b/Website/LOC.Core/Tokens/Client/AccountTransactionToken.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace LOC.Core.Tokens.Client +{ + public class AccountTransactionToken + { + public long Date { get; set; } + + public string SalesPackageName { get; set; } + + public int Gems { get; set; } + + public int Coins { get; set; } + + public AccountTransactionToken(Model.Sales.AccountTransaction transaction) + { + SalesPackageName = transaction.SalesPackageName; + Date = transaction.Date; + Gems = transaction.Gems; + Coins = transaction.Coins; + } + } +} diff --git a/Website/LOC.Core/Tokens/Client/ClientToken.cs b/Website/LOC.Core/Tokens/Client/ClientToken.cs index 00070d053..a73a187ee 100644 --- a/Website/LOC.Core/Tokens/Client/ClientToken.cs +++ b/Website/LOC.Core/Tokens/Client/ClientToken.cs @@ -42,6 +42,7 @@ Donated = account.Donated, SalesPackages = new List(), UnknownSalesPackages = new List(), + Transactions = new List(), CustomBuilds = new List(), Pets = new List(), PetNameTagCount = account.PetNameTagCount @@ -86,6 +87,7 @@ foreach (var transaction in account.AccountTransactions) { DonorToken.UnknownSalesPackages.Add(transaction.SalesPackageName); + DonorToken.Transactions.Add(new AccountTransactionToken(transaction)); } if (account.CustomBuilds == null) diff --git a/Website/LOC.Core/Tokens/Client/DonorToken.cs b/Website/LOC.Core/Tokens/Client/DonorToken.cs index e2c168907..4e636c181 100644 --- a/Website/LOC.Core/Tokens/Client/DonorToken.cs +++ b/Website/LOC.Core/Tokens/Client/DonorToken.cs @@ -9,6 +9,7 @@ public bool Donated { get; set; } public List SalesPackages { get; set; } public List UnknownSalesPackages { get; set; } + public List Transactions { get; set; } public List CustomBuilds { get; set; } public List Pets { get; set; } public int PetNameTagCount { get; set; } diff --git a/Website/LOC.Website.Common/Models/AccountAdministrator.cs b/Website/LOC.Website.Common/Models/AccountAdministrator.cs index 9d6952f01..2dd62d254 100644 --- a/Website/LOC.Website.Common/Models/AccountAdministrator.cs +++ b/Website/LOC.Website.Common/Models/AccountAdministrator.cs @@ -207,7 +207,8 @@ { Source = token.Source, Account = account, - Amount = token.Amount + Amount = token.Amount, + Date = (long)TimeUtil.GetCurrentMilliseconds() }; repository.Add(gemTransaction); @@ -238,7 +239,8 @@ { Source = token.Source, Account = account, - Amount = token.Amount + Amount = token.Amount, + Date = (long)TimeUtil.GetCurrentMilliseconds() }; repository.Add(coinTransaction); @@ -502,6 +504,7 @@ { Account = account, SalesPackageName = token.SalesPackageName, + Date = (long)TimeUtil.GetCurrentMilliseconds(), Gems = token.CoinPurchase ? 0 : token.Cost, Coins = token.CoinPurchase ? token.Cost : 0 }; diff --git a/Website/LOC.Website.Web/LOC.Website.Web.Publish.xml b/Website/LOC.Website.Web/LOC.Website.Web.Publish.xml index c039de9b0..cc154fa82 100644 --- a/Website/LOC.Website.Web/LOC.Website.Web.Publish.xml +++ b/Website/LOC.Website.Web/LOC.Website.Web.Publish.xml @@ -1,6 +1,7 @@  + @@ -16,16 +17,19 @@ - + - + + + + @@ -39,26 +43,26 @@ - + - + + - - - + + @@ -69,25 +73,24 @@ - + + - - + + + - - - - + @@ -95,6 +98,8 @@ + + @@ -102,19 +107,19 @@ - + - + + - - + @@ -126,17 +131,18 @@ - + + - + + - - + @@ -147,23 +153,18 @@ - + - - - - + - - @@ -172,28 +173,28 @@ - - - + + - + - - + + - + + @@ -202,24 +203,23 @@ - - + + - + - + - + - @@ -227,49 +227,50 @@ - + - + + - - + + - + - + - - + + - - + + - - + + + - @@ -282,17 +283,13 @@ - - + - - - @@ -306,7 +303,6 @@ - @@ -314,8 +310,8 @@ + - @@ -325,6 +321,7 @@ + @@ -335,28 +332,30 @@ - - + - + + + - + + @@ -364,42 +363,43 @@ - - - + + + + - + + - - - + + - - + + @@ -410,27 +410,32 @@ - + - + + + + + + - - + + @@ -440,99 +445,95 @@ - + - - + - - - + - - + - - + + - - + + - + + - - + - + - - + - + - + - - + + - + - - + + - - + + - + + + - @@ -543,18 +544,16 @@ - + - + - - @@ -568,6 +567,7 @@ + @@ -575,18 +575,18 @@ + - - + - + @@ -597,72 +597,74 @@ - - - + - - + + + - + - - + + - + - - + + + + + - + - - + + - - + + @@ -673,129 +675,128 @@ - + - + + + + + + - - - - + + + - - + - + - - + - - - + - - + + - - + + - - - - + + + - + - + - - + - + - + - - + + - + - - + + - - + + - + + + - @@ -806,18 +807,16 @@ - + - + - - @@ -831,6 +830,7 @@ + @@ -838,8 +838,8 @@ + - @@ -848,8 +848,8 @@ - + @@ -860,30 +860,29 @@ - - - + - - + + + - + @@ -891,41 +890,44 @@ - + - - + + + + + - + - - + + - - + + @@ -936,120 +938,118 @@ - + - + + + + + + - - + - - + - + - - + - - - + - - + + - - + + - - - - + + + - + - - + - + - + - - + + - + - - + + - - + + - + \ No newline at end of file diff --git a/Website/LOCWebsite.suo b/Website/LOCWebsite.suo index ed2074901fa85d80cd0449841ec2a31510e5d13d..f6e2c37e31ab6d3ac2952a4a38fb62f60bf78db7 100644 GIT binary patch delta 15581 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