From acaeecc2a74d0bf6036e4e50eef631f40d9d01ce Mon Sep 17 00:00:00 2001 From: Marcel Date: Sun, 26 Jul 2020 22:21:26 +0200 Subject: [PATCH] [miio] fix port leak - max datagram sockets reached (#8189) Fix Max Datagram connections reached issue Possibly also addressing #8091 as exception during closing would prevent thread closing Signed-off-by: Marcel Verpaalen --- .../internal/discovery/MiIoDiscovery.java | 5 ++-- .../transport/MiIoAsyncCommunication.java | 23 +++++++++++++++---- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/discovery/MiIoDiscovery.java b/bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/discovery/MiIoDiscovery.java index 8508cbca533be..9fb70c7c150ed 100644 --- a/bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/discovery/MiIoDiscovery.java +++ b/bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/discovery/MiIoDiscovery.java @@ -239,9 +239,10 @@ private synchronized void startReceiverThreat() { */ private synchronized void stopReceiverThreat() { if (socketReceiveThread != null) { - closeSocket(); + socketReceiveThread.interrupt(); socketReceiveThread = null; } + closeSocket(); } /** @@ -266,7 +267,7 @@ public void run() { private void receiveData(DatagramSocket socket) { DatagramPacket receivePacket = new DatagramPacket(new byte[BUFFER_LENGTH], BUFFER_LENGTH); try { - while (true) { + while (!interrupted()) { logger.trace("Thread {} waiting for data on port {}", this, socket.getLocalPort()); socket.receive(receivePacket); String hostAddress = receivePacket.getAddress().getHostAddress(); diff --git a/bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/transport/MiIoAsyncCommunication.java b/bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/transport/MiIoAsyncCommunication.java index 284ec3bd5b2e5..7eb098371791e 100644 --- a/bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/transport/MiIoAsyncCommunication.java +++ b/bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/transport/MiIoAsyncCommunication.java @@ -201,8 +201,8 @@ public synchronized void startReceiver() { if (senderThread == null || !senderThread.isAlive()) { senderThread = new MessageSenderThread(); senderThread.start(); + this.senderThread = senderThread; } - this.senderThread = senderThread; } /** @@ -244,6 +244,7 @@ public void run() { logger.warn("Error while polling/sending message", e); } } + closeSocket(); logger.debug("Finished Mi IO MessageSenderThread"); } } @@ -375,6 +376,8 @@ private DatagramSocket getSocket() throws SocketException { if (socket == null || socket.isClosed()) { socket = new DatagramSocket(); socket.setSoTimeout(timeout); + logger.debug("Opening socket on port: {} ", socket.getLocalPort()); + this.socket = socket; return socket; } else { return socket; @@ -383,10 +386,6 @@ private DatagramSocket getSocket() throws SocketException { public void close() { try { - final DatagramSocket socket = this.socket; - if (socket != null) { - socket.close(); - } final MessageSenderThread senderThread = this.senderThread; if (senderThread != null) { senderThread.interrupt(); @@ -394,6 +393,20 @@ public void close() { } catch (SecurityException e) { logger.debug("Error while closing: {} ", e.getMessage()); } + closeSocket(); + } + + public void closeSocket() { + try { + final DatagramSocket socket = this.socket; + if (socket != null) { + logger.debug("Closing socket for port: {} ", socket.getLocalPort()); + socket.close(); + this.socket = null; + } + } catch (SecurityException e) { + logger.debug("Error while closing: {} ", e.getMessage()); + } } /**