From 258a73b1e832d1549f5e7d39aecd89e2f03edcc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maurice=20Eisenbl=C3=A4tter?= Date: Sun, 5 Apr 2026 01:37:29 +0200 Subject: [PATCH] fix: disk cache on paper 26.1 --- .../orebfuscator/OrebfuscatorDumpFile.java | 2 +- .../orebfuscator/logging/OfcLogger.java | 40 ++++++++++++------- .../imprex/orebfuscator/util/QuickMaths.java | 4 ++ .../nms/v26_1/RegionFileCache.java | 6 ++- .../obfuscation/ObfuscationAsyncListener.java | 4 +- 5 files changed, 38 insertions(+), 18 deletions(-) diff --git a/orebfuscator-core/src/main/java/dev/imprex/orebfuscator/OrebfuscatorDumpFile.java b/orebfuscator-core/src/main/java/dev/imprex/orebfuscator/OrebfuscatorDumpFile.java index 1e42db19..13a115d8 100644 --- a/orebfuscator-core/src/main/java/dev/imprex/orebfuscator/OrebfuscatorDumpFile.java +++ b/orebfuscator-core/src/main/java/dev/imprex/orebfuscator/OrebfuscatorDumpFile.java @@ -76,7 +76,7 @@ private void initialize() { orebfuscator.config().dumpBlocks(createSection("blocks")); Base64.Encoder encoder = Base64.getUrlEncoder(); - String latestLog = OfcLogger.getLatestVerboseLog(); + String latestLog = OfcLogger.getLatestLog(); set("verboseLog", encoder.encodeToString(latestLog.getBytes(StandardCharsets.UTF_8))); try { diff --git a/orebfuscator-core/src/main/java/dev/imprex/orebfuscator/logging/OfcLogger.java b/orebfuscator-core/src/main/java/dev/imprex/orebfuscator/logging/OfcLogger.java index a0b5ad32..db903ea4 100644 --- a/orebfuscator-core/src/main/java/dev/imprex/orebfuscator/logging/OfcLogger.java +++ b/orebfuscator-core/src/main/java/dev/imprex/orebfuscator/logging/OfcLogger.java @@ -1,8 +1,12 @@ package dev.imprex.orebfuscator.logging; +import dev.imprex.orebfuscator.util.QuickMaths; +import java.util.Map; import java.util.Objects; import java.util.Queue; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.atomic.AtomicLong; import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.Nullable; @@ -10,10 +14,11 @@ public class OfcLogger { private static LoggerAccessor logger = new SystemLogger(); - - private static final Queue VERBOSE_LOG = new ConcurrentLinkedQueue<>(); private static boolean verbose; + private static final Queue MESSAGE_LOG = new ConcurrentLinkedQueue<>(); + private static final Map COUNTERS = new ConcurrentHashMap<>(); + public static void setLogger(LoggerAccessor logger) { if (OfcLogger.logger instanceof SystemLogger) { OfcLogger.logger = Objects.requireNonNull(logger); @@ -29,8 +34,8 @@ public static void setVerboseLogging(boolean enabled) { } } - public static String getLatestVerboseLog() { - return String.join("\n", VERBOSE_LOG); + public static String getLatestLog() { + return String.join("\n", MESSAGE_LOG); } public static void debug(String message) { @@ -53,6 +58,15 @@ public static void error(String message, @Nullable Throwable throwable) { log(LogLevel.ERROR, message, throwable); } + public static void throttle(LogLevel level, String message) { + var count = COUNTERS.computeIfAbsent(message, k -> new AtomicLong()).incrementAndGet(); + if (count < 16) { + log(level, message); + } else if (QuickMaths.isPowerOfTwo(count)) { + log(level, "[x%d] %s".formatted(count, message)); + } + } + public static void log(LogLevel level, String message) { log(level, message, null); } @@ -61,18 +75,14 @@ public static void log(LogLevel level, String message, @Nullable Throwable throw Objects.requireNonNull(level); Objects.requireNonNull(message); - if (level == LogLevel.DEBUG) { - // always store debug messages for system dumps - while (VERBOSE_LOG.size() >= 1000) { - VERBOSE_LOG.poll(); - } - - VERBOSE_LOG.offer(message); + while (MESSAGE_LOG.size() >= 2048) { + MESSAGE_LOG.poll(); + } + MESSAGE_LOG.offer(message); - // filter out debug if verbose logging is disabled - if (!verbose) { - return; - } + // filter out debug if verbose logging is disabled + if (level == LogLevel.DEBUG && !verbose) { + return; } logger.log(level, message, throwable); diff --git a/orebfuscator-core/src/main/java/dev/imprex/orebfuscator/util/QuickMaths.java b/orebfuscator-core/src/main/java/dev/imprex/orebfuscator/util/QuickMaths.java index d285f348..0cf8c7b8 100644 --- a/orebfuscator-core/src/main/java/dev/imprex/orebfuscator/util/QuickMaths.java +++ b/orebfuscator-core/src/main/java/dev/imprex/orebfuscator/util/QuickMaths.java @@ -2,6 +2,10 @@ public class QuickMaths { + public static boolean isPowerOfTwo(long n) { + return (n & (n - 1)) == 0; + } + public static int ceilToPowerOfTwo(int value) { value--; value |= value >> 1; diff --git a/orebfuscator-nms/orebfuscator-nms-v26_1/src/main/java/net/imprex/orebfuscator/nms/v26_1/RegionFileCache.java b/orebfuscator-nms/orebfuscator-nms-v26_1/src/main/java/net/imprex/orebfuscator/nms/v26_1/RegionFileCache.java index 4df5aa1e..48eab3f5 100644 --- a/orebfuscator-nms/orebfuscator-nms-v26_1/src/main/java/net/imprex/orebfuscator/nms/v26_1/RegionFileCache.java +++ b/orebfuscator-nms/orebfuscator-nms-v26_1/src/main/java/net/imprex/orebfuscator/nms/v26_1/RegionFileCache.java @@ -9,8 +9,11 @@ import java.nio.file.Path; import net.minecraft.server.dedicated.DedicatedServer; import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.Level; import net.minecraft.world.level.chunk.storage.RegionFile; import net.minecraft.world.level.chunk.storage.RegionFileVersion; +import net.minecraft.world.level.chunk.storage.RegionStorageInfo; +import net.minecraft.world.level.levelgen.WorldDimensions; import org.bukkit.Bukkit; import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.Nullable; @@ -25,7 +28,8 @@ public class RegionFileCache extends AbstractRegionFileCache { @Override protected RegionFile createRegionFile(Path path) throws IOException { boolean isSyncChunkWrites = serverHandle(Bukkit.getServer(), DedicatedServer.class).forceSynchronousWrites(); - return new RegionFile(null, path, path.getParent(), RegionFileVersion.VERSION_NONE, isSyncChunkWrites); + RegionStorageInfo info = new RegionStorageInfo("orebfuscator", Level.OVERWORLD, "orebfuscator_cache"); + return new RegionFile(info, path, path.getParent(), RegionFileVersion.VERSION_NONE, isSyncChunkWrites); } @Override diff --git a/orebfuscator-plugin/src/main/java/net/imprex/orebfuscator/obfuscation/ObfuscationAsyncListener.java b/orebfuscator-plugin/src/main/java/net/imprex/orebfuscator/obfuscation/ObfuscationAsyncListener.java index b98abc47..b1e4358a 100644 --- a/orebfuscator-plugin/src/main/java/net/imprex/orebfuscator/obfuscation/ObfuscationAsyncListener.java +++ b/orebfuscator-plugin/src/main/java/net/imprex/orebfuscator/obfuscation/ObfuscationAsyncListener.java @@ -7,11 +7,13 @@ import com.comphenix.protocol.events.PacketAdapter; import com.comphenix.protocol.events.PacketEvent; import dev.imprex.orebfuscator.PermissionRequirements; +import dev.imprex.orebfuscator.logging.LogLevel; import dev.imprex.orebfuscator.logging.OfcLogger; import dev.imprex.orebfuscator.obfuscation.ObfuscationPipeline; import dev.imprex.orebfuscator.statistics.InjectorStatistics; import java.util.List; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Stream; import net.imprex.orebfuscator.Orebfuscator; import net.imprex.orebfuscator.iterop.BukkitChunkPacketAccessor; @@ -100,7 +102,7 @@ public void onPacketSending(PacketEvent event) { if (packet.isEmpty()) { future = CompletableFuture.completedFuture(null); } else { - OfcLogger.warn("Processing chunk packet async without an obfuscation future, that shouldn't happen!"); + OfcLogger.throttle(LogLevel.WARN, "Processing chunk packet async without an obfuscation future, that shouldn't happen!"); future = pipeline.request(world, player, packet, null).toCompletableFuture(); } }