Cache permission lookups
This commit is contained in:
@@ -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)));
|
||||
|
||||
Reference in New Issue
Block a user