Compare commits

...
2 Commits
Author SHA1 Message Date
NanaChiyo0721 6f7ba53119 Optimize iteration in task queue ttl optimization
Shiroha CI / build (push) Canceled after 0s
Shiroha CI / Event File (push) Canceled after 0s
2026-08-22 23:17:26 +08:00
NanaChiyo0721 e660a6239b Optimize iteration in reference chunk loader 2026-08-22 23:13:58 +08:00
2 changed files with 79 additions and 58 deletions
@@ -5,7 +5,7 @@ Subject: [PATCH] RegionizedTaskQueue queue TTL optimization
diff --git a/io/papermc/paper/threadedregions/RegionizedTaskQueue.java b/io/papermc/paper/threadedregions/RegionizedTaskQueue.java diff --git a/io/papermc/paper/threadedregions/RegionizedTaskQueue.java b/io/papermc/paper/threadedregions/RegionizedTaskQueue.java
index 037697e6364c73057b1fbac354bd78d8bf35bc7b..0e88bc2776615f8e3e1e6a05c5ffb8f791d49917 100644 index 037697e6364c73057b1fbac354bd78d8bf35bc7b..3a7e4b57dc41030295f5e9da58a0fcd1270c521f 100644
--- a/io/papermc/paper/threadedregions/RegionizedTaskQueue.java --- a/io/papermc/paper/threadedregions/RegionizedTaskQueue.java
+++ b/io/papermc/paper/threadedregions/RegionizedTaskQueue.java +++ b/io/papermc/paper/threadedregions/RegionizedTaskQueue.java
@@ -23,6 +23,7 @@ import java.util.concurrent.atomic.AtomicLong; @@ -23,6 +23,7 @@ import java.util.concurrent.atomic.AtomicLong;
@@ -16,7 +16,7 @@ index 037697e6364c73057b1fbac354bd78d8bf35bc7b..0e88bc2776615f8e3e1e6a05c5ffb8f7
public PrioritisedExecutor.PrioritisedTask createChunkTask(final ServerLevel world, final int chunkX, final int chunkZ, public PrioritisedExecutor.PrioritisedTask createChunkTask(final ServerLevel world, final int chunkX, final int chunkZ,
final Runnable run) { final Runnable run) {
@@ -155,6 +156,58 @@ public final class RegionizedTaskQueue { @@ -155,6 +156,68 @@ public final class RegionizedTaskQueue {
} }
} }
@@ -30,12 +30,23 @@ index 037697e6364c73057b1fbac354bd78d8bf35bc7b..0e88bc2776615f8e3e1e6a05c5ffb8f7
+ +
+ final ReferenceCountData[] toRemoveTicket = new ReferenceCountData[1]; + final ReferenceCountData[] toRemoveTicket = new ReferenceCountData[1];
+ +
+ for (ConcurrentChainedLong2ReferenceHashTable.TableEntry<ReferenceCountData> counterEntry : this.referenceCounters.entrySet()) { + final it.unimi.dsi.fastutil.longs.LongIterator sectionsIterator = currentRegion.getOwnedSectionsUnsynchronised();
+ final long coord = counterEntry.getKey(); + while (sectionsIterator.hasNext()) {
+ final ReferenceCountData counterData = counterEntry.getValue(); + final long sectionKey = sectionsIterator.nextLong();
+ final int sectionX = CoordinateUtils.getChunkX(sectionKey);
+ final int sectionZ = CoordinateUtils.getChunkZ(sectionKey);
+ +
+ // only tick for our region + final int chunkX = sectionX << this.world.regioniser.sectionChunkShift;
+ if (currentRegion == this.world.regioniser.getRegionAtUnsynchronised(CoordinateUtils.getChunkX(coord), CoordinateUtils.getChunkZ(coord))) { + final int chunkZ = sectionZ << this.world.regioniser.sectionChunkShift;
+ final long coord = CoordinateUtils.getChunkKey(chunkX, chunkZ);
+ final ReferenceCountData counterData = this.referenceCounters.get(coord);
+
+ // removed
+ if (counterData == null) {
+ continue;
+ }
+
+ // do ttl
+ long curr = counterData.referenceTTL.get(); + long curr = counterData.referenceTTL.get();
+ // successfully decreased ttl + // successfully decreased ttl
+ if (curr == (curr = counterData.referenceTTL.compareAndExchange(curr, curr - 1))) { + if (curr == (curr = counterData.referenceTTL.compareAndExchange(curr, curr - 1))) {
@@ -69,13 +80,12 @@ index 037697e6364c73057b1fbac354bd78d8bf35bc7b..0e88bc2776615f8e3e1e6a05c5ffb8f7
+ } + }
+ } + }
+ } + }
+ }
+ // Shiroha end - RegionizedTaskQueue queue TTL optimization + // Shiroha end - RegionizedTaskQueue queue TTL optimization
+ +
private void decrementReference(final ReferenceCountData referenceCountData, final long coord) { private void decrementReference(final ReferenceCountData referenceCountData, final long coord) {
if (!referenceCountData.decreaseReferenceCount()) { if (!referenceCountData.decreaseReferenceCount()) {
return; return;
@@ -212,9 +265,10 @@ public final class RegionizedTaskQueue { @@ -212,9 +275,10 @@ public final class RegionizedTaskQueue {
private final long id = ID_GENERATOR.getAndIncrement(); private final long id = ID_GENERATOR.getAndIncrement();
public final AtomicLong referenceCount = new AtomicLong(1L); public final AtomicLong referenceCount = new AtomicLong(1L);
@@ -87,7 +97,7 @@ index 037697e6364c73057b1fbac354bd78d8bf35bc7b..0e88bc2776615f8e3e1e6a05c5ffb8f7
public boolean addCount() { public boolean addCount() {
int failures = 0; int failures = 0;
for (long curr = this.referenceCount.get();;) { for (long curr = this.referenceCount.get();;) {
@@ -227,6 +281,27 @@ public final class RegionizedTaskQueue { @@ -227,6 +291,27 @@ public final class RegionizedTaskQueue {
} }
if (curr == (curr = this.referenceCount.compareAndExchange(curr, curr + 1L))) { if (curr == (curr = this.referenceCount.compareAndExchange(curr, curr + 1L))) {
@@ -115,7 +125,7 @@ index 037697e6364c73057b1fbac354bd78d8bf35bc7b..0e88bc2776615f8e3e1e6a05c5ffb8f7
return true; return true;
} }
@@ -234,11 +309,11 @@ public final class RegionizedTaskQueue { @@ -234,11 +319,11 @@ public final class RegionizedTaskQueue {
} }
} }
@@ -218,11 +218,23 @@ public class ReferenceCountingChunkLoader {
final ReferenceCountData[] toRemoveTicket = new ReferenceCountData[1]; final ReferenceCountData[] toRemoveTicket = new ReferenceCountData[1];
for (ConcurrentChainedLong2ReferenceHashTable.TableEntry<ReferenceCountData> counterEntry : this.referenceCounters.entrySet()) { final it.unimi.dsi.fastutil.longs.LongIterator sectionsIterator = currentRegion.getOwnedSectionsUnsynchronised();
final long coord = counterEntry.getKey(); while (sectionsIterator.hasNext()) {
final ReferenceCountData counterData = counterEntry.getValue(); final long sectionKey = sectionsIterator.nextLong();
final int sectionX = CoordinateUtils.getChunkX(sectionKey);
final int sectionZ = CoordinateUtils.getChunkZ(sectionKey);
if (currentRegion == this.world.regioniser.getRegionAtUnsynchronised(CoordinateUtils.getChunkX(coord), CoordinateUtils.getChunkZ(coord))) { final int chunkX = sectionX << this.world.regioniser.sectionChunkShift;
final int chunkZ = sectionZ << this.world.regioniser.sectionChunkShift;
final long coord = CoordinateUtils.getChunkKey(chunkX, chunkZ);
final ReferenceCountData counterData = this.referenceCounters.get(coord);
// removed
if (counterData == null) {
continue;
}
// do ttl
long curr = counterData.referenceTTL.get(); long curr = counterData.referenceTTL.get();
if (curr == (curr = counterData.referenceTTL.compareAndExchange(curr, curr - 1))) { if (curr == (curr = counterData.referenceTTL.compareAndExchange(curr, curr - 1))) {
if (counterData.referenceCount.get() != 0L) { if (counterData.referenceCount.get() != 0L) {
@@ -250,7 +262,6 @@ public class ReferenceCountingChunkLoader {
} }
} }
} }
}
private static final class ReferenceCountData { private static final class ReferenceCountData {