Add a lag check for permission system checks.

This doesn't include normal permission checks, since the overhead could be detrimental.
This commit is contained in:
KHobbits 2014-06-19 02:38:28 +01:00
parent 50a815bdb9
commit 4854961901
3 changed files with 53 additions and 13 deletions

View file

@ -194,6 +194,8 @@ public interface ISettings extends IConf
long getEconomyLagWarning(); long getEconomyLagWarning();
long getPermissionsLagWarning();
void setEssentialsChatActive(boolean b); void setEssentialsChatActive(boolean b);
long getMaxTempban(); long getMaxTempban();

View file

@ -557,6 +557,7 @@ public class Settings implements net.ess3.api.ISettings
mailsPerMinute = _getMailsPerMinute(); mailsPerMinute = _getMailsPerMinute();
maxMoney = _getMaxMoney(); maxMoney = _getMaxMoney();
minMoney = _getMinMoney(); minMoney = _getMinMoney();
permissionsLagWarning = _getPermissionsLagWarning();
economyLagWarning = _getEconomyLagWarning(); economyLagWarning = _getEconomyLagWarning();
economyLog = _isEcoLogEnabled(); economyLog = _isEcoLogEnabled();
economyLogUpdate = _isEcoLogUpdateEnabled(); economyLogUpdate = _isEcoLogUpdateEnabled();
@ -1137,8 +1138,8 @@ public class Settings implements net.ess3.api.ISettings
private long _getEconomyLagWarning() private long _getEconomyLagWarning()
{ {
// Default to 20ms // Default to 25ms
final long value = (long)(config.getDouble("economy-lag-warning", 20.0) * 1000000); final long value = (long)(config.getDouble("economy-lag-warning", 25.0) * 1000000);
return value; return value;
} }
@ -1148,6 +1149,22 @@ public class Settings implements net.ess3.api.ISettings
return economyLagWarning; return economyLagWarning;
} }
// #easteregg
private long permissionsLagWarning;
private long _getPermissionsLagWarning()
{
// Default to 25ms
final long value = (long)(config.getDouble("permissions-lag-warning", 25.0) * 1000000);
return value;
}
@Override
public long getPermissionsLagWarning()
{
return permissionsLagWarning;
}
@Override @Override
public long getMaxTempban() public long getMaxTempban()
{ {

View file

@ -1,5 +1,6 @@
package com.earth2me.essentials.perm; package com.earth2me.essentials.perm;
import com.earth2me.essentials.Essentials;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.logging.Level; import java.util.logging.Level;
@ -13,46 +14,50 @@ public class PermissionsHandler implements IPermissionsHandler
{ {
private transient IPermissionsHandler handler = new NullPermissionsHandler(); private transient IPermissionsHandler handler = new NullPermissionsHandler();
private transient String defaultGroup = "default"; private transient String defaultGroup = "default";
private final transient Plugin plugin; private final transient Essentials ess;
private static final Logger LOGGER = Logger.getLogger("Essentials"); private static final Logger LOGGER = Logger.getLogger("Essentials");
private transient boolean useSuperperms = false; private transient boolean useSuperperms = false;
public PermissionsHandler(final Plugin plugin) public PermissionsHandler(final Essentials plugin)
{ {
this.plugin = plugin; this.ess = plugin;
} }
public PermissionsHandler(final Plugin plugin, final boolean useSuperperms) public PermissionsHandler(final Essentials plugin, final boolean useSuperperms)
{ {
this.plugin = plugin; this.ess = plugin;
this.useSuperperms = useSuperperms; this.useSuperperms = useSuperperms;
} }
public PermissionsHandler(final Plugin plugin, final String defaultGroup) public PermissionsHandler(final Essentials plugin, final String defaultGroup)
{ {
this.plugin = plugin; this.ess = plugin;
this.defaultGroup = defaultGroup; this.defaultGroup = defaultGroup;
} }
@Override @Override
public String getGroup(final Player base) public String getGroup(final Player base)
{ {
final long start = System.nanoTime();
String group = handler.getGroup(base); String group = handler.getGroup(base);
if (group == null) if (group == null)
{ {
group = defaultGroup; group = defaultGroup;
} }
checkPermLag(start);
return group; return group;
} }
@Override @Override
public List<String> getGroups(final Player base) public List<String> getGroups(final Player base)
{ {
final long start = System.nanoTime();
List<String> groups = handler.getGroups(base); List<String> groups = handler.getGroups(base);
if (groups == null || groups.isEmpty()) if (groups == null || groups.isEmpty())
{ {
groups = Collections.singletonList(defaultGroup); groups = Collections.singletonList(defaultGroup);
} }
checkPermLag(start);
return Collections.unmodifiableList(groups); return Collections.unmodifiableList(groups);
} }
@ -65,7 +70,10 @@ public class PermissionsHandler implements IPermissionsHandler
@Override @Override
public boolean inGroup(final Player base, final String group) public boolean inGroup(final Player base, final String group)
{ {
return handler.inGroup(base, group); final long start = System.nanoTime();
final boolean result = handler.inGroup(base, group);
checkPermLag(start);
return result;
} }
@Override @Override
@ -77,28 +85,32 @@ public class PermissionsHandler implements IPermissionsHandler
@Override @Override
public String getPrefix(final Player base) public String getPrefix(final Player base)
{ {
final long start = System.nanoTime();
String prefix = handler.getPrefix(base); String prefix = handler.getPrefix(base);
if (prefix == null) if (prefix == null)
{ {
prefix = ""; prefix = "";
} }
checkPermLag(start);
return prefix; return prefix;
} }
@Override @Override
public String getSuffix(final Player base) public String getSuffix(final Player base)
{ {
final long start = System.nanoTime();
String suffix = handler.getSuffix(base); String suffix = handler.getSuffix(base);
if (suffix == null) if (suffix == null)
{ {
suffix = ""; suffix = "";
} }
checkPermLag(start);
return suffix; return suffix;
} }
public void checkPermissions() public void checkPermissions()
{ {
final PluginManager pluginManager = plugin.getServer().getPluginManager(); final PluginManager pluginManager = ess.getServer().getPluginManager();
final Plugin permExPlugin = pluginManager.getPlugin("PermissionsEx"); final Plugin permExPlugin = pluginManager.getPlugin("PermissionsEx");
if (permExPlugin != null && permExPlugin.isEnabled()) if (permExPlugin != null && permExPlugin.isEnabled())
@ -172,7 +184,7 @@ public class PermissionsHandler implements IPermissionsHandler
if (!(handler instanceof ZPermissionsHandler)) if (!(handler instanceof ZPermissionsHandler))
{ {
LOGGER.log(Level.INFO, "Essentials: Using zPermissions based permissions."); LOGGER.log(Level.INFO, "Essentials: Using zPermissions based permissions.");
handler = new ZPermissionsHandler(plugin); handler = new ZPermissionsHandler(ess);
} }
return; return;
} }
@ -191,7 +203,7 @@ public class PermissionsHandler implements IPermissionsHandler
{ {
LOGGER.log(Level.INFO, "Essentials: Using config file enhanced permissions."); LOGGER.log(Level.INFO, "Essentials: Using config file enhanced permissions.");
LOGGER.log(Level.INFO, "Permissions listed in as player-commands will be given to all users."); LOGGER.log(Level.INFO, "Permissions listed in as player-commands will be given to all users.");
handler = new ConfigPermissionsHandler(plugin); handler = new ConfigPermissionsHandler(ess);
} }
} }
} }
@ -205,4 +217,13 @@ public class PermissionsHandler implements IPermissionsHandler
{ {
return handler.getClass().getSimpleName().replace("Handler", ""); return handler.getClass().getSimpleName().replace("Handler", "");
} }
private void checkPermLag(long start)
{
final long elapsed = System.nanoTime() - start;
if (elapsed > ess.getSettings().getPermissionsLagWarning())
{
ess.getLogger().log(Level.INFO, "Lag Notice - Slow Permissions System (" + getName() + ") Response - Request took over {0}ms!", elapsed / 1000000.0);
}
}
} }