Security fixes
This commit is contained in:
@@ -134,11 +134,6 @@
|
||||
<artifactId>mixin</artifactId>
|
||||
<version>0.7.8-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.openhft</groupId>
|
||||
<artifactId>chronicle-queue</artifactId>
|
||||
<version>4.16.1</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<repositories>
|
||||
|
||||
@@ -1,8 +1,12 @@
|
||||
package io.akarin.api;
|
||||
|
||||
import java.util.concurrent.ThreadFactory;
|
||||
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
|
||||
import com.google.common.util.concurrent.ThreadFactoryBuilder;
|
||||
|
||||
public abstract class LogWrapper {
|
||||
/**
|
||||
* A common logger used by mixin classes
|
||||
@@ -13,4 +17,9 @@ public abstract class LogWrapper {
|
||||
* Temporarily disable desync timings error, moreover it's worthless to trace async operation
|
||||
*/
|
||||
public static volatile boolean silentTiming;
|
||||
|
||||
/**
|
||||
* A common thread pool factory
|
||||
*/
|
||||
public static final ThreadFactory STAGE_FACTORY = new ThreadFactoryBuilder().setNameFormat("Akarin Schedule Thread - %1$d").build();
|
||||
}
|
||||
|
||||
@@ -157,9 +157,4 @@ public class AkarinGlobalConfig {
|
||||
private static void registryTerminationSeconds() {
|
||||
registryTerminationSeconds = getSeconds(getString("bootstrap.parallel-registry-termination", "9s"));
|
||||
}
|
||||
|
||||
public static boolean primaryWorldServer;
|
||||
private static void primaryWorldServer() {
|
||||
primaryWorldServer = getBoolean("bonus.primary-world-server", false);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ import java.util.concurrent.ExecutorCompletionService;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.FutureTask;
|
||||
import org.bukkit.craftbukkit.CraftServer;
|
||||
import org.bukkit.craftbukkit.chunkio.ChunkIOExecutor;
|
||||
import org.spongepowered.asm.mixin.Final;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Mutable;
|
||||
@@ -55,7 +56,7 @@ public class MixinMinecraftServer {
|
||||
@Shadow public ServerConnection an() { return null; }
|
||||
@Shadow public CustomFunctionData aL() { return null; }
|
||||
|
||||
private final ExecutorCompletionService<Void> STAGE_WORLD_TICK = new ExecutorCompletionService<Void>(Executors.newWorkStealingPool(3));
|
||||
private final ExecutorCompletionService<Void> STAGE_WORLD_TICK = new ExecutorCompletionService<Void>(Executors.newFixedThreadPool(2, LogWrapper.STAGE_FACTORY));
|
||||
|
||||
@Overwrite
|
||||
public void D() throws InterruptedException {
|
||||
@@ -63,19 +64,14 @@ public class MixinMinecraftServer {
|
||||
this.server.getScheduler().mainThreadHeartbeat(this.ticks); // CraftBukkit
|
||||
MinecraftTimings.bukkitSchedulerTimer.stopTiming(); // Paper
|
||||
MinecraftTimings.minecraftSchedulerTimer.startTiming(); // Paper
|
||||
Queue queue = this.j;
|
||||
|
||||
// Spigot start
|
||||
FutureTask<?> entry;
|
||||
int count = this.j.size();
|
||||
while (count-- > 0 && (entry = this.j.poll()) != null) {
|
||||
SystemUtils.a(entry, MinecraftServer.LOGGER);
|
||||
}
|
||||
// Spigot end
|
||||
MinecraftTimings.minecraftSchedulerTimer.stopTiming(); // Paper
|
||||
|
||||
// CraftBukkit start
|
||||
// Run tasks that are waiting on processing
|
||||
MinecraftTimings.processQueueTimer.startTiming(); // Spigot
|
||||
while (!processQueue.isEmpty()) {
|
||||
processQueue.remove().run();
|
||||
@@ -83,7 +79,7 @@ public class MixinMinecraftServer {
|
||||
MinecraftTimings.processQueueTimer.stopTiming(); // Spigot
|
||||
|
||||
MinecraftTimings.chunkIOTickTimer.startTiming(); // Spigot
|
||||
org.bukkit.craftbukkit.chunkio.ChunkIOExecutor.tick();
|
||||
ChunkIOExecutor.tick();
|
||||
MinecraftTimings.chunkIOTickTimer.stopTiming(); // Spigot
|
||||
|
||||
MinecraftTimings.timeUpdateTimer.startTiming(); // Spigot
|
||||
@@ -96,13 +92,12 @@ public class MixinMinecraftServer {
|
||||
}
|
||||
MinecraftTimings.timeUpdateTimer.stopTiming(); // Spigot
|
||||
|
||||
int i;
|
||||
|
||||
for (i = 0; i < this.worlds.size(); ++i) { // CraftBukkit
|
||||
for (int i = 0; i < this.worlds.size(); ++i) { // CraftBukkit
|
||||
WorldServer worldserver = this.worlds.get(i);
|
||||
// TODO Fix this feature
|
||||
// TileEntityHopper.skipHopperEvents = worldserver.paperConfig.disableHopperMoveEvents || org.bukkit.event.inventory.InventoryMoveItemEvent.getHandlerList().getRegisteredListeners().length == 0;
|
||||
|
||||
LogWrapper.silentTiming = true;
|
||||
STAGE_WORLD_TICK.submit(() -> {
|
||||
try {
|
||||
worldserver.doTick();
|
||||
@@ -122,7 +117,7 @@ public class MixinMinecraftServer {
|
||||
try {
|
||||
worldserver.tickEntities();
|
||||
} catch (Throwable throwable1) {
|
||||
CrashReport crashreport = null;
|
||||
CrashReport crashreport;
|
||||
try {
|
||||
crashreport = CrashReport.a(throwable1, "Exception ticking world entities");
|
||||
} catch (Throwable t){
|
||||
@@ -133,37 +128,36 @@ public class MixinMinecraftServer {
|
||||
}
|
||||
}, null);
|
||||
|
||||
LogWrapper.silentTiming = true;
|
||||
worldserver.timings.doTick.startTiming();
|
||||
STAGE_WORLD_TICK.take(); // Block
|
||||
worldserver.timings.doTick.stopTiming();
|
||||
|
||||
worldserver.timings.tickEntities.startTiming();
|
||||
STAGE_WORLD_TICK.take(); // Entity
|
||||
worldserver.timings.tickEntities.stopTiming();
|
||||
LogWrapper.silentTiming = false;
|
||||
worldserver.timings.tickEntities.stopTiming();
|
||||
|
||||
worldserver.getTracker().updatePlayers();
|
||||
worldserver.explosionDensityCache.clear(); // Paper - Optimize explosions
|
||||
}
|
||||
|
||||
MinecraftTimings.connectionTimer.startTiming(); // Spigot
|
||||
MinecraftTimings.connectionTimer.startTiming();
|
||||
this.an().c();
|
||||
MinecraftTimings.connectionTimer.stopTiming(); // Spigot
|
||||
MinecraftTimings.connectionTimer.stopTiming();
|
||||
|
||||
MinecraftTimings.playerListTimer.startTiming(); // Spigot
|
||||
MinecraftTimings.playerListTimer.startTiming();
|
||||
this.v.tick();
|
||||
MinecraftTimings.playerListTimer.stopTiming(); // Spigot
|
||||
MinecraftTimings.playerListTimer.stopTiming();
|
||||
|
||||
MinecraftTimings.commandFunctionsTimer.startTiming(); // Spigot
|
||||
MinecraftTimings.commandFunctionsTimer.startTiming();
|
||||
this.aL().e();
|
||||
MinecraftTimings.commandFunctionsTimer.stopTiming(); // Spigot
|
||||
MinecraftTimings.commandFunctionsTimer.stopTiming();
|
||||
|
||||
MinecraftTimings.tickablesTimer.startTiming(); // Spigot
|
||||
for (i = 0; i < this.o.size(); ++i) {
|
||||
MinecraftTimings.tickablesTimer.startTiming();
|
||||
for (int i = 0; i < this.o.size(); ++i) {
|
||||
this.o.get(i).e();
|
||||
}
|
||||
MinecraftTimings.tickablesTimer.stopTiming(); // Spigot
|
||||
MinecraftTimings.tickablesTimer.stopTiming();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -2,7 +2,6 @@ package io.akarin.server.mixin.core;
|
||||
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.ThreadFactory;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
@@ -11,8 +10,7 @@ import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
|
||||
import com.google.common.util.concurrent.ThreadFactoryBuilder;
|
||||
|
||||
import io.akarin.api.LogWrapper;
|
||||
import io.akarin.server.core.AkarinGlobalConfig;
|
||||
import net.minecraft.server.BiomeBase;
|
||||
import net.minecraft.server.Block;
|
||||
@@ -28,21 +26,19 @@ import net.minecraft.server.SoundEffect;
|
||||
|
||||
@Mixin(value = DispenserRegistry.class, remap = false)
|
||||
public class ParallelRegistry {
|
||||
private static final ThreadFactory STAGE_FACTORY = new ThreadFactoryBuilder().setNameFormat("Akarin Parallel Registry Thread - %1$d").build();
|
||||
|
||||
/**
|
||||
* Registry order: SoundEffect -> Block
|
||||
*/
|
||||
private static final ExecutorService STAGE_BLOCK = Executors.newSingleThreadExecutor(STAGE_FACTORY);
|
||||
private static final ExecutorService STAGE_BLOCK = Executors.newSingleThreadExecutor(LogWrapper.STAGE_FACTORY);
|
||||
/**
|
||||
* Registry order: Item -> PotionBrewer & orderless: BlockFire, BiomeBase (After STAGE_BLOCK)
|
||||
*/
|
||||
private static final ExecutorService STAGE_BLOCK_BASE = Executors.newWorkStealingPool(3);
|
||||
private static final ExecutorService STAGE_BLOCK_BASE = Executors.newFixedThreadPool(3, LogWrapper.STAGE_FACTORY);
|
||||
|
||||
/**
|
||||
* Registry order: MobEffectList -> PotionRegistry & orderless: Enchantment, EntityTypes
|
||||
*/
|
||||
private static final ExecutorService STAGE_STANDALONE = Executors.newWorkStealingPool(3);
|
||||
private static final ExecutorService STAGE_STANDALONE = Executors.newFixedThreadPool(3, LogWrapper.STAGE_FACTORY);
|
||||
|
||||
private static final int TERMINATION_IN_SEC = AkarinGlobalConfig.registryTerminationSeconds;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user