Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,24 @@
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;

@NullMarked
public class OfcLogger {

private static LoggerAccessor logger = new SystemLogger();

private static final Queue<String> VERBOSE_LOG = new ConcurrentLinkedQueue<>();
private static boolean verbose;

private static final Queue<String> MESSAGE_LOG = new ConcurrentLinkedQueue<>();
private static final Map<String, AtomicLong> COUNTERS = new ConcurrentHashMap<>();

public static void setLogger(LoggerAccessor logger) {
if (OfcLogger.logger instanceof SystemLogger) {
OfcLogger.logger = Objects.requireNonNull(logger);
Expand All @@ -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) {
Expand All @@ -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);
}
Expand All @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -25,7 +28,8 @@ public class RegionFileCache extends AbstractRegionFileCache<RegionFile> {
@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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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();
}
}
Expand Down
Loading