From b870865996efcaaa0effea8d44e2ca598612d0a8 Mon Sep 17 00:00:00 2001 From: AlexProgrammerDE <40795980+AlexProgrammerDE@users.noreply.github.com> Date: Mon, 10 Aug 2026 16:07:56 +0200 Subject: [PATCH] perf(queue): skip unused server status checks --- .../pistonqueue/shared/config/Config.java | 13 ++++++++ .../shared/plugin/PistonQueuePlugin.java | 11 +++++-- .../shared/queue/ServerStatusManager.java | 4 +++ .../pistonqueue/shared/config/ConfigTest.java | 31 +++++++++++++++++++ .../queue/logic/ServerStatusManagerTest.java | 18 +++++++++++ 5 files changed, 74 insertions(+), 3 deletions(-) diff --git a/shared/src/main/java/net/pistonmaster/pistonqueue/shared/config/Config.java b/shared/src/main/java/net/pistonmaster/pistonqueue/shared/config/Config.java index 4ebb00bb..2c6b262d 100644 --- a/shared/src/main/java/net/pistonmaster/pistonqueue/shared/config/Config.java +++ b/shared/src/main/java/net/pistonmaster/pistonqueue/shared/config/Config.java @@ -327,6 +327,19 @@ public List kickWhenDownServers() { return Collections.unmodifiableList(kickWhenDownServers); } + public Set serversRequiringOnlineChecks() { + Set servers = new LinkedHashSet<>(); + if (pauseQueueIfTargetDown) { + for (QueueGroup group : queueGroupList) { + servers.addAll(group.targetServers()); + } + } + if (kickWhenDown) { + servers.addAll(kickWhenDownServers); + } + return Collections.unmodifiableSet(servers); + } + public boolean ifTargetDownSendToQueue() { return ifTargetDownSendToQueue; } diff --git a/shared/src/main/java/net/pistonmaster/pistonqueue/shared/plugin/PistonQueuePlugin.java b/shared/src/main/java/net/pistonmaster/pistonqueue/shared/plugin/PistonQueuePlugin.java index 34b54cbd..1f48bdad 100644 --- a/shared/src/main/java/net/pistonmaster/pistonqueue/shared/plugin/PistonQueuePlugin.java +++ b/shared/src/main/java/net/pistonmaster/pistonqueue/shared/plugin/PistonQueuePlugin.java @@ -73,7 +73,8 @@ default void scheduleTasks(QueueListenerShared queueListener) { final QueueGroup defaultGroup = config.getDefaultGroup(); // Sends the position message and updates tab on an interval in chat schedule(() -> { - boolean targetsOnline = defaultGroup.targetServers().stream().anyMatch(queueListener.getServerStatusManager().getOnlineServers()::contains); + boolean targetsOnline = !config.pauseQueueIfTargetDown() + || defaultGroup.targetServers().stream().anyMatch(queueListener.getServerStatusManager().getOnlineServers()::contains); if (targetsOnline) { for (QueueType type : config.getAllQueueTypes()) { if (config.positionMessageChat()) { @@ -109,9 +110,13 @@ default void scheduleTasks(QueueListenerShared queueListener) { // Moves the queue when someone logs off the target server on an interval set in the config.yml schedule(queueListener::moveQueue, config.queueMoveDelay(), config.queueMoveDelay(), TimeUnit.MILLISECONDS); - // Checks the status of all the servers + // Checks the status of servers used by enabled availability features schedule(() -> { - List servers = new ArrayList<>(config.kickWhenDownServers()); + Set servers = config.serversRequiringOnlineChecks(); + queueListener.getServerStatusManager().retainServers(servers); + if (servers.isEmpty()) { + return; + } CountDownLatch latch = new CountDownLatch(servers.size()); for (String server : servers) { CompletableFuture.runAsync(() -> { diff --git a/shared/src/main/java/net/pistonmaster/pistonqueue/shared/queue/ServerStatusManager.java b/shared/src/main/java/net/pistonmaster/pistonqueue/shared/queue/ServerStatusManager.java index fc7d75a9..7aa9ebbd 100644 --- a/shared/src/main/java/net/pistonmaster/pistonqueue/shared/queue/ServerStatusManager.java +++ b/shared/src/main/java/net/pistonmaster/pistonqueue/shared/queue/ServerStatusManager.java @@ -39,6 +39,10 @@ public Set getOnlineServers() { .collect(Collectors.toSet()); } + public void retainServers(Set servers) { + onlinePingCounts.keySet().removeIf(server -> !servers.contains(server)); + } + // For testing purposes so we can assert there is no overflow risk public int getOnlinePingCount(String server) { return onlinePingCounts.getOrDefault(server, 0); diff --git a/shared/src/test/java/net/pistonmaster/pistonqueue/shared/config/ConfigTest.java b/shared/src/test/java/net/pistonmaster/pistonqueue/shared/config/ConfigTest.java index 3d82d364..96165446 100644 --- a/shared/src/test/java/net/pistonmaster/pistonqueue/shared/config/ConfigTest.java +++ b/shared/src/test/java/net/pistonmaster/pistonqueue/shared/config/ConfigTest.java @@ -158,6 +158,37 @@ void kickWhenDownServersDeduplicates() { assertEquals(1, server1Count); } + @Test + void skipsOnlineChecksWhenNoAvailabilityFeatureNeedsThem() { + Config config = new Config(); + config.copyFrom(config); + config.setPauseQueueIfTargetDown(false); + config.setKickWhenDown(false); + + assertTrue(config.serversRequiringOnlineChecks().isEmpty()); + } + + @Test + void checksTargetServersWhenQueuePausingIsEnabled() { + Config config = new Config(); + config.copyFrom(config); + config.setPauseQueueIfTargetDown(true); + config.setKickWhenDown(false); + + assertEquals(Set.of("main"), config.serversRequiringOnlineChecks()); + } + + @Test + void checksConfiguredServersWhenDownKickingIsEnabled() { + Config config = new Config(); + config.copyFrom(config); + config.setPauseQueueIfTargetDown(false); + config.setKickWhenDown(true); + config.setRawKickWhenDownServers(List.of("main", "queue")); + + assertEquals(Set.of("main", "queue"), config.serversRequiringOnlineChecks()); + } + @Test void queueTypesAreSortedByOrder() { Config config = createConfigWithMultipleQueueTypes(); diff --git a/shared/src/test/java/net/pistonmaster/pistonqueue/shared/queue/logic/ServerStatusManagerTest.java b/shared/src/test/java/net/pistonmaster/pistonqueue/shared/queue/logic/ServerStatusManagerTest.java index 286f082f..1c01c201 100644 --- a/shared/src/test/java/net/pistonmaster/pistonqueue/shared/queue/logic/ServerStatusManagerTest.java +++ b/shared/src/test/java/net/pistonmaster/pistonqueue/shared/queue/logic/ServerStatusManagerTest.java @@ -4,6 +4,8 @@ import net.pistonmaster.pistonqueue.shared.queue.ServerStatusManager; import org.junit.jupiter.api.Test; +import java.util.Set; + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -57,6 +59,22 @@ void offlineAfterOneTime() { assertTrue(serverStatusManager.getOnlineServers().isEmpty()); } + @Test + void removesStatusForServersThatNoLongerNeedChecks() { + Config config = QueueTestUtils.createConfigWithSingleQueueType(5); + config.setMinOnlineChecks(1); + + QueueTestUtils.TestQueuePlugin plugin = new QueueTestUtils.TestQueuePlugin(config); + ServerStatusManager serverStatusManager = new ServerStatusManager(plugin::getConfiguration); + serverStatusManager.online("kept"); + serverStatusManager.online("removed"); + + serverStatusManager.retainServers(Set.of("kept")); + + assertEquals(Set.of("kept"), serverStatusManager.getOnlineServers()); + assertEquals(0, serverStatusManager.getOnlinePingCount("removed")); + } + @Test void onlineWithZeroMinChecks() { Config config = QueueTestUtils.createConfigWithSingleQueueType(5);