Drop async advancements patch for now

Dropped per the advice of Proximyst. Has possible issues if players log in while they are still logging out from another location, with increased risk during lag spikes. A fix/workaround is possible in the future, but for the time being we will just drop this patch to avoid any potential problems.
This commit is contained in:
jmp
2020-12-28 02:50:53 -08:00
parent 3d455ff2d5
commit 0bae78d9c3
17 changed files with 3 additions and 159 deletions

View File

@@ -1,156 +0,0 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Mariell Hoversholm <proximyst@proximyst.com>
Date: Thu, 20 Aug 2020 17:57:02 +0200
Subject: [PATCH] PaperPR - Apply advancements async
diff --git a/src/main/java/net/minecraft/server/AdvancementDataPlayer.java b/src/main/java/net/minecraft/server/AdvancementDataPlayer.java
index eaa1063ff2bc5621e93043c4de41ca62f1323fde..a3b89a4f2a291b9a9bf847e059c6b926ea9db9b2 100644
--- a/src/main/java/net/minecraft/server/AdvancementDataPlayer.java
+++ b/src/main/java/net/minecraft/server/AdvancementDataPlayer.java
@@ -63,6 +63,7 @@ public class AdvancementDataPlayer {
this.d(advancementdataworld);
}
+ public final void setPlayer(EntityPlayer entityPlayer) { this.a(entityPlayer); } // Paper - OBFHELPER
public void a(EntityPlayer entityplayer) {
this.player = entityplayer;
}
diff --git a/src/main/java/net/minecraft/server/CriterionProgress.java b/src/main/java/net/minecraft/server/CriterionProgress.java
index 98c3884f478aed1eba82c15f258ebfa1c7203b14..244b58a7c41d2b0ba3117550282e68a168439708 100644
--- a/src/main/java/net/minecraft/server/CriterionProgress.java
+++ b/src/main/java/net/minecraft/server/CriterionProgress.java
@@ -10,8 +10,9 @@ import java.util.Date;
public class CriterionProgress {
- private static final SimpleDateFormat a = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
- private Date b;
+ private static final SimpleDateFormat a = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z"); // Paper - diff on change
+ private static final ThreadLocal<SimpleDateFormat> THREAD_LOCAL_FORMATTER = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z")); // Paper - async advancements - SimpleDateFormat is not thread safe
+ private Date b; private void setDate(Date date) { this.b = date; } // Paper - OBFHELPER
public CriterionProgress() {}
@@ -44,7 +45,7 @@ public class CriterionProgress {
}
public JsonElement e() {
- return (JsonElement) (this.b != null ? new JsonPrimitive(CriterionProgress.a.format(this.b)) : JsonNull.INSTANCE);
+ return this.getDate() != null ? new JsonPrimitive(THREAD_LOCAL_FORMATTER.get().format(this.getDate())) : JsonNull.INSTANCE; // Paper
}
public static CriterionProgress b(PacketDataSerializer packetdataserializer) {
@@ -61,7 +62,7 @@ public class CriterionProgress {
CriterionProgress criterionprogress = new CriterionProgress();
try {
- criterionprogress.b = CriterionProgress.a.parse(s);
+ criterionprogress.setDate(THREAD_LOCAL_FORMATTER.get().parse(s)); // Paper
return criterionprogress;
} catch (ParseException parseexception) {
throw new JsonSyntaxException("Invalid datetime: " + s, parseexception);
diff --git a/src/main/java/net/minecraft/server/EntityPlayer.java b/src/main/java/net/minecraft/server/EntityPlayer.java
index 50cd947d0e47e7897a071fdf8ff6e5834e137d58..5e4cc5e8f71c1c657041159305ce3e4a9aa9f46b 100644
--- a/src/main/java/net/minecraft/server/EntityPlayer.java
+++ b/src/main/java/net/minecraft/server/EntityPlayer.java
@@ -51,7 +51,8 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
public final MinecraftServer server;
public final PlayerInteractManager playerInteractManager;
public final Deque<Integer> removeQueue = new ArrayDeque<>(); // Paper
- private final AdvancementDataPlayer advancementDataPlayer;
+ private AdvancementDataPlayer advancementDataPlayer; // Paper - remove final
+ private final java.util.concurrent.CompletableFuture<AdvancementDataPlayer> advancementDataPlayerCompletableFuture; // Paper - async advancements
private final ServerStatisticManager serverStatisticManager;
private float lastHealthScored = Float.MIN_VALUE;
private int lastFoodScored = Integer.MIN_VALUE;
@@ -138,7 +139,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
this.playerInteractManager = playerinteractmanager;
this.server = minecraftserver;
this.serverStatisticManager = minecraftserver.getPlayerList().getStatisticManager(this);
- this.advancementDataPlayer = minecraftserver.getPlayerList().f(this);
+ this.advancementDataPlayerCompletableFuture = minecraftserver.getPlayerList().loadAdvancementDataPlayerAsync(this); // Paper - async advancements
this.G = 1.0F;
//this.c(worldserver); // Paper - don't move to spawn on login, only first join
this.co = minecraftserver.a(this);
@@ -507,7 +508,8 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
CriterionTriggers.u.a(this, this.cf, this.ticksLived - this.cg);
}
- this.advancementDataPlayer.b(this);
+ if (areAdvancementsLoaded()) // Paper - async advancements: don't tick advancements until they're loaded
+ this.advancementDataPlayer.sendUpdateIfNeeded(this); // Paper - conflict on change
// Purpur start
if (this.world.purpurConfig.useNightVisionWhenRiding && this.getVehicle() != null && this.getVehicle().getRider() == this && world.getTime() % 100 == 0) { // 5 seconds
@@ -2134,7 +2136,26 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
this.worldChangeInvuln = false;
}
+ // Paper start - async advancements
+ public boolean areAdvancementsLoaded() {
+ return this.advancementDataPlayer != null
+ || this.advancementDataPlayerCompletableFuture.isDone();
+ }
+
+ public AdvancementDataPlayer getAdvancementDataIfLoadedImmediately() {
+ // We need a null check here because this method is called before the future is assigned.
+ // Once assigned, it will essentially be a no-op as the field is final.
+ if (this.advancementDataPlayer == null && this.advancementDataPlayerCompletableFuture != null && this.advancementDataPlayerCompletableFuture.isDone())
+ this.advancementDataPlayer = this.advancementDataPlayerCompletableFuture.join();
+ return this.advancementDataPlayer;
+ }
+
public AdvancementDataPlayer getAdvancementData() {
+ if (this.advancementDataPlayer == null)
+ synchronized (this.advancementDataPlayerCompletableFuture) {
+ if (this.advancementDataPlayer == null) this.advancementDataPlayer = this.advancementDataPlayerCompletableFuture.join();
+ }
+ // Paper end
return this.advancementDataPlayer;
}
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
index 2374a7ee018493795389b21848289395168db422..6c9a8d92e70106635699e55367eed60ac95c3290 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
@@ -2315,6 +2315,7 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant<TickTas
return methodprofilerresults;
}
+ public final java.nio.file.Path getSavedFilePath(SavedFile savedFile) { return this.a(savedFile); } // Paper - OBFHELPER
public java.nio.file.Path a(SavedFile savedfile) {
return this.convertable.getWorldFolder(savedfile);
}
diff --git a/src/main/java/net/minecraft/server/PlayerList.java b/src/main/java/net/minecraft/server/PlayerList.java
index 7b385eb43e4cf565d500d0250f3c5e4dbebae986..eae19141e3cc890d3b4bdc0d0297061e79857160 100644
--- a/src/main/java/net/minecraft/server/PlayerList.java
+++ b/src/main/java/net/minecraft/server/PlayerList.java
@@ -1339,9 +1339,26 @@ public abstract class PlayerList {
return serverstatisticmanager;
}
+ // Paper start - async advancements
+ public java.util.concurrent.CompletableFuture<AdvancementDataPlayer> loadAdvancementDataPlayerAsync(EntityPlayer entityPlayer) {
+ if (entityPlayer.getAdvancementDataIfLoadedImmediately() != null) {
+ entityPlayer.getAdvancementData().setPlayer(entityPlayer);
+ return java.util.concurrent.CompletableFuture.completedFuture(entityPlayer.getAdvancementData());
+ }
+
+ UUID uuid = entityPlayer.getUniqueID();
+ File file = this.server.getSavedFilePath(SavedFile.ADVANCEMENTS).toFile();
+ final File file1 = new File(file, uuid + ".json");
+ return java.util.concurrent.CompletableFuture.supplyAsync(
+ () -> new AdvancementDataPlayer(this.server.getDataFixer(), this, this.server.getAdvancementData(), file1, entityPlayer),
+ this.server.executorService
+ );
+ }
+ // Paper end
+
public AdvancementDataPlayer f(EntityPlayer entityplayer) {
UUID uuid = entityplayer.getUniqueID();
- AdvancementDataPlayer advancementdataplayer = (AdvancementDataPlayer) entityplayer.getAdvancementData(); // CraftBukkit
+ AdvancementDataPlayer advancementdataplayer = (AdvancementDataPlayer) entityplayer.getAdvancementDataIfLoadedImmediately(); // CraftBukkit // Paper
if (advancementdataplayer == null) {
File file = this.server.a(SavedFile.ADVANCEMENTS).toFile();

View File

@@ -5,7 +5,7 @@ Subject: [PATCH] Spread out and optimise player list ticks
diff --git a/src/main/java/net/minecraft/server/PlayerList.java b/src/main/java/net/minecraft/server/PlayerList.java
index eae19141e3cc890d3b4bdc0d0297061e79857160..881db63d6f2776956429b969e59db2534f8d96af 100644
index 7b385eb43e4cf565d500d0250f3c5e4dbebae986..f055fd0aff86d04677d0bd256c9e7c12f94bfbcc 100644
--- a/src/main/java/net/minecraft/server/PlayerList.java
+++ b/src/main/java/net/minecraft/server/PlayerList.java
@@ -71,7 +71,7 @@ public abstract class PlayerList {

View File

@@ -17,7 +17,7 @@ index ccd0be059f4d7b95d4ec58c0d4fc744a94fec3fd..e31f13b80aef9b410c508030c0d965ec
if (commanddispatcher_servertype.d) {
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
index 6c9a8d92e70106635699e55367eed60ac95c3290..d39b04e2a3d87be04625d85f42f3ab8263e91747 100644
index 2374a7ee018493795389b21848289395168db422..d33047a57f232ea2260289d86836264f91a52d86 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
@@ -473,6 +473,7 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant<TickTas
@@ -37,7 +37,7 @@ index 6c9a8d92e70106635699e55367eed60ac95c3290..d39b04e2a3d87be04625d85f42f3ab82
this.isRestarting = isRestarting;
if (flag) {
diff --git a/src/main/java/net/minecraft/server/PlayerList.java b/src/main/java/net/minecraft/server/PlayerList.java
index 881db63d6f2776956429b969e59db2534f8d96af..628771e6b450f8053eaca6499f1bbecac7337071 100644
index f055fd0aff86d04677d0bd256c9e7c12f94bfbcc..d2a7fa1595ed4bc9fea0238af42f70889e07b262 100644
--- a/src/main/java/net/minecraft/server/PlayerList.java
+++ b/src/main/java/net/minecraft/server/PlayerList.java
@@ -513,6 +513,8 @@ public abstract class PlayerList {