From c97bd823348d0cd79b4bca541343fee4b52ffdcd Mon Sep 17 00:00:00 2001 From: zhaowgit Date: Sat, 18 Oct 2025 01:04:11 +0800 Subject: [PATCH] =?UTF-8?q?Issues=20#2091=20Improve=20the=20performance=20?= =?UTF-8?q?of=20RetainedMessages=20without=20subs=E2=80=A6=20(#2093)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Issues #2091 Improve the performance of RetainedMessages without subscribing to RetainedMessageChangedEvent. * Fix build errors * Update release notes --------- Co-authored-by: Christian <6939810+chkr1011@users.noreply.github.com> --- .../Internal/MqttRetainedMessagesManager.cs | 11 ++++++++--- Source/ReleaseNotes.md | 1 + 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/Source/MQTTnet.Server/Internal/MqttRetainedMessagesManager.cs b/Source/MQTTnet.Server/Internal/MqttRetainedMessagesManager.cs index 41dacb9b..9b55369d 100644 --- a/Source/MQTTnet.Server/Internal/MqttRetainedMessagesManager.cs +++ b/Source/MQTTnet.Server/Internal/MqttRetainedMessagesManager.cs @@ -9,8 +9,8 @@ namespace MQTTnet.Server.Internal; public sealed class MqttRetainedMessagesManager { - readonly Dictionary _messages = new Dictionary(4096); - readonly AsyncLock _storageAccessLock = new AsyncLock(); + readonly Dictionary _messages = new(4096); + readonly AsyncLock _storageAccessLock = new(); readonly MqttServerEventContainer _eventContainer; readonly MqttNetSourceLogger _logger; @@ -61,6 +61,7 @@ public sealed class MqttRetainedMessagesManager lock (_messages) { + var hasHandlers = _eventContainer.RetainedMessageChangedEvent.HasHandlers; var payload = applicationMessage.Payload; var hasPayload = payload.Length > 0; @@ -86,10 +87,14 @@ public sealed class MqttRetainedMessagesManager } } + if (saveIsRequired && hasHandlers) + { + messagesForSave = new List(_messages.Values); + } _logger.Verbose("Client '{0}' set retained message for topic '{1}'.", clientId, applicationMessage.Topic); } - if (saveIsRequired) + if (saveIsRequired && hasHandlers) { messagesForSave = new List(_messages.Values); } diff --git a/Source/ReleaseNotes.md b/Source/ReleaseNotes.md index 40e90033..961b7027 100644 --- a/Source/ReleaseNotes.md +++ b/Source/ReleaseNotes.md @@ -1,2 +1,3 @@ * Core: Used new language features across the entire library * Core: Performance improvements +* Server: Improved performance of retained messages when no event handler is attached (#2093, thanks to @zhaowgit)