Added Heartbeat debug logging.

This commit is contained in:
sigonasr2 2017-01-17 02:20:06 -06:00
parent eabadc9091
commit 4b53d3a837
7 changed files with 146 additions and 5 deletions

Binary file not shown.

View File

@ -549,6 +549,7 @@ public class EliteZombie extends EliteMonster{
b.setType(Material.AIR); b.setType(Material.AIR);
} else { } else {
b.setType(storedblocks.get(b)); b.setType(storedblocks.get(b));
b.setData(storedblockdata.get(b));
} }
SoundUtils.playGlobalSound(b.getLocation(), Sound.ENTITY_GENERIC_EXPLODE, 0.7f, 1.2f); SoundUtils.playGlobalSound(b.getLocation(), Sound.ENTITY_GENERIC_EXPLODE, 0.7f, 1.2f);
} }

View File

@ -20,8 +20,11 @@ import org.bukkit.attribute.Attribute;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.block.BlockFace; import org.bukkit.block.BlockFace;
import org.bukkit.block.Dropper; import org.bukkit.block.Dropper;
import org.bukkit.block.Hopper;
import org.bukkit.block.Sign; import org.bukkit.block.Sign;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.craftbukkit.v1_9_R1.block.CraftDropper;
import org.bukkit.craftbukkit.v1_9_R1.block.CraftHopper;
import org.bukkit.enchantments.Enchantment; import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.CaveSpider; import org.bukkit.entity.CaveSpider;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
@ -59,6 +62,8 @@ import net.md_5.bungee.api.chat.ClickEvent;
import net.md_5.bungee.api.chat.ComponentBuilder; import net.md_5.bungee.api.chat.ComponentBuilder;
import net.md_5.bungee.api.chat.HoverEvent; import net.md_5.bungee.api.chat.HoverEvent;
import net.md_5.bungee.api.chat.TextComponent; import net.md_5.bungee.api.chat.TextComponent;
import net.minecraft.server.v1_9_R1.TileEntityDropper;
import net.minecraft.server.v1_9_R1.TileEntityHopper;
import sig.plugin.TwosideKeeper.ActionBarBuffUpdater; import sig.plugin.TwosideKeeper.ActionBarBuffUpdater;
import sig.plugin.TwosideKeeper.Artifact; import sig.plugin.TwosideKeeper.Artifact;
import sig.plugin.TwosideKeeper.AwakenedArtifact; import sig.plugin.TwosideKeeper.AwakenedArtifact;
@ -4971,4 +4976,15 @@ public class GenericFunctions {
return true; return true;
} }
public static void renameDropper(Dropper dropper, String title) {
CraftDropper BukkitDropper = (CraftDropper) dropper;
TileEntityDropper NMSDropper = (TileEntityDropper) BukkitDropper.getTileEntity();
NMSDropper.a(title);
}
public static void renameHopper(Hopper hopper, String title) {
CraftHopper BukkitHopper = (CraftHopper) hopper;
TileEntityHopper NMSHopper = (TileEntityHopper) BukkitHopper.getTileEntity();
NMSHopper.a(title);
}
} }

View File

@ -0,0 +1,34 @@
package sig.plugin.TwosideKeeper.Logging;
public class Average {
int avg;
int count;
int high;
int low;
int trend;
int last;
public Average() {
this.avg=0;
this.count=0;
this.high=0;
this.low=Integer.MAX_VALUE;
this.trend=0;
this.last=0;
}
public void add(int value) {
if (value>high) {
high=value;
} else
if (value<low) {
low=value;
}
last=value;
int curravg = avg;
avg = (((count<60?count:60) * avg) + value) / ((count<60?count:60) + 1);
trend += Math.signum(avg-curravg);
if (trend>60) {trend=60;}
if (trend<-60) {trend=-60;}
count++;
}
}

View File

