Cache permission lookups

This commit is contained in:
Luck
2016-09-16 21:11:12 +01:00
Unverified
parent f6aa20c300
commit f2e06b56e7
8 changed files with 229 additions and 47 deletions
@@ -29,6 +29,7 @@ import me.lucko.luckperms.users.User;
import org.spongepowered.api.service.context.Context;
import org.spongepowered.api.util.Tristate;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
@@ -44,11 +45,20 @@ public class LuckPermsUserSubject extends LuckPermsSubject {
@Getter
private final Map<String, Boolean> permissionCache = new ConcurrentHashMap<>();
@Getter
private final Map<String, Tristate> lookupCache = new HashMap<>();
private LuckPermsUserSubject(User user, LuckPermsService service) {
super(user, service);
this.user = user;
}
public void invalidateCache() {
synchronized (lookupCache) {
lookupCache.clear();
}
}
// TODO don't ignore context
@Override
public Tristate getPermissionValue(@NonNull Set<Context> contexts, @NonNull String permission) {
@@ -57,7 +67,18 @@ public class LuckPermsUserSubject extends LuckPermsSubject {
}
permission = permission.toLowerCase();
synchronized (lookupCache) {
if (lookupCache.containsKey(permission)) {
return lookupCache.get(permission);
} else {
Tristate t = lookupPermissionValue(contexts, permission);
lookupCache.put(permission, t);
return t;
}
}
}
private Tristate lookupPermissionValue(Set<Context> contexts, String permission) {
if (permissionCache.containsKey(permission)) {
return Tristate.fromBoolean(permissionCache.get(permission));
}
@@ -25,6 +25,7 @@ package me.lucko.luckperms.users;
import me.lucko.luckperms.LPSpongePlugin;
import me.lucko.luckperms.api.event.events.UserPermissionRefreshEvent;
import me.lucko.luckperms.api.implementation.internal.UserLink;
import me.lucko.luckperms.api.sponge.LuckPermsUserSubject;
import me.lucko.luckperms.api.sponge.collections.UserCollection;
import java.util.Collections;
@@ -62,7 +63,8 @@ class SpongeUser extends User {
);
try {
Map<String, Boolean> existing = uc.getUsers().get(getUuid()).getPermissionCache();
LuckPermsUserSubject us = uc.getUsers().get(getUuid());
Map<String, Boolean> existing = us.getPermissionCache();
boolean different = false;
if (toApply.size() != existing.size()) {
@@ -80,6 +82,7 @@ class SpongeUser extends User {
if (!different) return;
existing.clear();
us.invalidateCache();
existing.putAll(toApply);
plugin.getApiProvider().fireEventAsync(new UserPermissionRefreshEvent(new UserLink(this)));