diff --git a/api/src/main/java/me/lucko/luckperms/api/LuckPermsApi.java b/api/src/main/java/me/lucko/luckperms/api/LuckPermsApi.java index d4515fb68..4205866d8 100644 --- a/api/src/main/java/me/lucko/luckperms/api/LuckPermsApi.java +++ b/api/src/main/java/me/lucko/luckperms/api/LuckPermsApi.java @@ -26,10 +26,12 @@ package me.lucko.luckperms.api; import me.lucko.luckperms.LuckPerms; +import me.lucko.luckperms.api.caching.CachedData; import me.lucko.luckperms.api.context.ContextCalculator; import me.lucko.luckperms.api.context.ContextManager; import me.lucko.luckperms.api.context.ContextSet; import me.lucko.luckperms.api.event.EventBus; +import me.lucko.luckperms.api.manager.CachedDataManager; import me.lucko.luckperms.api.manager.GroupManager; import me.lucko.luckperms.api.manager.TrackManager; import me.lucko.luckperms.api.manager.UserManager; @@ -110,6 +112,15 @@ public interface LuckPermsApi { */ @NonNull TrackManager getTrackManager(); + /** + * Gets the {@link CachedDataManager}, responsible for managing + * {@link CachedData} instances. + * + * @return the cached data manager + * @since 4.5 + */ + @NonNull CachedDataManager getCachedDataManager(); + /** * Schedules the execution of an update task, and returns an encapsulation * of the task as a {@link CompletableFuture}. diff --git a/api/src/main/java/me/lucko/luckperms/api/caching/CachedData.java b/api/src/main/java/me/lucko/luckperms/api/caching/CachedData.java index ad101df09..1a5e143c8 100644 --- a/api/src/main/java/me/lucko/luckperms/api/caching/CachedData.java +++ b/api/src/main/java/me/lucko/luckperms/api/caching/CachedData.java @@ -412,6 +412,14 @@ public interface CachedData { */ void invalidateMeta(); + /** + * Invalidates all cached {@link PermissionData} and {@link MetaData} + * instances. + * + * @since 4.5 + */ + void invalidate(); + /** * Invalidates all of the underlying Permission calculators. * diff --git a/api/src/main/java/me/lucko/luckperms/api/manager/CachedDataManager.java b/api/src/main/java/me/lucko/luckperms/api/manager/CachedDataManager.java new file mode 100644 index 000000000..c0b4d9499 --- /dev/null +++ b/api/src/main/java/me/lucko/luckperms/api/manager/CachedDataManager.java @@ -0,0 +1,53 @@ +/* + * This file is part of luckperms, licensed under the MIT License. + * + * Copyright (c) lucko (Luck) + * Copyright (c) contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package me.lucko.luckperms.api.manager; + +import me.lucko.luckperms.api.Group; +import me.lucko.luckperms.api.User; +import me.lucko.luckperms.api.caching.CachedData; + +/** + * Represents an object responsible for managing {@link CachedData} instances. + * + * @since 4.5 + */ +public interface CachedDataManager { + + /** + * Invalidate the {@link CachedData} instances for all loaded {@link User}s. + * + * @see CachedData#invalidate() + */ + void invalidateAllUserCaches(); + + /** + * Invalidate the {@link CachedData} instances for all loaded {@link Group}s. + * + * @see CachedData#invalidate() + */ + void invalidateAllGroupCaches(); + +} diff --git a/common/src/main/java/me/lucko/luckperms/common/api/LuckPermsApiProvider.java b/common/src/main/java/me/lucko/luckperms/common/api/LuckPermsApiProvider.java index 24b1e6859..e5a79f978 100644 --- a/common/src/main/java/me/lucko/luckperms/common/api/LuckPermsApiProvider.java +++ b/common/src/main/java/me/lucko/luckperms/common/api/LuckPermsApiProvider.java @@ -34,6 +34,7 @@ import me.lucko.luckperms.api.Storage; import me.lucko.luckperms.api.UuidCache; import me.lucko.luckperms.api.context.ContextManager; import me.lucko.luckperms.api.event.EventBus; +import me.lucko.luckperms.api.manager.CachedDataManager; import me.lucko.luckperms.api.manager.GroupManager; import me.lucko.luckperms.api.manager.TrackManager; import me.lucko.luckperms.api.manager.UserManager; @@ -41,6 +42,7 @@ import me.lucko.luckperms.api.messenger.MessengerProvider; import me.lucko.luckperms.api.metastacking.MetaStackFactory; import me.lucko.luckperms.api.platform.PlatformInfo; import me.lucko.luckperms.common.api.implementation.ApiActionLogger; +import me.lucko.luckperms.common.api.implementation.ApiCachedDataManager; import me.lucko.luckperms.common.api.implementation.ApiContextManager; import me.lucko.luckperms.common.api.implementation.ApiGroupManager; import me.lucko.luckperms.common.api.implementation.ApiMessagingService; @@ -71,6 +73,7 @@ public class LuckPermsApiProvider implements LuckPermsApi { private final UserManager userManager; private final GroupManager groupManager; private final TrackManager trackManager; + private final CachedDataManager cachedDataManager; private final ActionLogger actionLogger; private final ContextManager contextManager; private final MetaStackFactory metaStackFactory; @@ -82,6 +85,7 @@ public class LuckPermsApiProvider implements LuckPermsApi { this.userManager = new ApiUserManager(plugin, plugin.getUserManager()); this.groupManager = new ApiGroupManager(plugin, plugin.getGroupManager()); this.trackManager = new ApiTrackManager(plugin, plugin.getTrackManager()); + this.cachedDataManager = new ApiCachedDataManager(plugin.getUserManager(), plugin.getGroupManager()); this.actionLogger = new ApiActionLogger(plugin); this.contextManager = new ApiContextManager(plugin, plugin.getContextManager()); this.metaStackFactory = new ApiMetaStackFactory(plugin); @@ -107,6 +111,11 @@ public class LuckPermsApiProvider implements LuckPermsApi { return this.trackManager; } + @Override + public @NonNull CachedDataManager getCachedDataManager() { + return this.cachedDataManager; + } + @Override public @NonNull CompletableFuture runUpdateTask() { return this.plugin.getSyncTaskBuffer().request(); diff --git a/common/src/main/java/me/lucko/luckperms/common/api/implementation/ApiCachedDataManager.java b/common/src/main/java/me/lucko/luckperms/common/api/implementation/ApiCachedDataManager.java new file mode 100644 index 000000000..ef3595d17 --- /dev/null +++ b/common/src/main/java/me/lucko/luckperms/common/api/implementation/ApiCachedDataManager.java @@ -0,0 +1,51 @@ +/* + * This file is part of luckperms, licensed under the MIT License. + * + * Copyright (c) lucko (Luck) + * Copyright (c) contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package me.lucko.luckperms.common.api.implementation; + +import me.lucko.luckperms.api.manager.CachedDataManager; +import me.lucko.luckperms.common.model.manager.group.GroupManager; +import me.lucko.luckperms.common.model.manager.user.UserManager; + +public class ApiCachedDataManager implements CachedDataManager { + private final UserManager userManager; + private final GroupManager groupManager; + + public ApiCachedDataManager(UserManager userManager, GroupManager groupManager) { + this.userManager = userManager; + this.groupManager = groupManager; + } + + + @Override + public void invalidateAllUserCaches() { + this.userManager.invalidateAllUserCaches(); + } + + @Override + public void invalidateAllGroupCaches() { + this.groupManager.invalidateAllGroupCaches(); + } +} diff --git a/common/src/main/java/me/lucko/luckperms/common/api/implementation/ApiGroupManager.java b/common/src/main/java/me/lucko/luckperms/common/api/implementation/ApiGroupManager.java index 260162934..96cb7202f 100644 --- a/common/src/main/java/me/lucko/luckperms/common/api/implementation/ApiGroupManager.java +++ b/common/src/main/java/me/lucko/luckperms/common/api/implementation/ApiGroupManager.java @@ -75,7 +75,12 @@ public class ApiGroupManager extends ApiAbstractManager saveGroup(me.lucko.luckperms.api.@NonNull Group group) { Objects.requireNonNull(group, "group"); - return this.plugin.getStorage().saveGroup(ApiGroup.cast(group)); + return this.plugin.getStorage().saveGroup(ApiGroup.cast(group)).thenRun(() -> { + // invalidate caches - they have potentially been affected by + // this change. + this.plugin.getGroupManager().invalidateAllGroupCaches(); + this.plugin.getUserManager().invalidateAllUserCaches(); + }); } @Override @@ -84,7 +89,13 @@ public class ApiGroupManager extends ApiAbstractManager { + // invalidate caches - they have potentially been affected by + // this change. + this.plugin.getGroupManager().invalidateAllGroupCaches(); + this.plugin.getUserManager().invalidateAllUserCaches(); + }); } @Override diff --git a/common/src/main/java/me/lucko/luckperms/common/api/implementation/ApiStorage.java b/common/src/main/java/me/lucko/luckperms/common/api/implementation/ApiStorage.java index 88db9f3f4..b1fbf96c0 100644 --- a/common/src/main/java/me/lucko/luckperms/common/api/implementation/ApiStorage.java +++ b/common/src/main/java/me/lucko/luckperms/common/api/implementation/ApiStorage.java @@ -31,19 +31,13 @@ import me.lucko.luckperms.api.Log; import me.lucko.luckperms.api.LogEntry; import me.lucko.luckperms.api.Track; import me.lucko.luckperms.api.User; -import me.lucko.luckperms.api.event.cause.CreationCause; -import me.lucko.luckperms.api.event.cause.DeletionCause; -import me.lucko.luckperms.common.api.ApiUtils; -import me.lucko.luckperms.common.bulkupdate.comparison.Constraint; -import me.lucko.luckperms.common.bulkupdate.comparison.StandardComparison; -import me.lucko.luckperms.common.node.factory.NodeFactory; +import me.lucko.luckperms.common.api.LuckPermsApiProvider; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.storage.Storage; import org.checkerframework.checker.nullness.qual.NonNull; import java.util.List; -import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.UUID; @@ -69,10 +63,12 @@ public class ApiStorage implements me.lucko.luckperms.api.Storage { } private final LuckPermsPlugin plugin; + private final LuckPermsApiProvider apiProvider; private final Storage handle; - public ApiStorage(LuckPermsPlugin plugin, Storage handle) { + public ApiStorage(LuckPermsPlugin plugin, LuckPermsApiProvider apiProvider, Storage handle) { this.plugin = plugin; + this.apiProvider = apiProvider; this.handle = handle; } @@ -98,155 +94,130 @@ public class ApiStorage implements me.lucko.luckperms.api.Storage { @Override public @NonNull CompletableFuture logAction(@NonNull LogEntry entry) { - Objects.requireNonNull(entry, "entry"); - return this.handle.logAction(entry) + return this.apiProvider.getActionLogger().submitToStorage(entry) .thenApply(r -> true) .exceptionally(consumeExceptionToFalse()); } @Override public @NonNull CompletableFuture getLog() { - return this.handle.getLog().thenApply(ApiLog::new).exceptionally(consumeExceptionToNull()); + return this.apiProvider.getActionLogger().getLog().exceptionally(consumeExceptionToNull()); } @Override public @NonNull CompletableFuture loadUser(@NonNull UUID uuid, String username) { - Objects.requireNonNull(uuid, "uuid"); - username = ApiUtils.checkUsername(username, this.plugin); - - if (this.plugin.getUserManager().getIfLoaded(uuid) == null) { - this.plugin.getUserManager().getHouseKeeper().registerApiUsage(uuid); - } - - return this.handle.loadUser(uuid, username) + return this.apiProvider.getUserManager().loadUser(uuid, username) .thenApply(r -> true) .exceptionally(consumeExceptionToFalse()); } @Override public @NonNull CompletableFuture saveUser(@NonNull User user) { - Objects.requireNonNull(user, "user"); - return this.handle.saveUser(ApiUser.cast(user)) + return this.apiProvider.getUserManager().saveUser(user) .thenApply(r -> true) .exceptionally(consumeExceptionToFalse()); } @Override public @NonNull CompletableFuture> getUniqueUsers() { - return this.handle.getUniqueUsers().exceptionally(consumeExceptionToNull()); + return this.apiProvider.getUserManager().getUniqueUsers().exceptionally(consumeExceptionToNull()); } @Override public @NonNull CompletableFuture>> getUsersWithPermission(@NonNull String permission) { - Objects.requireNonNull(permission, "permission"); - return this.handle.getUsersWithPermission(Constraint.of(StandardComparison.EQUAL, permission)).exceptionally(consumeExceptionToNull()); + return this.apiProvider.getUserManager().getWithPermission(permission).exceptionally(consumeExceptionToNull()); } @Override public @NonNull CompletableFuture createAndLoadGroup(@NonNull String name) { - Objects.requireNonNull(name, "name"); - return this.handle.createAndLoadGroup(ApiUtils.checkName(name), CreationCause.API) + return this.apiProvider.getGroupManager().createAndLoadGroup(name) .thenApply(r -> true) .exceptionally(consumeExceptionToFalse()); } @Override public @NonNull CompletableFuture loadGroup(@NonNull String name) { - Objects.requireNonNull(name, "name"); - return this.handle.loadGroup(ApiUtils.checkName(name)) + return this.apiProvider.getGroupManager().loadGroup(name) .thenApply(Optional::isPresent) .exceptionally(consumeExceptionToFalse()); } @Override public @NonNull CompletableFuture loadAllGroups() { - return this.handle.loadAllGroups() + return this.apiProvider.getGroupManager().loadAllGroups() .thenApply(r -> true) .exceptionally(consumeExceptionToFalse()); } @Override public @NonNull CompletableFuture saveGroup(@NonNull Group group) { - Objects.requireNonNull(group, "group"); - return this.handle.saveGroup(ApiGroup.cast(group)) + return this.apiProvider.getGroupManager().saveGroup(group) .thenApply(r -> true) .exceptionally(consumeExceptionToFalse()); } @Override public @NonNull CompletableFuture deleteGroup(@NonNull Group group) { - Objects.requireNonNull(group, "group"); - if (group.getName().equalsIgnoreCase(NodeFactory.DEFAULT_GROUP_NAME)) { - throw new IllegalArgumentException("Cannot delete the default group."); - } - return this.handle.deleteGroup(ApiGroup.cast(group), DeletionCause.API) + return this.apiProvider.getGroupManager().deleteGroup(group) .thenApply(r -> true) .exceptionally(consumeExceptionToFalse()); } @Override public @NonNull CompletableFuture>> getGroupsWithPermission(@NonNull String permission) { - Objects.requireNonNull(permission, "permission"); - return this.handle.getGroupsWithPermission(Constraint.of(StandardComparison.EQUAL, permission)).exceptionally(consumeExceptionToNull()); + return this.apiProvider.getGroupManager().getWithPermission(permission) + .exceptionally(consumeExceptionToNull()); } @Override public @NonNull CompletableFuture createAndLoadTrack(@NonNull String name) { - Objects.requireNonNull(name, "name"); - return this.handle.createAndLoadTrack(ApiUtils.checkName(name), CreationCause.API) + return this.apiProvider.getTrackManager().createAndLoadTrack(name) .thenApply(r -> true) .exceptionally(consumeExceptionToFalse()); } @Override public @NonNull CompletableFuture loadTrack(@NonNull String name) { - Objects.requireNonNull(name, "name"); - return this.handle.loadTrack(ApiUtils.checkName(name)) + return this.apiProvider.getTrackManager().loadTrack(name) .thenApply(Optional::isPresent) .exceptionally(consumeExceptionToFalse()); } @Override public @NonNull CompletableFuture loadAllTracks() { - return this.handle.loadAllTracks() + return this.apiProvider.getTrackManager().loadAllTracks() .thenApply(r -> true) .exceptionally(consumeExceptionToFalse()); } @Override public @NonNull CompletableFuture saveTrack(@NonNull Track track) { - Objects.requireNonNull(track, "track"); - return this.handle.saveTrack(ApiTrack.cast(track)) + return this.apiProvider.getTrackManager().saveTrack(track) .thenApply(r -> true) .exceptionally(consumeExceptionToFalse()); } @Override public @NonNull CompletableFuture deleteTrack(@NonNull Track track) { - Objects.requireNonNull(track, "track"); - return this.handle.deleteTrack(ApiTrack.cast(track), DeletionCause.API) + return this.apiProvider.getTrackManager().deleteTrack(track) .thenApply(r -> true) .exceptionally(consumeExceptionToFalse()); } @Override public @NonNull CompletableFuture saveUUIDData(@NonNull String username, @NonNull UUID uuid) { - Objects.requireNonNull(username, "username"); - Objects.requireNonNull(uuid, "uuid"); - return this.handle.savePlayerData(uuid, ApiUtils.checkUsername(username, this.plugin)) + return this.apiProvider.getUserManager().savePlayerData(uuid, username) .thenApply(r -> true) .exceptionally(consumeExceptionToFalse()); } @Override public @NonNull CompletableFuture getUUID(@NonNull String username) { - Objects.requireNonNull(username, "username"); - return this.handle.getPlayerUuid(ApiUtils.checkUsername(username, this.plugin)); + return this.apiProvider.getUserManager().lookupUuid(username).exceptionally(consumeExceptionToNull()); } @Override public @NonNull CompletableFuture getName(@NonNull UUID uuid) { - Objects.requireNonNull(uuid, "uuid"); - return this.handle.getPlayerName(uuid); + return this.apiProvider.getUserManager().lookupUsername(uuid).exceptionally(consumeExceptionToNull()); } } diff --git a/common/src/main/java/me/lucko/luckperms/common/cacheddata/AbstractCachedData.java b/common/src/main/java/me/lucko/luckperms/common/cacheddata/AbstractCachedData.java index 71bf65f79..1d0a6b6d8 100644 --- a/common/src/main/java/me/lucko/luckperms/common/cacheddata/AbstractCachedData.java +++ b/common/src/main/java/me/lucko/luckperms/common/cacheddata/AbstractCachedData.java @@ -374,16 +374,17 @@ public abstract class AbstractCachedData implements CachedData { } @Override - public final void invalidatePermissionCalculators() { - this.permission.synchronous().asMap().values().forEach(PermissionCache::invalidateCache); - } - public final void invalidate() { invalidatePermissions(); invalidateMeta(); } - public final void doCacheCleanup() { + @Override + public final void invalidatePermissionCalculators() { + this.permission.synchronous().asMap().values().forEach(PermissionCache::invalidateCache); + } + + public final void performCacheCleanup() { this.permission.synchronous().cleanUp(); this.meta.synchronous().cleanUp(); } diff --git a/common/src/main/java/me/lucko/luckperms/common/model/PermissionHolder.java b/common/src/main/java/me/lucko/luckperms/common/model/PermissionHolder.java index e710b01eb..319fc2531 100644 --- a/common/src/main/java/me/lucko/luckperms/common/model/PermissionHolder.java +++ b/common/src/main/java/me/lucko/luckperms/common/model/PermissionHolder.java @@ -211,18 +211,11 @@ public abstract class PermissionHolder { */ public abstract HolderType getType(); - /** - * Invalidates the holder's cached data. - */ - public void invalidateCachedData() { - getCachedData().invalidate(); - } - protected void invalidateCache() { this.enduringNodes.invalidate(); this.transientNodes.invalidate(); - invalidateCachedData(); + getCachedData().invalidate(); getPlugin().getEventFactory().handleDataRecalculate(this); } diff --git a/common/src/main/java/me/lucko/luckperms/common/model/manager/AbstractManager.java b/common/src/main/java/me/lucko/luckperms/common/model/manager/AbstractManager.java index 008c584b6..b1cd42584 100644 --- a/common/src/main/java/me/lucko/luckperms/common/model/manager/AbstractManager.java +++ b/common/src/main/java/me/lucko/luckperms/common/model/manager/AbstractManager.java @@ -77,11 +77,6 @@ public abstract class AbstractManager, T extends C> } } - @Override - public void unloadAll() { - this.objects.clear(); - } - protected I sanitizeIdentifier(I i) { return i; } diff --git a/common/src/main/java/me/lucko/luckperms/common/model/manager/Manager.java b/common/src/main/java/me/lucko/luckperms/common/model/manager/Manager.java index 99bdc89de..50a42f339 100644 --- a/common/src/main/java/me/lucko/luckperms/common/model/manager/Manager.java +++ b/common/src/main/java/me/lucko/luckperms/common/model/manager/Manager.java @@ -86,9 +86,4 @@ public interface Manager, T extends C> extends Func */ void unload(C object); - /** - * Unloads all objects from the manager - */ - void unloadAll(); - } diff --git a/common/src/main/java/me/lucko/luckperms/common/model/manager/group/AbstractGroupManager.java b/common/src/main/java/me/lucko/luckperms/common/model/manager/group/AbstractGroupManager.java index 6e1bb9519..b600e4cf6 100644 --- a/common/src/main/java/me/lucko/luckperms/common/model/manager/group/AbstractGroupManager.java +++ b/common/src/main/java/me/lucko/luckperms/common/model/manager/group/AbstractGroupManager.java @@ -26,7 +26,6 @@ package me.lucko.luckperms.common.model.manager.group; import me.lucko.luckperms.common.model.Group; -import me.lucko.luckperms.common.model.PermissionHolder; import me.lucko.luckperms.common.model.manager.AbstractManager; import java.util.Optional; @@ -67,11 +66,11 @@ public abstract class AbstractGroupManager extends AbstractMana @Override public void invalidateAllGroupCaches() { - getAll().values().forEach(PermissionHolder::invalidateCachedData); + getAll().values().forEach(g -> g.getCachedData().invalidate()); } @Override public void invalidateAllPermissionCalculators() { - getAll().values().forEach(p -> p.getCachedData().invalidatePermissionCalculators()); + getAll().values().forEach(g -> g.getCachedData().invalidatePermissionCalculators()); } } \ No newline at end of file diff --git a/common/src/main/java/me/lucko/luckperms/common/model/manager/user/AbstractUserManager.java b/common/src/main/java/me/lucko/luckperms/common/model/manager/user/AbstractUserManager.java index b04d48d3e..86c0852b7 100644 --- a/common/src/main/java/me/lucko/luckperms/common/model/manager/user/AbstractUserManager.java +++ b/common/src/main/java/me/lucko/luckperms/common/model/manager/user/AbstractUserManager.java @@ -31,7 +31,6 @@ import me.lucko.luckperms.api.LocalizedNode; import me.lucko.luckperms.api.Node; import me.lucko.luckperms.api.context.ImmutableContextSet; import me.lucko.luckperms.common.config.ConfigKeys; -import me.lucko.luckperms.common.model.PermissionHolder; import me.lucko.luckperms.common.model.User; import me.lucko.luckperms.common.model.UserIdentifier; import me.lucko.luckperms.common.model.manager.AbstractManager; @@ -165,12 +164,12 @@ public abstract class AbstractUserManager extends AbstractManage @Override public void invalidateAllUserCaches() { - getAll().values().forEach(PermissionHolder::invalidateCachedData); + getAll().values().forEach(u -> u.getCachedData().invalidate()); } @Override public void invalidateAllPermissionCalculators() { - getAll().values().forEach(p -> p.getCachedData().invalidatePermissionCalculators()); + getAll().values().forEach(u -> u.getCachedData().invalidatePermissionCalculators()); } /** diff --git a/common/src/main/java/me/lucko/luckperms/common/storage/implementation/file/AbstractConfigurateStorage.java b/common/src/main/java/me/lucko/luckperms/common/storage/implementation/file/AbstractConfigurateStorage.java index a7e379198..e8102bd45 100644 --- a/common/src/main/java/me/lucko/luckperms/common/storage/implementation/file/AbstractConfigurateStorage.java +++ b/common/src/main/java/me/lucko/luckperms/common/storage/implementation/file/AbstractConfigurateStorage.java @@ -217,7 +217,6 @@ public abstract class AbstractConfigurateStorage implements StorageImplementatio } catch (Exception e) { throw reportException(uuid.toString(), e); } finally { - user.invalidateCachedData(); user.getIoLock().unlock(); } return user; @@ -273,7 +272,6 @@ public abstract class AbstractConfigurateStorage implements StorageImplementatio } catch (Exception e) { throw reportException(name, e); } finally { - group.invalidateCachedData(); group.getIoLock().unlock(); } return group; @@ -306,7 +304,6 @@ public abstract class AbstractConfigurateStorage implements StorageImplementatio throw reportException(name, e); } finally { if (group != null) { - group.invalidateCachedData(); group.getIoLock().unlock(); } } diff --git a/common/src/main/java/me/lucko/luckperms/common/storage/implementation/mongodb/MongoStorage.java b/common/src/main/java/me/lucko/luckperms/common/storage/implementation/mongodb/MongoStorage.java index 822f44e27..b183d03ac 100644 --- a/common/src/main/java/me/lucko/luckperms/common/storage/implementation/mongodb/MongoStorage.java +++ b/common/src/main/java/me/lucko/luckperms/common/storage/implementation/mongodb/MongoStorage.java @@ -297,7 +297,6 @@ public class MongoStorage implements StorageImplementation { } } } finally { - user.invalidateCachedData(); user.getIoLock().unlock(); } return user; @@ -368,7 +367,6 @@ public class MongoStorage implements StorageImplementation { } } } finally { - group.invalidateCachedData(); group.getIoLock().unlock(); } return group; @@ -398,7 +396,6 @@ public class MongoStorage implements StorageImplementation { } } finally { if (group != null) { - group.invalidateCachedData(); group.getIoLock().unlock(); } } diff --git a/common/src/main/java/me/lucko/luckperms/common/storage/implementation/sql/SqlStorage.java b/common/src/main/java/me/lucko/luckperms/common/storage/implementation/sql/SqlStorage.java index bbb925946..3b8e8122b 100644 --- a/common/src/main/java/me/lucko/luckperms/common/storage/implementation/sql/SqlStorage.java +++ b/common/src/main/java/me/lucko/luckperms/common/storage/implementation/sql/SqlStorage.java @@ -394,7 +394,6 @@ public class SqlStorage implements StorageImplementation { } } } finally { - user.invalidateCachedData(); user.getIoLock().unlock(); } return user; @@ -636,7 +635,6 @@ public class SqlStorage implements StorageImplementation { group.clearNodes(); } } finally { - group.invalidateCachedData(); group.getIoLock().unlock(); } return Optional.of(group); diff --git a/common/src/main/java/me/lucko/luckperms/common/tasks/CacheHousekeepingTask.java b/common/src/main/java/me/lucko/luckperms/common/tasks/CacheHousekeepingTask.java index bbcff252e..4843711d0 100644 --- a/common/src/main/java/me/lucko/luckperms/common/tasks/CacheHousekeepingTask.java +++ b/common/src/main/java/me/lucko/luckperms/common/tasks/CacheHousekeepingTask.java @@ -39,10 +39,10 @@ public class CacheHousekeepingTask implements Runnable { @Override public void run() { for (User user : this.plugin.getUserManager().getAll().values()) { - user.getCachedData().doCacheCleanup(); + user.getCachedData().performCacheCleanup(); } for (Group group : this.plugin.getGroupManager().getAll().values()) { - group.getCachedData().doCacheCleanup(); + group.getCachedData().performCacheCleanup(); } } } diff --git a/sponge/sponge-service/src/main/java/me/lucko/luckperms/sponge/service/model/LPSubject.java b/sponge/sponge-service/src/main/java/me/lucko/luckperms/sponge/service/model/LPSubject.java index d502a97ef..524f137a9 100644 --- a/sponge/sponge-service/src/main/java/me/lucko/luckperms/sponge/service/model/LPSubject.java +++ b/sponge/sponge-service/src/main/java/me/lucko/luckperms/sponge/service/model/LPSubject.java @@ -74,9 +74,7 @@ public interface LPSubject { Optional getOption(ImmutableContextSet contexts, String key); - default void performCleanup() { - - } + void performCacheCleanup(); void invalidateCaches(); diff --git a/sponge/src/main/java/me/lucko/luckperms/sponge/service/model/calculated/CalculatedSubject.java b/sponge/src/main/java/me/lucko/luckperms/sponge/service/model/calculated/CalculatedSubject.java index eae715a09..345de4cba 100644 --- a/sponge/src/main/java/me/lucko/luckperms/sponge/service/model/calculated/CalculatedSubject.java +++ b/sponge/src/main/java/me/lucko/luckperms/sponge/service/model/calculated/CalculatedSubject.java @@ -313,8 +313,8 @@ public abstract class CalculatedSubject implements LPSubject { } @Override - public void performCleanup() { - this.cachedData.doCacheCleanup(); + public void performCacheCleanup() { + this.cachedData.performCacheCleanup(); } @Override diff --git a/sponge/src/main/java/me/lucko/luckperms/sponge/service/model/permissionholder/PermissionHolderSubject.java b/sponge/src/main/java/me/lucko/luckperms/sponge/service/model/permissionholder/PermissionHolderSubject.java index 23c13c8eb..7ba2cadde 100644 --- a/sponge/src/main/java/me/lucko/luckperms/sponge/service/model/permissionholder/PermissionHolderSubject.java +++ b/sponge/src/main/java/me/lucko/luckperms/sponge/service/model/permissionholder/PermissionHolderSubject.java @@ -166,10 +166,15 @@ public abstract class PermissionHolderSubject implem return this.plugin.getService().getRootDefaults().getOption(contexts, s); } + @Override + public void performCacheCleanup() { + // do nothing, permission holders are "cleaned up" by a different task + } + @Override public void invalidateCaches() { // invalidate for all changes - this.parent.invalidateCachedData(); + this.parent.getCachedData().invalidate(); } } diff --git a/sponge/src/main/java/me/lucko/luckperms/sponge/tasks/ServiceCacheHousekeepingTask.java b/sponge/src/main/java/me/lucko/luckperms/sponge/tasks/ServiceCacheHousekeepingTask.java index a7a97ad27..d65f19562 100644 --- a/sponge/src/main/java/me/lucko/luckperms/sponge/tasks/ServiceCacheHousekeepingTask.java +++ b/sponge/src/main/java/me/lucko/luckperms/sponge/tasks/ServiceCacheHousekeepingTask.java @@ -40,7 +40,7 @@ public class ServiceCacheHousekeepingTask implements Runnable { public void run() { for (LPSubjectCollection collection : this.service.getLoadedCollections().values()) { for (LPSubject subject : collection.getLoadedSubjects()) { - subject.performCleanup(); + subject.performCacheCleanup(); } } }