@ -0,0 +1,38 @@
package sig.plugin.TwosideKeeper.Logging;
import java.text.DecimalFormat;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map.Entry;
import org.bukkit.ChatColor;
public class HeartbeatLogger {
LinkedHashMap<String,Average> values = new LinkedHashMap<String,Average>();
public HeartbeatLogger() {
}
public void AddEntry(String name, int value) {
if (values.containsKey(name)) {
Average avg = values.get(name);
avg.add(value);
} else {
Average avg = new Average();
avg.add(value);
values.put(name, avg);
}
}
public String outputReport() {
StringBuilder stringy = new StringBuilder("");
for (Entry<String,Average> ent : values.entrySet()) {
Average avg = ent.getValue();
String str = ent.getKey();
DecimalFormat df = new DecimalFormat("0.00");
stringy.append(ChatColor.AQUA+str+": ["+(avg.trend>0?"^":avg.trend==0?"-":"v")+"]"+ChatColor.YELLOW+df.format(avg.avg/1000000d)+"ms ["+avg.count+"]"+ChatColor.RED+"H:"+df.format(avg.high/1000000d)+"ms"+ChatColor.GREEN+" L:"+df.format(avg.low/1000000d)+"ms "+ChatColor.LIGHT_PURPLE+"(Last: "+df.format(avg.last/1000000d)+"ms)\n"+ChatColor.RESET);
}
return stringy.toString();
}
}

View File

