Skip to content

Commit e7de226

Browse files
committed
fix lag when collecting counts for offline players and chunks total
1 parent e864767 commit e7de226

File tree

6 files changed

+82
-4
lines changed

6 files changed

+82
-4
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package de.sldk.mc.collectors;
2+
3+
import org.bukkit.Bukkit;
4+
import org.bukkit.World;
5+
import org.bukkit.event.EventHandler;
6+
import org.bukkit.event.Listener;
7+
import org.bukkit.event.world.ChunkLoadEvent;
8+
import org.bukkit.event.world.ChunkUnloadEvent;
9+
import org.bukkit.event.world.WorldUnloadEvent;
10+
11+
import java.util.HashMap;
12+
import java.util.Map;
13+
14+
public class LoadedChunksCollector implements Listener {
15+
16+
private final Map<String, Integer> loadedChunksTotalMap = new HashMap<>();
17+
18+
@EventHandler
19+
public void onChunkLoad(ChunkLoadEvent event) {
20+
World world = event.getWorld();
21+
Integer currentCount = loadedChunksTotalMap.get(world.getName());
22+
if (currentCount == null) {
23+
loadedChunksTotalMap.put(world.getName(), world.getLoadedChunks().length);
24+
}
25+
else {
26+
loadedChunksTotalMap.put(world.getName(), currentCount + 1);
27+
}
28+
}
29+
30+
@EventHandler
31+
public void onChunkUnload(ChunkUnloadEvent event) {
32+
World world = event.getWorld();
33+
Integer currentCount = loadedChunksTotalMap.get(world.getName());
34+
if (currentCount == null) {
35+
loadedChunksTotalMap.put(world.getName(), world.getLoadedChunks().length);
36+
}
37+
else {
38+
loadedChunksTotalMap.put(world.getName(), currentCount - 1);
39+
}
40+
}
41+
42+
@EventHandler
43+
public void onWorldUnload(WorldUnloadEvent event) {
44+
World world = event.getWorld();
45+
loadedChunksTotalMap.remove(world.getName());
46+
}
47+
48+
public int getLoadedChunkTotal(String worldName) {
49+
return loadedChunksTotalMap.computeIfAbsent(worldName, k -> {
50+
World world = Bukkit.getWorld(worldName);
51+
if (world == null) {
52+
return 0;
53+
}
54+
return world.getLoadedChunks().length;
55+
});
56+
}
57+
}

src/main/java/de/sldk/mc/tps/TpsCollector.java src/main/java/de/sldk/mc/collectors/TpsCollector.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package de.sldk.mc.tps;
1+
package de.sldk.mc.collectors;
22

33
import java.util.LinkedList;
44
import java.util.function.Supplier;

src/main/java/de/sldk/mc/metrics/LoadedChunks.java

+17-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package de.sldk.mc.metrics;
22

3+
import de.sldk.mc.collectors.LoadedChunksCollector;
34
import io.prometheus.client.Gauge;
45
import org.bukkit.World;
6+
import org.bukkit.event.HandlerList;
57
import org.bukkit.plugin.Plugin;
68

79
public class LoadedChunks extends WorldMetric {
@@ -12,17 +14,31 @@ public class LoadedChunks extends WorldMetric {
1214
.labelNames("world")
1315
.create();
1416

17+
private final LoadedChunksCollector loadedChunksCollector = new LoadedChunksCollector();
18+
1519
public LoadedChunks(Plugin plugin) {
1620
super(plugin, LOADED_CHUNKS);
1721
}
1822

23+
@Override
24+
public void enable() {
25+
super.enable();
26+
getPlugin().getServer().getPluginManager().registerEvents(loadedChunksCollector, getPlugin());
27+
}
28+
29+
@Override
30+
public void disable() {
31+
super.disable();
32+
HandlerList.unregisterAll(loadedChunksCollector);
33+
}
34+
1935
@Override
2036
protected void clear() {
2137
LOADED_CHUNKS.clear();
2238
}
2339

2440
@Override
2541
public void collect(World world) {
26-
LOADED_CHUNKS.labels(world.getName()).set(world.getLoadedChunks().length);
42+
LOADED_CHUNKS.labels(world.getName()).set(loadedChunksCollector.getLoadedChunkTotal(world.getName()));
2743
}
2844
}

src/main/java/de/sldk/mc/metrics/PlayersTotal.java

+5
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,9 @@ public PlayersTotal(Plugin plugin) {
1919
public void doCollect() {
2020
PLAYERS.set(Bukkit.getOfflinePlayers().length);
2121
}
22+
23+
@Override
24+
public boolean isAsyncCapable() {
25+
return true;
26+
}
2227
}

src/main/java/de/sldk/mc/metrics/Tps.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package de.sldk.mc.metrics;
22

3-
import de.sldk.mc.tps.TpsCollector;
3+
import de.sldk.mc.collectors.TpsCollector;
44
import io.prometheus.client.Gauge;
55
import org.bukkit.Bukkit;
66
import org.bukkit.plugin.Plugin;

src/test/java/de/sldk/mc/tps/TpsCollectorTest.java src/test/java/de/sldk/mc/collectors/TpsCollectorTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package de.sldk.mc.tps;
1+
package de.sldk.mc.collectors;
22

33
import static org.assertj.core.api.Assertions.assertThat;
44
import static org.mockito.Mockito.when;

0 commit comments

Comments
 (0)