mirror of
https://github.com/YatopiaMC/Yatopia.git
synced 2025-02-20 14:21:33 +01:00
New async nbt cache (#347)
This commit is contained in:
parent
224376504d
commit
7073c23bbb
@ -242,6 +242,7 @@ # Patches
|
||||
| server | Multi-Threaded ticking CraftBukkit | Spottedleaf | |
|
||||
| server | Name craft scheduler threads according to the plugin using | Spottedleaf | |
|
||||
| server | New Network System | Hugo Planque | Ivan Pekov |
|
||||
| server | New nbt cache | Hugo Planque | |
|
||||
| server | Nuke streams off BlockPosition | Ivan Pekov | |
|
||||
| server | Nuke streams off SectionPosition | Ivan Pekov | |
|
||||
| server | Optimise EntityInsentient#checkDespawn | Spottedleaf | |
|
||||
|
129
patches/server/0068-New-nbt-cache.patch
Normal file
129
patches/server/0068-New-nbt-cache.patch
Normal file
@ -0,0 +1,129 @@
|
||||
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)
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
|
||||
index a1c2bea7c93433434b4e4dfd0bb4b9620657c40d..c7f1bf9d7fd86a1afbc1e4bb56dc56cef367283e 100644
|
||||
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
|
||||
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
|
||||
@@ -824,7 +824,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/server/WorldNBTStorage.java b/src/main/java/net/minecraft/server/WorldNBTStorage.java
|
||||
index 1f77b251d7e7b0f023793cbf0876fc067caa75c1..ab43806fc4edbf2d07291f3b147563ba1de48f5d 100644
|
||||
--- a/src/main/java/net/minecraft/server/WorldNBTStorage.java
|
||||
+++ b/src/main/java/net/minecraft/server/WorldNBTStorage.java
|
||||
@@ -17,6 +17,8 @@ public class WorldNBTStorage {
|
||||
private static final Logger LOGGER = LogManager.getLogger();
|
||||
private final File playerDir;
|
||||
protected final DataFixer a;
|
||||
+ private final org.yatopiamc.yatopia.server.cache.NBTCache<File, NBTTagCompound> dataCache = new org.yatopiamc.yatopia.server.cache.NBTCache<>(); // Yatopia - NBT Cache system
|
||||
+ public final java.util.concurrent.ExecutorService executorService = java.util.concurrent.Executors.newSingleThreadExecutor(); // Yatopia - NBT Cache system
|
||||
|
||||
public WorldNBTStorage(Convertable.ConversionSession convertable_conversionsession, DataFixer datafixer) {
|
||||
this.a = datafixer;
|
||||
@@ -30,11 +32,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
|
||||
}
|
||||
@@ -50,9 +63,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;
|
||||
@@ -60,10 +82,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..adc5975ded5f655a7b5da59daa1ff3b63697f841
|
||||
--- /dev/null
|
||||
+++ b/src/main/java/org/yatopiamc/yatopia/server/cache/NBTCache.java
|
||||
@@ -0,0 +1,29 @@
|
||||
+package org.yatopiamc.yatopia.server.cache;
|
||||
+
|
||||
+import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenCustomHashMap;
|
||||
+import net.minecraft.server.MinecraftServer;
|
||||
+
|
||||
+public class NBTCache<K, V> extends Object2ObjectLinkedOpenCustomHashMap<K, V> {
|
||||
+
|
||||
+ public NBTCache() {
|
||||
+ super(100, 0.75F, new Strategy<K>() {
|
||||
+ @Override
|
||||
+ public int hashCode(K k) {
|
||||
+ return k.hashCode();
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public boolean equals(K k, K k1) {
|
||||
+ return k.equals(k1);
|
||||
+ }
|
||||
+ });
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public V put(K k, V v) {
|
||||
+ if (this.size() > MinecraftServer.getServer().getPlayerCount()) {
|
||||
+ this.removeLast();
|
||||
+ }
|
||||
+ return super.putAndMoveToFirst(k, v);
|
||||
+ }
|
||||
+}
|
Loading…
Reference in New Issue
Block a user