Paper/Spigot-Server-Patches/0117-Sanitise-RegionFileCache-and-make-configurable.patch
Aikar 211cba970b LootTable API & Replenishable Lootables Feature
Provides an API to control the loot table for an object.
Also provides a feature that any Lootable Inventory (Chests in Structures)
can automatically replenish after a given time.

This feature is good for long term worlds so that newer players
do not suffer with "Every chest has been looted"

API and Event added to control the Auto Replenish feature for players.
2016-05-04 19:46:28 -04:00

82 lines
3.2 KiB
Diff

From 4edc5edf0d28d370646105bb6be847ad0944cd9b Mon Sep 17 00:00:00 2001
From: Antony Riley <antony@cyberiantiger.org>
Date: Tue, 29 Mar 2016 08:22:55 +0300
Subject: [PATCH] Sanitise RegionFileCache and make configurable.
RegionFileCache prior to this patch would close every single open region
file upon reaching a size of 256.
This patch modifies that behaviour so it closes the the least recently
used RegionFile.
The implementation uses a LinkedHashMap as an LRU cache (modified from HashMap).
The maximum size of the RegionFileCache is also made configurable.
diff --git a/src/main/java/com/destroystokyo/paper/PaperConfig.java b/src/main/java/com/destroystokyo/paper/PaperConfig.java
index a643acc..431faa8 100644
--- a/src/main/java/com/destroystokyo/paper/PaperConfig.java
+++ b/src/main/java/com/destroystokyo/paper/PaperConfig.java
@@ -213,4 +213,9 @@ public class PaperConfig {
public static void healthDeath() {
setHealthBeforeDeathEvent = getBoolean("settings.set-health-before-death-event", false);
}
+
+ public static int regionFileCacheSize = 256;
+ private static void regionFileCacheSize() {
+ regionFileCacheSize = getInt("settings.region-file-cache-size", 256);
+ }
}
diff --git a/src/main/java/net/minecraft/server/RegionFileCache.java b/src/main/java/net/minecraft/server/RegionFileCache.java
index 5eb01c3..9744e72 100644
--- a/src/main/java/net/minecraft/server/RegionFileCache.java
+++ b/src/main/java/net/minecraft/server/RegionFileCache.java
@@ -8,10 +8,12 @@ import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.Map;
+import com.destroystokyo.paper.PaperConfig; // Paper
+import java.util.LinkedHashMap; // Paper
public class RegionFileCache {
- public static final Map<File, RegionFile> a = Maps.newHashMap(); // Spigot - private -> public
+ public static final Map<File, RegionFile> a = new LinkedHashMap(PaperConfig.regionFileCacheSize, 0.75f, true); // Spigot - private -> public, Paper - HashMap -> LinkedHashMap
// Paper start
public static synchronized RegionFile a(File file, int i, int j) {
@@ -32,8 +34,8 @@ public class RegionFileCache {
file1.mkdirs();
}
- if (RegionFileCache.a.size() >= 256) {
- a();
+ if (RegionFileCache.a.size() >= PaperConfig.regionFileCacheSize) { // Paper
+ trimCache(); // Paper
}
RegionFile regionfile1 = new RegionFile(file2);
@@ -43,6 +45,22 @@ public class RegionFileCache {
}
}
+ // Paper Start
+ private static synchronized void trimCache() {
+ Iterator<Map.Entry<File, RegionFile>> itr = RegionFileCache.a.entrySet().iterator();
+ int count = RegionFileCache.a.size() - PaperConfig.regionFileCacheSize;
+ while (count-- >= 0 && itr.hasNext()) {
+ try {
+ itr.next().getValue().c();
+ } catch (IOException ioexception) {
+ ioexception.printStackTrace();
+ ServerInternalException.reportInternalException(ioexception);
+ }
+ itr.remove();
+ }
+ }
+ // Paper End
+
public static synchronized void a() {
Iterator iterator = RegionFileCache.a.values().iterator();
--
2.8.2