mirror of
https://github.com/YatopiaMC/Yatopia.git
synced 2024-12-03 08:05:02 +01:00
c1a03b89af
* Updated Upstream and Sidestream(s) (Paper/Tuinity/Airplane/Purpur/Empirecraft) Upstream/An Sidestream has released updates that appears to apply and compile correctly This update has NOT been tested by YatopiaMC and as with ANY update, please do your own testing. Paper Changes: fbae9dbe0 [Auto] Updated Upstream (Bukkit/CraftBukkit) ac4a33aab [Auto] Updated Upstream (Bukkit) c1e07158b [Auto] Updated Upstream (Bukkit/CraftBukkit) 5e4b88e95 Fix dangling sout 23afda179 basic hostname validation 0fb8bdf0e Updated Upstream (Bukkit/CraftBukkit) (#5508) 88ab784da [Auto] Updated Upstream (CraftBukkit) ca7111d5f Fix PlayerItemConsumeEvent cancelling (fixes #4682) (#5383) 06fb560dc Add support for tab completing and highlighting console input from the Brigadier command tree (#5437) 0a9b89c7a Fix occasional light gen issues for neighbor blocks (#5500) a08be1ec7 [Auto] Updated Upstream (CraftBukkit) Tuinity Changes: 7d36676 Fix light source locking f1ec0c2 Add concurrency check to ProtoChunk light sources 159d146 Improvements to chunk loader system Airplane Changes: 3b3cde7 Correctly use DEAR values, fix config reloading dd60919 Updated Upstream (Tuinity) Purpur Changes: 5674cdc Updated Upstream (Paper) Empirecraft Changes: efda8c5b Updated Paper * Updated Upstream and Sidestream(s) (Paper/Tuinity) Upstream/An Sidestream has released updates that appears to apply and compile correctly This update has NOT been tested by YatopiaMC and as with ANY update, please do your own testing. Paper Changes: 39bf5b525 Update teams known as code owners Tuinity Changes: b12d0cc Replace ticket level propagator 42df8e1 Correctly handle recursion for chunkholder updates 73eb2a8 Do not copy visible chunks 8a4f3be Do not schedule poi task for each block write on chunk gen * Multithreaded Entity Tracker fixup
138 lines
7.1 KiB
Diff
138 lines
7.1 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Hugo Planque <hookwood01@gmail.com>
|
|
Date: Thu, 21 Jan 2021 17:56:03 +0100
|
|
Subject: [PATCH] New nbt cache
|
|
|
|
The goal of this patch is to reduce I/O operations from the main thread while saving player data and also to avoid too many I/O operations while reading NBT Player file by using a cache (Which start to delete the oldest data when there is too much player compared to the map size)
|
|
|
|
Co-authored-by: ishland <ishlandmc@yeah.net>
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
index 95922cdce7483f215aa139f280e20a8858955879..2309e55be7d120dc5b97a985ded4ea4178e7d1ac 100644
|
|
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
@@ -951,7 +951,9 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant<TickTas
|
|
}
|
|
// Spigot start
|
|
MCUtil.asyncExecutor.shutdown(); // Paper
|
|
+ this.worldNBTStorage.executorService.shutdown(); // Yatopia
|
|
try { MCUtil.asyncExecutor.awaitTermination(30, java.util.concurrent.TimeUnit.SECONDS); // Paper
|
|
+ this.worldNBTStorage.executorService.awaitTermination(30, java.util.concurrent.TimeUnit.SECONDS); // Yatopia - New async nbt cache
|
|
} catch (java.lang.InterruptedException ignored) {} // Paper
|
|
if (org.spigotmc.SpigotConfig.saveUserCacheOnStopOnly) {
|
|
LOGGER.info("Saving usercache.json");
|
|
diff --git a/src/main/java/net/minecraft/world/level/storage/WorldNBTStorage.java b/src/main/java/net/minecraft/world/level/storage/WorldNBTStorage.java
|
|
index d9c2c7a20953fc3bcdd07d70233ccf6e3748b14b..933b09169b2177f70412722264c0d5f129f3d93f 100644
|
|
--- a/src/main/java/net/minecraft/world/level/storage/WorldNBTStorage.java
|
|
+++ b/src/main/java/net/minecraft/world/level/storage/WorldNBTStorage.java
|
|
@@ -24,6 +24,11 @@ public class WorldNBTStorage {
|
|
private static final Logger LOGGER = LogManager.getLogger();
|
|
private final File playerDir;
|
|
protected final DataFixer a;
|
|
+ // Yatopia start - NBT Cache system
|
|
+ private final org.yatopiamc.yatopia.server.cache.NBTCache dataCache = new org.yatopiamc.yatopia.server.cache.NBTCache();
|
|
+ public final java.util.concurrent.ExecutorService executorService = java.util.concurrent.Executors.newSingleThreadExecutor(
|
|
+ new com.google.common.util.concurrent.ThreadFactoryBuilder().setDaemon(true).setPriority(Thread.NORM_PRIORITY - 1).build());
|
|
+ // Yatopia end
|
|
|
|
public WorldNBTStorage(Convertable.ConversionSession convertable_conversionsession, DataFixer datafixer) {
|
|
this.a = datafixer;
|
|
@@ -37,11 +42,22 @@ public class WorldNBTStorage {
|
|
NBTTagCompound nbttagcompound = entityhuman.save(new NBTTagCompound());
|
|
File file = File.createTempFile(entityhuman.getUniqueIDString() + "-", ".dat", this.playerDir);
|
|
|
|
- NBTCompressedStreamTools.a(nbttagcompound, file);
|
|
+ // NBTCompressedStreamTools.a(nbttagcompound, file); // Yatopia
|
|
+ // Yatopia start - NBT Cache system
|
|
+ Runnable task = () -> { try { NBTCompressedStreamTools.a(nbttagcompound, file);
|
|
File file1 = new File(this.playerDir, entityhuman.getUniqueIDString() + ".dat");
|
|
File file2 = new File(this.playerDir, entityhuman.getUniqueIDString() + ".dat_old");
|
|
|
|
SystemUtils.a(file1, file, file2);
|
|
+ } catch (Exception exception) {
|
|
+ WorldNBTStorage.LOGGER.error("Failed to save player data for {}", entityhuman.getName(), exception); // Paper
|
|
+ }
|
|
+ };
|
|
+ synchronized (this.dataCache){
|
|
+ this.dataCache.put(file, nbttagcompound);
|
|
+ }
|
|
+ this.executorService.execute(task);
|
|
+ // Yatopia end
|
|
} catch (Exception exception) {
|
|
WorldNBTStorage.LOGGER.error("Failed to save player data for {}", entityhuman.getName(), exception); // Paper
|
|
}
|
|
@@ -57,9 +73,18 @@ public class WorldNBTStorage {
|
|
// Spigot Start
|
|
boolean usingWrongFile = false;
|
|
boolean normalFile = file.exists() && file.isFile(); // Akarin - ensures normal file
|
|
- if ( org.bukkit.Bukkit.getOnlineMode() && !normalFile ) // Paper - Check online mode first // Akarin - ensures normal file
|
|
+ // if ( org.bukkit.Bukkit.getOnlineMode() && !normalFile ) // Paper - Check online mode first // Akarin - ensures normal file // Yatopia
|
|
+ // Yatopia start - NBT Cache system
|
|
+ NBTTagCompound playerData;
|
|
+ synchronized (this.dataCache){
|
|
+ playerData = this.dataCache.get(file);
|
|
+ }
|
|
+ if (playerData == null && org.bukkit.Bukkit.getOnlineMode() && !normalFile ) // Paper - Check online mode first // Akarin - ensures normal file
|
|
{
|
|
file = new File( this.playerDir, java.util.UUID.nameUUIDFromBytes( ( "OfflinePlayer:" + entityhuman.getName() ).getBytes( "UTF-8" ) ).toString() + ".dat");
|
|
+ synchronized (this.dataCache){
|
|
+ playerData = this.dataCache.get(file);
|
|
+ }
|
|
if ( file.exists() )
|
|
{
|
|
usingWrongFile = true;
|
|
@@ -67,10 +92,13 @@ public class WorldNBTStorage {
|
|
}
|
|
}
|
|
// Spigot End
|
|
-
|
|
- if (normalFile) { // Akarin - avoid double I/O operation
|
|
+ // if (normalFile) { // Akarin - avoid double I/O operation // Yatopia
|
|
+ if (playerData != null) {
|
|
+ nbttagcompound = playerData;
|
|
+ } else if (normalFile) { // Akarin - avoid double I/O operation
|
|
nbttagcompound = NBTCompressedStreamTools.a(file);
|
|
}
|
|
+ // Yatopia end
|
|
// Spigot Start
|
|
if ( usingWrongFile )
|
|
{
|
|
diff --git a/src/main/java/org/yatopiamc/yatopia/server/cache/NBTCache.java b/src/main/java/org/yatopiamc/yatopia/server/cache/NBTCache.java
|
|
new file mode 100644
|
|
index 0000000000000000000000000000000000000000..d739a71c91b54d156f6e1d8487add372a06d5939
|
|
--- /dev/null
|
|
+++ b/src/main/java/org/yatopiamc/yatopia/server/cache/NBTCache.java
|
|
@@ -0,0 +1,32 @@
|
|
+package org.yatopiamc.yatopia.server.cache;
|
|
+
|
|
+import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenCustomHashMap;
|
|
+import net.minecraft.server.MinecraftServer;
|
|
+import net.minecraft.nbt.NBTTagCompound;
|
|
+
|
|
+import java.io.File;
|
|
+
|
|
+public class NBTCache extends Object2ObjectLinkedOpenCustomHashMap<File, NBTTagCompound> {
|
|
+
|
|
+ public NBTCache() {
|
|
+ super(100, 0.75F, new Strategy<File>() {
|
|
+ @Override
|
|
+ public int hashCode(File k) {
|
|
+ return k.hashCode();
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public boolean equals(File k, File k1) {
|
|
+ return k.equals(k1);
|
|
+ }
|
|
+ });
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public NBTTagCompound put(File k, NBTTagCompound v) {
|
|
+ if (this.size() > MinecraftServer.getServer().getPlayerCount()) {
|
|
+ this.removeLast();
|
|
+ }
|
|
+ return super.putAndMoveToFirst(k, v);
|
|
+ }
|
|
+}
|