Mirror von
https://github.com/PaperMC/Paper.git
synchronisiert 2024-12-25 15:50:06 +01:00
76 Zeilen
4.6 KiB
Diff
76 Zeilen
4.6 KiB
Diff
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||
|
From: Shane Freeder <theboyetronic@gmail.com>
|
||
|
Date: Sun, 15 Oct 2017 00:29:07 +0100
|
||
|
Subject: [PATCH] revert serverside behavior of keepalives
|
||
|
|
||
|
This patch intends to bump up the time that a client has to reply to the
|
||
|
server back to 30 seconds as per pre 1.12.2, which allowed clients
|
||
|
more than enough time to reply potentially allowing them to be less
|
||
|
tempermental due to lag spikes on the network thread, e.g. that caused
|
||
|
by plugins that are interacting with netty.
|
||
|
|
||
|
We also add a system property to allow people to tweak how long the server
|
||
|
will wait for a reply. There is a compromise here between lower and higher
|
||
|
values, lower values will mean that dead connections can be closed sooner,
|
||
|
whereas higher values will make this less sensitive to issues such as spikes
|
||
|
from networking or during connections flood of chunk packets on slower clients,
|
||
|
at the cost of dead connections being kept open for longer.
|
||
|
|
||
|
diff --git a/src/main/java/net/minecraft/server/network/PlayerConnection.java b/src/main/java/net/minecraft/server/network/PlayerConnection.java
|
||
|
index f0e4737377ae99afca5b624a1367d95c42ab4fa0..301b63db3abc348441c3580a6606b65f550d8a78 100644
|
||
|
--- a/src/main/java/net/minecraft/server/network/PlayerConnection.java
|
||
|
+++ b/src/main/java/net/minecraft/server/network/PlayerConnection.java
|
||
|
@@ -223,7 +223,7 @@ public class PlayerConnection implements PacketListenerPlayIn {
|
||
|
private final MinecraftServer minecraftServer;
|
||
|
public EntityPlayer player;
|
||
|
private int e;
|
||
|
- private long lastKeepAlive; private void setLastPing(long lastPing) { this.lastKeepAlive = lastPing;}; private long getLastPing() { return this.lastKeepAlive;}; // Paper - OBFHELPER
|
||
|
+ 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
|
||
|
// CraftBukkit start - multithreaded fields
|
||
|
@@ -254,6 +254,7 @@ public class PlayerConnection implements PacketListenerPlayIn {
|
||
|
private int E;
|
||
|
private int receivedMovePackets;
|
||
|
private int processedMovePackets;
|
||
|
+ private static final long KEEPALIVE_LIMIT = Long.getLong("paper.playerconnection.keepalive", 30) * 1000; // Paper - provide property to set keepalive limit
|
||
|
|
||
|
public PlayerConnection(MinecraftServer minecraftserver, NetworkManager networkmanager, EntityPlayer entityplayer) {
|
||
|
this.minecraftServer = minecraftserver;
|
||
|
@@ -340,18 +341,25 @@ public class PlayerConnection implements PacketListenerPlayIn {
|
||
|
}
|
||
|
|
||
|
this.minecraftServer.getMethodProfiler().enter("keepAlive");
|
||
|
- long i = SystemUtils.getMonotonicMillis();
|
||
|
-
|
||
|
- if (i - this.lastKeepAlive >= 25000L) { // CraftBukkit
|
||
|
- if (this.awaitingKeepAlive) {
|
||
|
- this.disconnect(new ChatMessage("disconnect.timeout"));
|
||
|
- } else {
|
||
|
- this.awaitingKeepAlive = true;
|
||
|
- this.lastKeepAlive = i;
|
||
|
- this.h = i;
|
||
|
- this.sendPacket(new PacketPlayOutKeepAlive(this.h));
|
||
|
+ // Paper Start - give clients a longer time to respond to pings as per pre 1.12.2 timings
|
||
|
+ // This should effectively place the keepalive handling back to "as it was" before 1.12.2
|
||
|
+ long currentTime = SystemUtils.getMonotonicMillis();
|
||
|
+ long elapsedTime = currentTime - this.getLastPing();
|
||
|
+
|
||
|
+ 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
|
||
|
+ this.disconnect(new ChatMessage("disconnect.timeout", new Object[0]));
|
||
|
+ }
|
||
|
+ } else {
|
||
|
+ if (elapsedTime >= 15000L) { // 15 seconds
|
||
|
+ this.setPendingPing(true);
|
||
|
+ this.setLastPing(currentTime);
|
||
|
+ this.setKeepAliveID(currentTime);
|
||
|
+ this.sendPacket(new PacketPlayOutKeepAlive(this.getKeepAliveID()));
|
||
|
}
|
||
|
}
|
||
|
+ // Paper end
|
||
|
|
||
|
this.minecraftServer.getMethodProfiler().exit();
|
||
|
// CraftBukkit start
|