Improvements to Logging Warnings/Dupe Entities - Resolves #1544
1) Removed "Regen" mode of Dupe UUID resolver, forced safe. Some servers who updated before we had safe mode added still had this value. There's really no reason to keep this mode, as we've seen that vanilla triggers this often and 99.9999999% of cases will be an actual duplicate that needs to be deleted. 2) Made Vanilla Debug messages about dupe UUIDs and dupe uuid resolve messages only show up if the debug.entities flag is on. This will stop server owners from panicing from seeing these logs, and stop opening bug reports on this, only for us to tell you "don't worry about it". 3) Avoid adding entities to world that are already added to world. This can be triggered by anything that causes an entity to be added to the world during the chunk load process, such as chunk conversions. Issue #1544 was a case of this. 4) Removed debug warning about ExpiringMap. Nothing more I know to do about this anyways. We recover from it, stop warning to reduce noise of issues to us.
This commit is contained in:
@@ -14,7 +14,7 @@ manipulation, and instead to run clean
|
||||
once per tick per active expiring map.
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/server/ExpiringMap.java b/src/main/java/net/minecraft/server/ExpiringMap.java
|
||||
index 4006f5a69c..127de5c8df 100644
|
||||
index 4006f5a69c..795e735420 100644
|
||||
--- a/src/main/java/net/minecraft/server/ExpiringMap.java
|
||||
+++ b/src/main/java/net/minecraft/server/ExpiringMap.java
|
||||
@@ -0,0 +0,0 @@ package net.minecraft.server;
|
||||
@@ -35,6 +35,7 @@ index 4006f5a69c..127de5c8df 100644
|
||||
private final int a;
|
||||
- private final Long2LongMap b = new Long2LongLinkedOpenHashMap();
|
||||
+ private final Long2LongMap ttl = new Long2LongLinkedOpenHashMap(); // Paper
|
||||
+ private static final boolean DEBUG_EXPIRING_MAP = Boolean.getBoolean("debug.expiringmap");
|
||||
|
||||
public ExpiringMap(int i, int j) {
|
||||
- super(i);
|
||||
@@ -149,7 +150,6 @@ index 4006f5a69c..127de5c8df 100644
|
||||
+ }
|
||||
|
||||
+ private boolean registered = false;
|
||||
+ private boolean hasLeaked = false;
|
||||
+
|
||||
+ // Break clean to its own method to be ticked
|
||||
+ boolean clean() {
|
||||
@@ -172,20 +172,22 @@ index 4006f5a69c..127de5c8df 100644
|
||||
+ int ttlSize = this.ttl.size();
|
||||
+ int thisSize = this.size();
|
||||
+ if (ttlSize < thisSize) {
|
||||
+ if (!hasLeaked) { // log once
|
||||
+ hasLeaked = true;
|
||||
+ MinecraftServer.LOGGER.warn("WARNING: ExpiringMap desync (" + ttlSize + ":" + thisSize + ")- Memory leak risk! We will recover from this, but this means there is still a bug. Please do not open an issue about this. Mention it in Discord (we don't need everyone reporting the same thing)");
|
||||
+ if (DEBUG_EXPIRING_MAP) {
|
||||
+ MinecraftServer.LOGGER.warn("WARNING: ExpiringMap desync (ttl:" + ttlSize + " < actual:" + thisSize + ")");
|
||||
+ }
|
||||
+ try {
|
||||
+ for (Entry<T> entry : this.long2ObjectEntrySet()) {
|
||||
+ ttl.putIfAbsent(entry.getLongKey(), now);
|
||||
+ }
|
||||
+ } catch (Exception e) {
|
||||
+ } catch (Exception ignored) {
|
||||
+ } // Ignore any como's
|
||||
+ } else if (ttlSize > this.size()) {
|
||||
+ if (DEBUG_EXPIRING_MAP) {
|
||||
+ MinecraftServer.LOGGER.warn("WARNING: ExpiringMap desync (ttl:" + ttlSize + " > actual:" + thisSize + ")");
|
||||
+ }
|
||||
+ try {
|
||||
+ this.ttl.long2LongEntrySet().removeIf(entry -> !this.containsKey(entry.getLongKey()));
|
||||
+ } catch (Exception e) {
|
||||
+ } catch (Exception ignored) {
|
||||
+ } // Ignore any como's
|
||||
+ }
|
||||
+ if (isEmpty()) {
|
||||
|
||||
Reference in New Issue
Block a user