More Improvements to Chunks
Fixed issues where urgent and prioritized chunks didn't actually always get their priority boosted correctly.... Properly deprioritize non ticking chunks. Limit recursion on watchdog prints to stop flooding as much Remove neighbor priorities from watchdog to reduce information reduce synchronization duration so that watch dog won't block main should main actually wake up probably fixed a deadlock risk in watchdog printing also that was leading to crashes fixed chunk holder enqueues not being processed correctly added async catchers in some locations that should not be ran async Fixed upstream bug where VITAL callbacks that must run on main actually could sometimes run on the server thread pool causing alot of these nasty bugs we've seen lately! This build will provide massive improvements to stability as well as even faster sync chunk load/gens now that priority is correctly set. Fixes #3435
This commit is contained in:
@@ -3273,6 +3273,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
||||
+
|
||||
+import com.destroystokyo.paper.block.TargetBlockInfo;
|
||||
+import com.google.common.util.concurrent.ThreadFactoryBuilder;
|
||||
+import org.apache.commons.lang.exception.ExceptionUtils;
|
||||
+import org.bukkit.Location;
|
||||
+import org.bukkit.block.BlockFace;
|
||||
+import org.bukkit.craftbukkit.CraftWorld;
|
||||
@@ -3290,6 +3291,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
||||
+import java.util.concurrent.TimeUnit;
|
||||
+import java.util.concurrent.TimeoutException;
|
||||
+import java.util.concurrent.atomic.AtomicBoolean;
|
||||
+import java.util.function.BiConsumer;
|
||||
+import java.util.function.Consumer;
|
||||
+import java.util.function.Supplier;
|
||||
+
|
||||
@@ -3317,6 +3319,12 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
||||
+ };
|
||||
+ }
|
||||
+
|
||||
+ public static <T> Runnable once(List<T> list, Consumer<T> cb) {
|
||||
+ return once(() -> {
|
||||
+ list.forEach(cb);
|
||||
+ });
|
||||
+ }
|
||||
+
|
||||
+ private static Runnable makeCleanerCallback(Runnable run) {
|
||||
+ return once(() -> cleanerExecutor.execute(run));
|
||||
+ }
|
||||
@@ -3384,19 +3392,16 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
||||
+ return list;
|
||||
+ }
|
||||
+
|
||||
+ public static long getCoordinateKey(final BlockPosition blockPos) {
|
||||
+ return ((long)(blockPos.getZ() >> 4) << 32) | ((blockPos.getX() >> 4) & 0xFFFFFFFFL);
|
||||
+ }
|
||||
+
|
||||
+ public static long getCoordinateKey(final Entity entity) {
|
||||
+ return ((long)(MCUtil.fastFloor(entity.locZ()) >> 4) << 32) | ((MCUtil.fastFloor(entity.locX()) >> 4) & 0xFFFFFFFFL);
|
||||
+ }
|
||||
+
|
||||
+ public static int fastFloor(double x) {
|
||||
+ int truncated = (int)x;
|
||||
+ return x < (double)truncated ? truncated - 1 : truncated;
|
||||
+ }
|
||||
+
|
||||
+ public static int fastFloor(float x) {
|
||||
+ int truncated = (int)x;
|
||||
+ return x < (double)truncated ? truncated - 1 : truncated;
|
||||
+ }
|
||||
+
|
||||
+ public static float normalizeYaw(float f) {
|
||||
+ float f1 = f % 360.0F;
|
||||
+
|
||||
@@ -3411,9 +3416,31 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
||||
+ return f1;
|
||||
+ }
|
||||
+
|
||||
+ public static int fastFloor(float x) {
|
||||
+ int truncated = (int)x;
|
||||
+ return x < (double)truncated ? truncated - 1 : truncated;
|
||||
+ /**
|
||||
+ * Quickly generate a stack trace for current location
|
||||
+ *
|
||||
+ * @return Stacktrace
|
||||
+ */
|
||||
+ public static String stack() {
|
||||
+ return ExceptionUtils.getFullStackTrace(new Throwable());
|
||||
+ }
|
||||
+
|
||||
+ /**
|
||||
+ * Quickly generate a stack trace for current location with message
|
||||
+ *
|
||||
+ * @param str
|
||||
+ * @return Stacktrace
|
||||
+ */
|
||||
+ public static String stack(String str) {
|
||||
+ return ExceptionUtils.getFullStackTrace(new Throwable(str));
|
||||
+ }
|
||||
+
|
||||
+ public static long getCoordinateKey(final BlockPosition blockPos) {
|
||||
+ return ((long)(blockPos.getZ() >> 4) << 32) | ((blockPos.getX() >> 4) & 0xFFFFFFFFL);
|
||||
+ }
|
||||
+
|
||||
+ public static long getCoordinateKey(final Entity entity) {
|
||||
+ return ((long)(MCUtil.fastFloor(entity.locZ()) >> 4) << 32) | ((MCUtil.fastFloor(entity.locX()) >> 4) & 0xFFFFFFFFL);
|
||||
+ }
|
||||
+
|
||||
+ public static long getCoordinateKey(final ChunkCoordIntPair pair) {
|
||||
@@ -3466,6 +3493,24 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
||||
+
|
||||
+ private MCUtil() {}
|
||||
+
|
||||
+ public static final java.util.concurrent.Executor MAIN_EXECUTOR = (run) -> {
|
||||
+ if (!isMainThread()) {
|
||||
+ MinecraftServer.getServer().execute(run);
|
||||
+ } else {
|
||||
+ run.run();
|
||||
+ }
|
||||
+ };
|
||||
+
|
||||
+ public static <T> CompletableFuture<T> ensureMain(CompletableFuture<T> future) {
|
||||
+ return future.thenApplyAsync(r -> r, MAIN_EXECUTOR);
|
||||
+ }
|
||||
+
|
||||
+ public static <T> void thenOnMain(CompletableFuture<T> future, Consumer<T> consumer) {
|
||||
+ future.thenAcceptAsync(consumer, MAIN_EXECUTOR);
|
||||
+ }
|
||||
+ public static <T> void thenOnMain(CompletableFuture<T> future, BiConsumer<T, Throwable> consumer) {
|
||||
+ future.whenCompleteAsync(consumer, MAIN_EXECUTOR);
|
||||
+ }
|
||||
+
|
||||
+ public static boolean isMainThread() {
|
||||
+ return MinecraftServer.getServer().isMainThread();
|
||||
|
||||
Reference in New Issue
Block a user