Ensure holder state is always declared

This commit is contained in:
Luck 2016-12-06 21:48:37 +00:00
parent 257f426ab9
commit 6760a96527
No known key found for this signature in database
GPG Key ID: EFA9B3EC5FD90F8B
4 changed files with 44 additions and 9 deletions

View File

@ -119,7 +119,11 @@ public class CachedStateManager {
public void invalidateInheritances(HolderReference holder) { public void invalidateInheritances(HolderReference holder) {
Set<HolderReference> toInvalidate = getInheritances(holder); Set<HolderReference> toInvalidate = getInheritances(holder);
toInvalidate.forEach(hr -> hr.apply(plugin, INVALIDATE_CONSUMER)); invalidateInheritances(plugin, toInvalidate);
}
public static void invalidateInheritances(LuckPermsPlugin plugin, Set<HolderReference> references) {
references.forEach(hr -> hr.apply(plugin, INVALIDATE_CONSUMER));
} }
} }

View File

@ -23,7 +23,9 @@
package me.lucko.luckperms.common.caching.handlers; package me.lucko.luckperms.common.caching.handlers;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.Getter; import lombok.Getter;
import lombok.ToString;
import me.lucko.luckperms.common.LuckPermsPlugin; import me.lucko.luckperms.common.LuckPermsPlugin;
import me.lucko.luckperms.common.core.model.Group; import me.lucko.luckperms.common.core.model.Group;
@ -32,6 +34,8 @@ import me.lucko.luckperms.common.core.model.PermissionHolder;
import java.util.function.Consumer; import java.util.function.Consumer;
@Getter @Getter
@ToString
@EqualsAndHashCode
@AllArgsConstructor(staticName = "of") @AllArgsConstructor(staticName = "of")
public class GroupReference implements HolderReference<String> { public class GroupReference implements HolderReference<String> {

View File

@ -23,7 +23,9 @@
package me.lucko.luckperms.common.caching.handlers; package me.lucko.luckperms.common.caching.handlers;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.Getter; import lombok.Getter;
import lombok.ToString;
import me.lucko.luckperms.common.LuckPermsPlugin; import me.lucko.luckperms.common.LuckPermsPlugin;
import me.lucko.luckperms.common.core.UserIdentifier; import me.lucko.luckperms.common.core.UserIdentifier;
@ -33,6 +35,8 @@ import me.lucko.luckperms.common.core.model.User;
import java.util.function.Consumer; import java.util.function.Consumer;
@Getter @Getter
@ToString
@EqualsAndHashCode
@AllArgsConstructor(staticName = "of") @AllArgsConstructor(staticName = "of")
public class UserReference implements HolderReference<UserIdentifier> { public class UserReference implements HolderReference<UserIdentifier> {
private final UserIdentifier id; private final UserIdentifier id;

View File

@ -48,6 +48,8 @@ import me.lucko.luckperms.common.LuckPermsPlugin;
import me.lucko.luckperms.common.api.internal.GroupLink; import me.lucko.luckperms.common.api.internal.GroupLink;
import me.lucko.luckperms.common.api.internal.PermissionHolderLink; import me.lucko.luckperms.common.api.internal.PermissionHolderLink;
import me.lucko.luckperms.common.caching.MetaHolder; import me.lucko.luckperms.common.caching.MetaHolder;
import me.lucko.luckperms.common.caching.handlers.CachedStateManager;
import me.lucko.luckperms.common.caching.handlers.GroupReference;
import me.lucko.luckperms.common.caching.handlers.HolderReference; import me.lucko.luckperms.common.caching.handlers.HolderReference;
import me.lucko.luckperms.common.caching.holder.ExportNodesHolder; import me.lucko.luckperms.common.caching.holder.ExportNodesHolder;
import me.lucko.luckperms.common.caching.holder.GetAllNodesHolder; import me.lucko.luckperms.common.caching.holder.GetAllNodesHolder;
@ -169,8 +171,23 @@ public abstract class PermissionHolder {
} }
cache.invalidate(); cache.invalidate();
mergedCache.invalidate(); mergedCache.invalidate();
invalidateInheritanceCaches();
plugin.getCachedStateManager().invalidateInheritances(toReference()); // Invalidate inheritance caches
getAllNodesCache.invalidateAll();
getAllNodesFilteredCache.invalidateAll();
exportNodesCache.invalidateAll();
// Get previous references
Set<HolderReference> refs = plugin.getCachedStateManager().getInheritances(toReference());
// Declare new state to the state manager
declareState();
// Add all new references affected by the state change.
refs.addAll(plugin.getCachedStateManager().getInheritances(toReference()));
// Invalidate all affected children.
CachedStateManager.invalidateInheritances(plugin, refs);
} }
private ImmutableSortedSet<LocalizedNode> cacheApply() { private ImmutableSortedSet<LocalizedNode> cacheApply() {
@ -241,12 +258,6 @@ public abstract class PermissionHolder {
return ImmutableSortedSet.copyOfSorted(combined); return ImmutableSortedSet.copyOfSorted(combined);
} }
public void invalidateInheritanceCaches() {
getAllNodesCache.invalidateAll();
getAllNodesFilteredCache.invalidateAll();
exportNodesCache.invalidateAll();
}
private SortedSet<LocalizedNode> getAllNodesCacheApply(GetAllNodesHolder getAllNodesHolder) { private SortedSet<LocalizedNode> getAllNodesCacheApply(GetAllNodesHolder getAllNodesHolder) {
List<String> excludedGroups = new ArrayList<>(getAllNodesHolder.getExcludedGroups()); List<String> excludedGroups = new ArrayList<>(getAllNodesHolder.getExcludedGroups());
ExtractedContexts contexts = getAllNodesHolder.getContexts(); ExtractedContexts contexts = getAllNodesHolder.getContexts();
@ -367,6 +378,9 @@ public abstract class PermissionHolder {
return ImmutableMap.copyOf(perms); return ImmutableMap.copyOf(perms);
} }
protected void declareState() {
plugin.getCachedStateManager().putAll(toReference(), getGroupReferences());
}
public abstract String getFriendlyName(); public abstract String getFriendlyName();
public abstract HolderReference<?> toReference(); public abstract HolderReference<?> toReference();
@ -1048,6 +1062,15 @@ public abstract class PermissionHolder {
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
public Set<HolderReference> getGroupReferences() {
return getNodes().stream()
.filter(Node::isGroupNode)
.map(Node::getGroupName)
.map(String::toLowerCase)
.map(GroupReference::of)
.collect(Collectors.toSet());
}
/** /**
* Get a {@link List} of the groups the holder inherits on a specific server and world * Get a {@link List} of the groups the holder inherits on a specific server and world
* *