prevent crashes on expiring map desync, dont spam logs

This commit is contained in:
Aikar
2018-09-16 02:57:22 -04:00
parent c041a06904
commit a6792af72a

View File

@@ -11,7 +11,7 @@ not run on every manipulation, and instead to run clean
once per tick per expiring map. once per tick per expiring map.
diff --git a/src/main/java/net/minecraft/server/ExpiringMap.java b/src/main/java/net/minecraft/server/ExpiringMap.java diff --git a/src/main/java/net/minecraft/server/ExpiringMap.java b/src/main/java/net/minecraft/server/ExpiringMap.java
index 4006f5a69c..49021d29ee 100644 index 4006f5a69c..08d41e8cf0 100644
--- a/src/main/java/net/minecraft/server/ExpiringMap.java --- a/src/main/java/net/minecraft/server/ExpiringMap.java
+++ b/src/main/java/net/minecraft/server/ExpiringMap.java +++ b/src/main/java/net/minecraft/server/ExpiringMap.java
@@ -0,0 +0,0 @@ import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; @@ -0,0 +0,0 @@ import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
@@ -116,10 +116,17 @@ index 4006f5a69c..49021d29ee 100644
+ @Override + @Override
+ public T compute(Long aLong, BiFunction<? super Long, ? super T, ? extends T> biFunction) { + public T compute(Long aLong, BiFunction<? super Long, ? super T, ? extends T> biFunction) {
+ setAccess(aLong); + setAccess(aLong);
+ return compute(aLong, biFunction); + return super.compute(aLong, biFunction);
+ }
+
+ @Override
+ public synchronized void clear() {
+ ttl.clear();
+ super.clear();
+ } + }
+ +
+ private boolean registered = false; + private boolean registered = false;
+ private boolean hasLeaked = false;
+ +
+ // Break clean to its own method to be ticked + // Break clean to its own method to be ticked
+ synchronized boolean clean() { + synchronized boolean clean() {
@@ -141,11 +148,18 @@ index 4006f5a69c..49021d29ee 100644
} }
} }
- -
+ if (this.ttl.size() != this.size()) { + int ttlSize = this.ttl.size();
+ MinecraftServer.LOGGER.error("WARNING: ExpiringMap desync - Memory leak risk!"); + int thisSize = this.size();
+ for (Entry<T> entry : this.long2ObjectEntrySet()) { + if (ttlSize != thisSize) {
+ ttl.putIfAbsent(entry.getLongKey(), now); + 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)");
+ } + }
+ try {
+ for (Entry<T> entry : this.long2ObjectEntrySet()) {
+ ttl.putIfAbsent(entry.getLongKey(), now);
+ }
+ } catch (Exception e) { } // Ignore any como's
+ } + }
+ if (isEmpty()) { + if (isEmpty()) {
+ registered = false; + registered = false;