From 6641e11fd98e4838d9787224ef535a5d19d26fa2 Mon Sep 17 00:00:00 2001 From: William278 Date: Sat, 20 Jan 2024 17:30:22 +0000 Subject: [PATCH] fix: high latency redis environments firing data updates twice --- .../java/net/william278/husksync/sync/DataSyncer.java | 10 ++++++++++ gradle.properties | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/common/src/main/java/net/william278/husksync/sync/DataSyncer.java b/common/src/main/java/net/william278/husksync/sync/DataSyncer.java index d202f8f3..5f948746 100644 --- a/common/src/main/java/net/william278/husksync/sync/DataSyncer.java +++ b/common/src/main/java/net/william278/husksync/sync/DataSyncer.java @@ -27,6 +27,7 @@ import net.william278.husksync.util.Task; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Function; @@ -107,11 +108,18 @@ public abstract class DataSyncer { protected void listenForRedisData(@NotNull OnlineUser user, @NotNull Supplier completionSupplier) { final AtomicLong timesRun = new AtomicLong(0L); final AtomicReference task = new AtomicReference<>(); + final AtomicBoolean processing = new AtomicBoolean(false); final Runnable runnable = () -> { if (user.isOffline()) { task.get().cancel(); return; } + // Ensure only one task is running at a time + if (processing.getAndSet(true)) { + return; + } + + // Timeout if the plugin is disabling or the max attempts have been reached if (plugin.isDisabling() || timesRun.getAndIncrement() > maxListenAttempts) { task.get().cancel(); plugin.debug(String.format("[%s] Redis timed out after %s attempts; setting from database", @@ -120,9 +128,11 @@ public abstract class DataSyncer { return; } + // Fire the completion supplier if (completionSupplier.get()) { task.get().cancel(); } + processing.set(false); }; task.set(plugin.getRepeatingTask(runnable, LISTEN_DELAY)); task.get().run(); diff --git a/gradle.properties b/gradle.properties index fc7e6ab8..5db38796 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ org.gradle.jvmargs='-Dfile.encoding=UTF-8' org.gradle.daemon=true javaVersion=16 -plugin_version=3.2.1 +plugin_version=3.2.2 plugin_archive=husksync plugin_description=A modern, cross-server player data synchronization system