From 4a85b2fee802f2413cccd199957a96c871473fe2 Mon Sep 17 00:00:00 2001 From: pon0marev Date: Mon, 8 Jun 2026 15:13:27 +0300 Subject: [PATCH] fix: release DirectByteBuffer after MQTT SSL auth to prevent native memory leak Holding sslHandler as a final field kept SSLEngine and its JNI-allocated DirectByteBuffers alive for the full session lifetime. On rapid reconnect loops this caused linear native memory growth, eventually hitting OOM. Null the reference at the end of onValidateDeviceResponse() so SslHandler becomes eligible for Young GC immediately after authentication completes. Add boolean ssl flag to preserve isSSL semantics after the field is cleared. --- .../server/transport/mqtt/MqttTransportHandler.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/common/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/MqttTransportHandler.java b/common/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/MqttTransportHandler.java index f753579292..0748d7c854 100644 --- a/common/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/MqttTransportHandler.java +++ b/common/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/MqttTransportHandler.java @@ -150,7 +150,8 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement protected final MqttTransportContext context; private final TransportService transportService; private final SchedulerComponent scheduler; - private final SslHandler sslHandler; + private final boolean ssl; + private volatile SslHandler sslHandler; private final ConcurrentMap mqttQoSMap; final DeviceSessionCtx deviceSessionCtx; @@ -172,6 +173,7 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement this.context = context; this.transportService = context.getTransportService(); this.scheduler = context.getScheduler(); + this.ssl = sslHandler != null; this.sslHandler = sslHandler; this.mqttQoSMap = new ConcurrentHashMap<>(); this.deviceSessionCtx = new DeviceSessionCtx(sessionId, mqttQoSMap, context); @@ -1373,6 +1375,7 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement } }); } + this.sslHandler = null; } @Override