From 95414bc02bacbd25331e31000d52ec962cefc995 Mon Sep 17 00:00:00 2001 From: Ceikry Date: Mon, 27 Jun 2022 14:09:44 +0000 Subject: [PATCH] Increased server stability Fixed NPE in IoEventHandler Fixed NPEs in PacketWriteQueue Reworked PacketWriteQueue slightly so that instead of breaking at first null packet we continue past it and pop the whole queue along the way --- .../main/java/core/net/IoEventHandler.java | 3 +- .../rs09/net/packet/PacketWriteQueue.kt | 34 ++++++++++--------- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/Server/src/main/java/core/net/IoEventHandler.java b/Server/src/main/java/core/net/IoEventHandler.java index dfcd684db..abf3e6295 100644 --- a/Server/src/main/java/core/net/IoEventHandler.java +++ b/Server/src/main/java/core/net/IoEventHandler.java @@ -72,7 +72,8 @@ public class IoEventHandler { } catch (IOException e) { if (e.getMessage().contains("reset by peer")) { session.disconnect(); - session.getPlayer().clear(true); + if (session.getPlayer() != null) + session.getPlayer().clear(true); } else e.printStackTrace(); } buffer.flip(); diff --git a/Server/src/main/kotlin/rs09/net/packet/PacketWriteQueue.kt b/Server/src/main/kotlin/rs09/net/packet/PacketWriteQueue.kt index b975c3118..aa2be3b2f 100644 --- a/Server/src/main/kotlin/rs09/net/packet/PacketWriteQueue.kt +++ b/Server/src/main/kotlin/rs09/net/packet/PacketWriteQueue.kt @@ -6,6 +6,7 @@ import core.net.packet.out.* import rs09.game.system.SystemLogger import java.util.* import java.util.concurrent.locks.ReentrantLock +import kotlin.NoSuchElementException import kotlin.collections.ArrayList class PacketWriteQueue : TickListener { @@ -15,8 +16,8 @@ class PacketWriteQueue : TickListener { companion object { private val queueLock = ReentrantLock() - private val packetsToQueue = ArrayList>(1000) - private val packetsToWrite = LinkedList>() + private val packetsToQueue = ArrayList?>(1000) + private val packetsToWrite = LinkedList?>() @JvmStatic fun handle(packet: OutgoingPacket, context: T) { @@ -39,25 +40,24 @@ class PacketWriteQueue : TickListener { packetsToWrite.add(QueuedPacket(packet, context)) } - @JvmStatic - fun pop(): QueuedPacket<*>? { - return try { - packetsToWrite.pop() - } catch (e: NoSuchElementException) { - null - } - } - @JvmStatic fun flush() { queueLock.lock() - var packet: QueuedPacket<*>? - while (pop().also { packet = it } != null) - write(packet?.out ?: break, packet?.context ?: break) + + var hasEnded = false + while (!hasEnded) { + try { + val packet = packetsToWrite.pop() + write(packet?.out ?: continue, packet.context ?: continue) + } catch (e: NoSuchElementException) { + hasEnded = true + } + } + if (packetsToWrite.isNotEmpty()) { SystemLogger.logWarn("Packet queue was NOT empty! Remaining packets: ${packetsToWrite.size}") try { - for (pkt in packetsToWrite) SystemLogger.logWarn("${pkt.out.javaClass.simpleName} <- ${pkt.context}") + for (pkt: QueuedPacket<*>? in packetsToWrite) SystemLogger.logWarn("${pkt?.out?.javaClass?.simpleName ?: "NULL"} <- ${pkt?.context ?: "NULL"}") } catch (e: Exception) { e.printStackTrace() @@ -65,12 +65,14 @@ class PacketWriteQueue : TickListener { packetsToWrite.clear() } } + + queueLock.unlock() + val queueIter = packetsToQueue.iterator() while (queueIter.hasNext()) { packetsToWrite.add(queueIter.next()) queueIter.remove() } - queueLock.unlock() } @Suppress("UNCHECKED_CAST")