Async send keep alive packet

This commit is contained in:
Sotr
2018-06-08 19:11:36 +08:00
parent d0fb8d9fe9
commit 63c27d497d
3 changed files with 2794 additions and 3 deletions

View File

@@ -1,9 +1,14 @@
package io.akarin.server.core; package io.akarin.server.core;
import org.bukkit.entity.Player;
import io.akarin.api.Akari; import io.akarin.api.Akari;
import net.minecraft.server.ChatMessage;
import net.minecraft.server.EntityPlayer; import net.minecraft.server.EntityPlayer;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;
import net.minecraft.server.PacketPlayOutKeepAlive;
import net.minecraft.server.PacketPlayOutUpdateTime; import net.minecraft.server.PacketPlayOutUpdateTime;
import net.minecraft.server.PlayerConnection;
public class AkarinSlackScheduler extends Thread { public class AkarinSlackScheduler extends Thread {
public static AkarinSlackScheduler get() { public static AkarinSlackScheduler get() {
@@ -21,18 +26,47 @@ public class AkarinSlackScheduler extends Thread {
private static class Singleton { private static class Singleton {
private static final AkarinSlackScheduler instance = new AkarinSlackScheduler(); private static final AkarinSlackScheduler instance = new AkarinSlackScheduler();
} }
private long updateTime;
@Override @Override
public void run() { public void run() {
MinecraftServer server = MinecraftServer.getServer(); MinecraftServer server = MinecraftServer.getServer();
// Send time updates to everyone, it will get the right time from the world the player is in. // Send time updates to everyone, it will get the right time from the world the player is in.
if (++updateTime == 10) {
for (EntityPlayer player : server.getPlayerList().players) {
player.playerConnection.sendPacket(new PacketPlayOutUpdateTime(player.world.getTime(), player.getPlayerTime(), player.world.getGameRules().getBoolean("doDaylightCycle"))); // Add support for per player time
}
updateTime = 0;
}
for (EntityPlayer player : server.getPlayerList().players) { for (EntityPlayer player : server.getPlayerList().players) {
player.playerConnection.sendPacket(new PacketPlayOutUpdateTime(player.world.getTime(), player.getPlayerTime(), player.world.getGameRules().getBoolean("doDaylightCycle"))); // Add support for per player time PlayerConnection conn = player.playerConnection;
// Paper - 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 = System.currentTimeMillis();
long elapsedTime = currentTime - conn.getLastPing();
if (conn.isPendingPing()) {
// We're pending a ping from the client
if (!conn.processedDisconnect && elapsedTime >= PlayerConnection.KEEPALIVE_LIMIT) { // check keepalive limit, don't fire if already disconnected
Akari.callbackQueue.add(() -> {
Akari.logger.warn("{} was kicked due to keepalive timeout!", conn.player.getName()); // more info
conn.disconnect("disconnect.timeout");
});
}
} else {
if (elapsedTime >= 15000L) { // 15 seconds
conn.setPendingPing(true);
conn.setLastPing(currentTime);
conn.setKeepAliveID(currentTime);
conn.sendPacket(new PacketPlayOutKeepAlive(conn.getKeepAliveID()));
}
}
} }
try { try {
Thread.sleep(1000); Thread.sleep(100);
} catch (InterruptedException ex) { } catch (InterruptedException ex) {
Akari.logger.warn("Slack scheduler thread was interrupted unexpectly!"); Akari.logger.warn("Slack scheduler thread was interrupted unexpectly!");
ex.printStackTrace(); ex.printStackTrace();

View File

@@ -105,6 +105,11 @@ public class MixinMinecraftServer {
@Overwrite @Overwrite
public void D() throws InterruptedException { public void D() throws InterruptedException {
Runnable runnable;
Akari.callbackTiming.startTiming();
while ((runnable = Akari.callbackQueue.poll()) != null) runnable.run();
Akari.callbackTiming.stopTiming();
MinecraftTimings.bukkitSchedulerTimer.startTiming(); MinecraftTimings.bukkitSchedulerTimer.startTiming();
this.server.getScheduler().mainThreadHeartbeat(this.ticks); this.server.getScheduler().mainThreadHeartbeat(this.ticks);
MinecraftTimings.bukkitSchedulerTimer.stopTiming(); MinecraftTimings.bukkitSchedulerTimer.stopTiming();
@@ -117,7 +122,6 @@ public class MixinMinecraftServer {
} }
MinecraftTimings.minecraftSchedulerTimer.stopTiming(); MinecraftTimings.minecraftSchedulerTimer.stopTiming();
Runnable runnable;
MinecraftTimings.processQueueTimer.startTiming(); MinecraftTimings.processQueueTimer.startTiming();
while ((runnable = processQueue.poll()) != null) runnable.run(); while ((runnable = processQueue.poll()) != null) runnable.run();
MinecraftTimings.processQueueTimer.stopTiming(); MinecraftTimings.processQueueTimer.stopTiming();

File diff suppressed because it is too large Load Diff