@ -451,6 +451,7 @@ public class TwosideKeeper extends JavaPlugin implements Listener {
public static MysteriousEssenceLogger EssenceLogger; //The logger for Essences. public static MysteriousEssenceLogger EssenceLogger; //The logger for Essences.
public static BowModeLogger BowLogger; //The logger for Bow Modes. public static BowModeLogger BowLogger; //The logger for Bow Modes.
public static LootLogger Loot_Logger; //The logger for Loot. public static LootLogger Loot_Logger; //The logger for Loot.
public static sig.plugin.TwosideKeeper.Logging.HeartbeatLogger HeartbeatLogger; //Diagnostics for heartbeat speed.
//public static AutoUpdatePlugin pluginupdater; //public static AutoUpdatePlugin pluginupdater;
public static boolean restarting_server=false; public static boolean restarting_server=false;
public static List<String> log_messages=new ArrayList<String>(); public static List<String> log_messages=new ArrayList<String>();
@ -913,6 +914,7 @@ public class TwosideKeeper extends JavaPlugin implements Listener {
EssenceLogger = new MysteriousEssenceLogger(); EssenceLogger = new MysteriousEssenceLogger();
BowLogger = new BowModeLogger(); BowLogger = new BowModeLogger();
Loot_Logger = new LootLogger(); Loot_Logger = new LootLogger();
HeartbeatLogger = new sig.plugin.TwosideKeeper.Logging.HeartbeatLogger();
habitat_data = new Habitation(); habitat_data = new Habitation();
habitat_data.loadLocationHashesFromConfig(); habitat_data.loadLocationHashesFromConfig();
@ -1172,7 +1174,12 @@ public class TwosideKeeper extends JavaPlugin implements Listener {
sender.sendMessage(ChatColor.WHITE+DisplayPlayerBar()); sender.sendMessage(ChatColor.WHITE+DisplayPlayerBar());
sender.sendMessage(ChatColor.WHITE+"To view a specific player's usage, use "+ChatColor.GREEN+"\"/debugreport <name>\""); sender.sendMessage(ChatColor.WHITE+"To view a specific player's usage, use "+ChatColor.GREEN+"\"/debugreport <name>\"");
sender.sendMessage(ChatColor.WHITE+"To view specific entities' usage, use "+ChatColor.GREEN+"\"/debugreport ALLENTS\""); sender.sendMessage(ChatColor.WHITE+"To view specific entities' usage, use "+ChatColor.GREEN+"\"/debugreport ALLENTS\"");
sender.sendMessage(ChatColor.WHITE+"To view heartbeat timings, use "+ChatColor.GREEN+"\"/debugreport heartbeat\"");
} else { } else {
if (args[0].equalsIgnoreCase("heartbeat")) {
sender.sendMessage("Heartbeat Timings:");
sender.sendMessage(HeartbeatLogger.outputReport());
} else
if (args[0].equalsIgnoreCase("ALLENTS")) { if (args[0].equalsIgnoreCase("ALLENTS")) {
sender.sendMessage("Individual Structures for all Living Entities:"); sender.sendMessage("Individual Structures for all Living Entities:");
int count=0; int count=0;

View File

@ -77,6 +77,7 @@ final class runServerHeartbeat implements Runnable {
//SAVE SERVER SETTINGS. //SAVE SERVER SETTINGS.
final long serverTickTime = TwosideKeeper.getServerTickTime(); final long serverTickTime = TwosideKeeper.getServerTickTime();
long time = System.nanoTime();
if (serverTickTime-TwosideKeeper.LASTSERVERCHECK>=TwosideKeeper.SERVERCHECKERTICKS) { //15 MINUTES (DEFAULT) if (serverTickTime-TwosideKeeper.LASTSERVERCHECK>=TwosideKeeper.SERVERCHECKERTICKS) { //15 MINUTES (DEFAULT)
if (TwosideKeeper.LAST_DEAL!=Calendar.getInstance().get(Calendar.DAY_OF_WEEK)) { if (TwosideKeeper.LAST_DEAL!=Calendar.getInstance().get(Calendar.DAY_OF_WEEK)) {
//This means the deal of the day has to be updated! //This means the deal of the day has to be updated!
@ -116,6 +117,7 @@ final class runServerHeartbeat implements Runnable {
//End Advertisements. //End Advertisements.
TwosideKeeper.LASTSERVERCHECK=serverTickTime; TwosideKeeper.LASTSERVERCHECK=serverTickTime;
} }
TwosideKeeper.HeartbeatLogger.AddEntry("MOTD", (int)(System.nanoTime()-time));time=System.nanoTime();
if (Bukkit.getWorld("world").getTime()>=12000 || Bukkit.getWorld("world").isThundering()) { if (Bukkit.getWorld("world").getTime()>=12000 || Bukkit.getWorld("world").isThundering()) {
Collection<? extends Player> players = ServerHeartbeat.getServer().getOnlinePlayers(); Collection<? extends Player> players = ServerHeartbeat.getServer().getOnlinePlayers();
@ -158,8 +160,9 @@ final class runServerHeartbeat implements Runnable {
ServerHeartbeat.sleepingPlayers=0; ServerHeartbeat.sleepingPlayers=0;
} }
} }
TwosideKeeper.HeartbeatLogger.AddEntry("Sleep Check", (int)(System.nanoTime()-time));time=System.nanoTime();
//See if each player needs to regenerate their health. //See if each player needs to regenerate their health.
long playerchecktime = System.nanoTime();
for (Player p : Bukkit.getOnlinePlayers()) { for (Player p : Bukkit.getOnlinePlayers()) {
//TwosideKeeper.outputArmorDurability(p); //TwosideKeeper.outputArmorDurability(p);
if (!p.isDead()) { if (!p.isDead()) {
@ -169,11 +172,12 @@ final class runServerHeartbeat implements Runnable {
CustomDamage.ApplyDamage(10, null, p, null, "Orni",CustomDamage.TRUEDMG|CustomDamage.IGNORE_DAMAGE_TICK|CustomDamage.IGNOREDODGE); CustomDamage.ApplyDamage(10, null, p, null, "Orni",CustomDamage.TRUEDMG|CustomDamage.IGNORE_DAMAGE_TICK|CustomDamage.IGNOREDODGE);
} }
TwosideKeeper.HeartbeatLogger.AddEntry("Orni", (int)(System.nanoTime()-time));time=System.nanoTime();
if (p.isSprinting() && pd.lastsprintcheck+(20*5)<serverTickTime) { if (p.isSprinting() && pd.lastsprintcheck+(20*5)<serverTickTime) {
pd.lastsprintcheck=serverTickTime; pd.lastsprintcheck=serverTickTime;
GenericFunctions.ApplySwiftAegis(p); GenericFunctions.ApplySwiftAegis(p);
} }
TwosideKeeper.HeartbeatLogger.AddEntry("Swift Aegis Application", (int)(System.nanoTime()-time));time=System.nanoTime();
if (TwosideKeeper.banksessions.containsKey(p.getUniqueId())) { if (TwosideKeeper.banksessions.containsKey(p.getUniqueId())) {
//See if it expired. //See if it expired.
BankSession bs = (BankSession)TwosideKeeper.banksessions.get(p.getUniqueId()); BankSession bs = (BankSession)TwosideKeeper.banksessions.get(p.getUniqueId());
@ -181,6 +185,7 @@ final class runServerHeartbeat implements Runnable {
TwosideKeeper.banksessions.remove(p.getUniqueId()); TwosideKeeper.banksessions.remove(p.getUniqueId());
} }
} }
TwosideKeeper.HeartbeatLogger.AddEntry("Bank Session Removal", (int)(System.nanoTime()-time));time=System.nanoTime();
/* /*
if (GenericFunctions.isRanger(p) && if (GenericFunctions.isRanger(p) &&
@ -192,88 +197,125 @@ final class runServerHeartbeat implements Runnable {
if (TwosideKeeper.TwosideShops.PlayerHasPurchases(p)) { if (TwosideKeeper.TwosideShops.PlayerHasPurchases(p)) {
TwosideKeeper.TwosideShops.PlayerSendPurchases(p); TwosideKeeper.TwosideShops.PlayerSendPurchases(p);
} }
TwosideKeeper.HeartbeatLogger.AddEntry("Purchase Notification Sending", (int)(System.nanoTime()-time));time=System.nanoTime();
long notafktime = System.nanoTime();
if (!aPlugin.API.isAFK(p)) { if (!aPlugin.API.isAFK(p)) {
EndShopSession(p); EndShopSession(p);
TwosideKeeper.HeartbeatLogger.AddEntry("End Shop Session", (int)(System.nanoTime()-time));time=System.nanoTime();
GenericFunctions.RemoveNewDebuffs(p); GenericFunctions.RemoveNewDebuffs(p);
TwosideKeeper.HeartbeatLogger.AddEntry("Remove New Debuffs", (int)(System.nanoTime()-time));time=System.nanoTime();
ModifyDasherSetSpeedMultiplier(p); ModifyDasherSetSpeedMultiplier(p);
TwosideKeeper.HeartbeatLogger.AddEntry("Dasher Speed Multiplier", (int)(System.nanoTime()-time));time=System.nanoTime();
ManageHighwinder(p, pd); ManageHighwinder(p, pd);
TwosideKeeper.HeartbeatLogger.AddEntry("Highwinder", (int)(System.nanoTime()-time));time=System.nanoTime();
RemoveInvalidTarget(p, pd); RemoveInvalidTarget(p, pd);
TwosideKeeper.HeartbeatLogger.AddEntry("Remove Bad Target", (int)(System.nanoTime()-time));time=System.nanoTime();
GiveArtifactBowXP(serverTickTime, p, pd); GiveArtifactBowXP(serverTickTime, p, pd);
TwosideKeeper.HeartbeatLogger.AddEntry("Artifact Bow XP", (int)(System.nanoTime()-time));time=System.nanoTime();
ReduceFireResistanceDuration(p); ReduceFireResistanceDuration(p);
TwosideKeeper.HeartbeatLogger.AddEntry("Reduce Fire Resist", (int)(System.nanoTime()-time));time=System.nanoTime();
ControlTheEnd(p, pd); ControlTheEnd(p, pd);
TwosideKeeper.HeartbeatLogger.AddEntry("The End", (int)(System.nanoTime()-time));time=System.nanoTime();
ItemStack[] equips = p.getEquipment().getArmorContents(); ItemStack[] equips = p.getEquipment().getArmorContents();
ShadowWalkerApplication(p, equips); ShadowWalkerApplication(p, equips);
TwosideKeeper.HeartbeatLogger.AddEntry("Shadow Walker", (int)(System.nanoTime()-time));time=System.nanoTime();
//PopulatePlayerBlockList(p,15,15,2,5,false); //PopulatePlayerBlockList(p,15,15,2,5,false);
PopRandomLavaBlock(p); PopRandomLavaBlock(p);
TwosideKeeper.HeartbeatLogger.AddEntry("Pop Lava", (int)(System.nanoTime()-time));time=System.nanoTime();
GenericFunctions.sendActionBarMessage(p, ""); GenericFunctions.sendActionBarMessage(p, "");
GenericFunctions.AutoRepairItems(p); GenericFunctions.AutoRepairItems(p);
TwosideKeeper.HeartbeatLogger.AddEntry("Auto Repair", (int)(System.nanoTime()-time));time=System.nanoTime();
if (GenericFunctions.hasStealth(p)) {GenericFunctions.DamageRandomTool(p);} if (GenericFunctions.hasStealth(p)) {GenericFunctions.DamageRandomTool(p);
TwosideKeeper.HeartbeatLogger.AddEntry("Damage Random Tool", (int)(System.nanoTime()-time));time=System.nanoTime();}
//See if this player is sleeping. //See if this player is sleeping.
HealForSleeping(p, pd); HealForSleeping(p, pd);
TwosideKeeper.HeartbeatLogger.AddEntry("Heal for Sleeping", (int)(System.nanoTime()-time));time=System.nanoTime();
//We need to see if this player's damage reduction has changed recently. If so, notify them. //We need to see if this player's damage reduction has changed recently. If so, notify them.
//Check damage reduction by sending an artifical "1" damage to the player. //Check damage reduction by sending an artifical "1" damage to the player.
ManagePlayerScoreboardAndHealth(p); ManagePlayerScoreboardAndHealth(p);
TwosideKeeper.HeartbeatLogger.AddEntry("Scoreboard/Health Management", (int)(System.nanoTime()-time));time=System.nanoTime();
if (PlayerMode.isBarbarian(p)) { if (PlayerMode.isBarbarian(p)) {
AutoConsumeFoods(p); AutoConsumeFoods(p);
TwosideKeeper.HeartbeatLogger.AddEntry("Auto Consume Food", (int)(System.nanoTime()-time));time=System.nanoTime();
} }
} }
TwosideKeeper.HeartbeatLogger.AddEntry(ChatColor.BOLD+"->Not AFK Functions"+ChatColor.RESET, (int)(System.nanoTime()-notafktime));
ModifyArmorBar(p); ModifyArmorBar(p);
TwosideKeeper.HeartbeatLogger.AddEntry("Modify Armor Bar", (int)(System.nanoTime()-time));time=System.nanoTime();
ItemStack[] equips = p.getEquipment().getArmorContents(); ItemStack[] equips = p.getEquipment().getArmorContents();
ResetVendetta(serverTickTime, pd); ResetVendetta(serverTickTime, pd);
TwosideKeeper.HeartbeatLogger.AddEntry("Vendetta Reset", (int)(System.nanoTime()-time));time=System.nanoTime();
ResetLifestealStacks(serverTickTime, pd); ResetLifestealStacks(serverTickTime, pd);
TwosideKeeper.HeartbeatLogger.AddEntry("Lifesteal Reset", (int)(System.nanoTime()-time));time=System.nanoTime();
ManagePlayerLink(p, pd); ManagePlayerLink(p, pd);
TwosideKeeper.HeartbeatLogger.AddEntry("Player Link", (int)(System.nanoTime()-time));time=System.nanoTime();
DepleteDamagePool(serverTickTime, p, pd); DepleteDamagePool(serverTickTime, p, pd);
TwosideKeeper.HeartbeatLogger.AddEntry("Damage Pool", (int)(System.nanoTime()-time));time=System.nanoTime();
AdventurerModeSetExhaustion(p); AdventurerModeSetExhaustion(p);
TwosideKeeper.HeartbeatLogger.AddEntry("Adventurer Mode Exhaustion", (int)(System.nanoTime()-time));time=System.nanoTime();
//CalculateHealthRegeneration(serverTickTime, p, pd, equips); //CalculateHealthRegeneration(serverTickTime, p, pd, equips);
ResetSwordCombo(serverTickTime, p, pd); ResetSwordCombo(serverTickTime, p, pd);
TwosideKeeper.HeartbeatLogger.AddEntry("Reset Sword Combo", (int)(System.nanoTime()-time));time=System.nanoTime();
ResetSlayerAggro(serverTickTime, p, pd); ResetSlayerAggro(serverTickTime, p, pd);
TwosideKeeper.HeartbeatLogger.AddEntry("Reset Slayer Aggro", (int)(System.nanoTime()-time));time=System.nanoTime();
ApplyCometRegenBonus(p); ApplyCometRegenBonus(p);
TwosideKeeper.HeartbeatLogger.AddEntry("Comet Regen Application", (int)(System.nanoTime()-time));time=System.nanoTime();
DasherFoodRegenPerk(p); DasherFoodRegenPerk(p);
TwosideKeeper.HeartbeatLogger.AddEntry("Dasher Food Regen", (int)(System.nanoTime()-time));time=System.nanoTime();
GivePartyNightVision(p); GivePartyNightVision(p);
TwosideKeeper.HeartbeatLogger.AddEntry("Party Night Vision", (int)(System.nanoTime()-time));time=System.nanoTime();
} }
//TwosideKeeper.outputArmorDurability(p,">"); //TwosideKeeper.outputArmorDurability(p,">");
} }
TwosideKeeper.HeartbeatLogger.AddEntry(ChatColor.BOLD+"->Full Player Checks"+ChatColor.RESET, (int)(System.nanoTime()-playerchecktime));
ManageSnowmanHunt(); ManageSnowmanHunt();
TwosideKeeper.HeartbeatLogger.AddEntry("Snowman Hunt", (int)(System.nanoTime()-time));time=System.nanoTime();
CheckAndAnnounceWeather(); CheckAndAnnounceWeather();
TwosideKeeper.HeartbeatLogger.AddEntry("Check/Announce Weather", (int)(System.nanoTime()-time));time=System.nanoTime();
Christmas.ChristmasHeartbeat(); Christmas.ChristmasHeartbeat();
TwosideKeeper.HeartbeatLogger.AddEntry("Christmas Heartbeat", (int)(System.nanoTime()-time));time=System.nanoTime();
MaintainMonsterData(); MaintainMonsterData();
TwosideKeeper.HeartbeatLogger.AddEntry("Monster Management", (int)(System.nanoTime()-time));time=System.nanoTime();
PartyManager.SetupParties(); PartyManager.SetupParties();
TwosideKeeper.HeartbeatLogger.AddEntry("Setup Parties", (int)(System.nanoTime()-time));time=System.nanoTime();
TwosideKeeper.TwosideSpleefGames.TickEvent(); TwosideKeeper.TwosideSpleefGames.TickEvent();
TwosideKeeper.HeartbeatLogger.AddEntry("Spleef Tick", (int)(System.nanoTime()-time));time=System.nanoTime();
performTimingsReport(); performTimingsReport();
TwosideKeeper.HeartbeatLogger.AddEntry("Server Lag Activation", (int)(System.nanoTime()-time));time=System.nanoTime();
} }
private void ManagePlayerScoreboardAndHealth(Player p) { private void ManagePlayerScoreboardAndHealth(Player p) {
@ -540,7 +582,7 @@ final class runServerHeartbeat implements Runnable {
double tps = MinecraftServer.getServer().recentTps[0]; double tps = MinecraftServer.getServer().recentTps[0];
if (tps<18 && TwosideKeeper.lastTimingReport+36000<TwosideKeeper.getServerTickTime()) { if (tps<18 && TwosideKeeper.lastTimingReport+36000<TwosideKeeper.getServerTickTime()) {
DecimalFormat df = new DecimalFormat("0.00"); DecimalFormat df = new DecimalFormat("0.00");
aPlugin.API.discordSendRawItalicized("**Server is lagging.**\nCurrent TPS: **"+df.format(tps)+"**"); aPlugin.API.discordSendRawItalicized("**Server is lagging.**\nCurrent TPS: **"+df.format(tps)+"** (Also writing debug timings to log file)");
if (TwosideKeeper.getServerTickTime()-TwosideKeeper.lastTimingReport>72000) { if (TwosideKeeper.getServerTickTime()-TwosideKeeper.lastTimingReport>72000) {
aPlugin.API.takeTimings(1200); aPlugin.API.takeTimings(1200);
} else { } else {
@ -548,6 +590,9 @@ final class runServerHeartbeat implements Runnable {
} }
TwosideKeeper.lastTimingReport=TwosideKeeper.getServerTickTime(); TwosideKeeper.lastTimingReport=TwosideKeeper.getServerTickTime();
} }
if (tps<18) {
GenericFunctions.logToFile("["+TwosideKeeper.getServerTickTime()+"] TPS: "+tps+"\n------------------\n"+TwosideKeeper.HeartbeatLogger.outputReport());
}
} }
private void CheckAndAnnounceWeather() { private void CheckAndAnnounceWeather() {