From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Shane Freeder Date: Thu, 11 Apr 2024 16:37:44 +0100 Subject: [PATCH] Fix premature player kicks on shutdown When the server is stopping, the default execution handler method will throw a RejectedExecutionException in order to prevent further execution, this causes us to lose the actual kick reason. To mitigate this, we'll use a seperate marked class in order to gracefully ignore these. diff --git a/src/main/java/io/papermc/paper/util/ServerStopRejectedExecutionException.java b/src/main/java/io/papermc/paper/util/ServerStopRejectedExecutionException.java new file mode 100644 index 0000000000000000000000000000000000000000..2c5cd77103c5a33d4349ab6b9ee2d8378bb60eb4 --- /dev/null +++ b/src/main/java/io/papermc/paper/util/ServerStopRejectedExecutionException.java @@ -0,0 +1,20 @@ +package io.papermc.paper.util; + +import java.util.concurrent.RejectedExecutionException; + +public class ServerStopRejectedExecutionException extends RejectedExecutionException { + public ServerStopRejectedExecutionException() { + } + + public ServerStopRejectedExecutionException(final String message) { + super(message); + } + + public ServerStopRejectedExecutionException(final String message, final Throwable cause) { + super(message, cause); + } + + public ServerStopRejectedExecutionException(final Throwable cause) { + super(cause); + } +} diff --git a/src/main/java/net/minecraft/network/Connection.java b/src/main/java/net/minecraft/network/Connection.java index 4d9f1fc884050993287adfa4578a87da710623fb..a8dfe7a4b3d01bf75587be078f471d1ef1d7a667 100644 --- a/src/main/java/net/minecraft/network/Connection.java +++ b/src/main/java/net/minecraft/network/Connection.java @@ -285,6 +285,7 @@ public class Connection extends SimpleChannelInboundHandler> { Connection.genericsFtw(packet, packetlistener); } catch (RunningOnDifferentThreadException cancelledpackethandleexception) { ; + } catch (io.papermc.paper.util.ServerStopRejectedExecutionException ignored) { // Paper - do not prematurely disconnect players on stop } catch (RejectedExecutionException rejectedexecutionexception) { this.disconnect((Component) Component.translatable("multiplayer.disconnect.server_shutdown")); } catch (ClassCastException classcastexception) { diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java index b7937f7e83069d0e3d36c232a02da59ed23a9ed4..05f8eafb3d4f1ea34fb3d10bba0eee6f787bdfdb 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -2170,7 +2170,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop