Files
Purpur/patches/server/0061-Alternative-Keepalive-Handling.patch
William Blake Galbreath bbcde382a2 Updated Upstream (Paper)
Upstream has released updates that appears to apply and compile correctly

Paper Changes:
64666dc8 Improve Chunk Priority, Frustum Priority and Load Speed Algorithms
146b9908 Improve ChunkMapDistance.b crash fix to clean up properly
2c4499b7 Show Plugins Event Listeners under Combined Total in Timings
c5c909c9 Improve Plugin Ticket Management
b20529f3 Update to HTTPS in README (#3460)
de6dfedf Make Anti-Xray multithreaded (#3520)
531c4b3f Add PluginTickets to API Chunk Methods
b2d81e21 Improve Chunk Prioritization and Internal Scheduler
24a2e804 Improve Login to use Urgent priority - improves login chunk load times
2020-06-10 00:29:38 -05:00

95 lines
5.5 KiB
Diff

From 289e82a07dfc2238298bbc0d81819d1f57b55628 Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <blake.galbreath@gmail.com>
Date: Fri, 11 Oct 2019 00:17:39 -0500
Subject: [PATCH] Alternative Keepalive Handling
---
.../server/PacketPlayInKeepAlive.java | 1 +
.../minecraft/server/PlayerConnection.java | 27 +++++++++++++++++++
.../java/net/pl3x/purpur/PurpurConfig.java | 5 ++++
3 files changed, 33 insertions(+)
diff --git a/src/main/java/net/minecraft/server/PacketPlayInKeepAlive.java b/src/main/java/net/minecraft/server/PacketPlayInKeepAlive.java
index 8e93f1540b..470f92c4fb 100644
--- a/src/main/java/net/minecraft/server/PacketPlayInKeepAlive.java
+++ b/src/main/java/net/minecraft/server/PacketPlayInKeepAlive.java
@@ -22,6 +22,7 @@ public class PacketPlayInKeepAlive implements Packet<PacketListenerPlayIn> {
packetdataserializer.writeLong(this.a);
}
+ public long getId() { return b(); } // Purpur - OBFHELPER
public long b() {
return this.a;
}
diff --git a/src/main/java/net/minecraft/server/PlayerConnection.java b/src/main/java/net/minecraft/server/PlayerConnection.java
index 57e8c22d05..80a75912fb 100644
--- a/src/main/java/net/minecraft/server/PlayerConnection.java
+++ b/src/main/java/net/minecraft/server/PlayerConnection.java
@@ -75,6 +75,7 @@ public class PlayerConnection implements PacketListenerPlayIn {
private long lastKeepAlive = SystemUtils.getMonotonicMillis(); private void setLastPing(long lastPing) { this.lastKeepAlive = lastPing;}; private long getLastPing() { return this.lastKeepAlive;}; // Paper - OBFHELPER
private boolean awaitingKeepAlive; private void setPendingPing(boolean isPending) { this.awaitingKeepAlive = isPending;}; private boolean isPendingPing() { return this.awaitingKeepAlive;}; // Paper - OBFHELPER
private long h; private void setKeepAliveID(long keepAliveID) { this.h = keepAliveID;}; private long getKeepAliveID() {return this.h; }; // Paper - OBFHELPER
+ private java.util.List<Long> keepAlives = new java.util.ArrayList<>(); // Purpur
// CraftBukkit start - multithreaded fields
private volatile int chatThrottle;
private static final AtomicIntegerFieldUpdater chatSpamField = AtomicIntegerFieldUpdater.newUpdater(PlayerConnection.class, "chatThrottle");
@@ -201,6 +202,21 @@ public class PlayerConnection implements PacketListenerPlayIn {
long currentTime = SystemUtils.getMonotonicMillis();
long elapsedTime = currentTime - this.getLastPing();
+ // Purpur start
+ if (net.pl3x.purpur.PurpurConfig.useAlternateKeepAlive) {
+ if (elapsedTime >= 1000L) { // 1 second
+ if (!processedDisconnect && keepAlives.size() > KEEPALIVE_LIMIT) {
+ PlayerConnection.LOGGER.warn("{} was kicked due to keepalive timeout!", player.getName());
+ disconnect(new ChatMessage("disconnect.timeout"));
+ } else {
+ setLastPing(currentTime); // hijack this field for 1 second intervals
+ keepAlives.add(currentTime); // currentTime is ID
+ sendPacket(new PacketPlayOutKeepAlive(currentTime));
+ }
+ }
+ } else
+ // Purpur end
+
if (this.isPendingPing()) {
if (!this.processedDisconnect && elapsedTime >= KEEPALIVE_LIMIT) { // check keepalive limit, don't fire if already disconnected
PlayerConnection.LOGGER.warn("{} was kicked due to keepalive timeout!", this.player.getName()); // more info
@@ -2660,6 +2676,17 @@ public class PlayerConnection implements PacketListenerPlayIn {
@Override
public void a(PacketPlayInKeepAlive packetplayinkeepalive) {
+ // Purpur start
+ if (net.pl3x.purpur.PurpurConfig.useAlternateKeepAlive) {
+ PlayerConnectionUtils.ensureMainThread(packetplayinkeepalive, this, player.getWorldServer()); // This SHOULD be on the main thread...
+ long id = packetplayinkeepalive.getId();
+ if (keepAlives.size() > 0 && keepAlives.contains(id)) {
+ int ping = (int) (SystemUtils.getMonotonicMillis() - id);
+ player.ping = (player.ping * 3 + ping) / 4;
+ keepAlives.clear(); // we got a valid response, lets roll with it and forget the rest
+ }
+ } else
+ // Purpur end
//PlayerConnectionUtils.ensureMainThread(packetplayinkeepalive, this, this.player.getWorldServer()); // CraftBukkit // Paper - This shouldn't be on the main thread
if (this.awaitingKeepAlive && packetplayinkeepalive.b() == this.h) {
int i = (int) (SystemUtils.getMonotonicMillis() - this.lastKeepAlive);
diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java
index 72ad9dce7d..ed2a312773 100644
--- a/src/main/java/net/pl3x/purpur/PurpurConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java
@@ -144,6 +144,11 @@ public class PurpurConfig {
laggingThreshold = getDouble("settings.lagging-threshold", laggingThreshold);
}
+ public static boolean useAlternateKeepAlive = false;
+ private static void useAlternateKeepAlive() {
+ useAlternateKeepAlive = getBoolean("settings.use-alternate-keepalive", useAlternateKeepAlive);
+ }
+
public static boolean dontSendUselessEntityPackets = false;
private static void dontSendUselessEntityPackets() {
dontSendUselessEntityPackets = getBoolean("settings.dont-send-useless-entity-packets", dontSendUselessEntityPackets);
--
2.26.2