Releases: emqx/emqx
EMQX Enterprise 5.9.2
Enhancements
Core MQTT Functionalities
- #15773 Throttled client ID registration during reconnects.
- When a previous session cleanup is still in progress, new connections using the same client ID are now throttled. This prevents instability when clients reconnect aggressively.
- Affected clients receive reason code
137(Server Busy) in theCONNACKwith Reason-String"THROTTLED", and should retry after the cleanup completes. - Fixed the reason code returned when another connection registers the same client ID; now correctly returns
137instead of133.
Data Integration
-
#15542 Upgraded our
erlcloudlibrary to3.8.3.0. This allows one to set up a S3 Connector without specifying Access Key Id and Secret Access Key, so long as the EC2 instance EMQX is running in has the correct IAM permissions to read/write to the configured bucket(s). -
#15585 Updated the brod client to version 4.4.4, expanding support for a wider range of Kafka APIs. This update addresses the deprecation of
JoinGroupsAPI versionsv0-v1. -
#15845 The
static_clientidsconfiguration for the MQTT Connector now supports specifying a username and password for each client ID. This is particularly useful for scenarios like connecting to Azure IoT Hub, where each device (client ID) requires a unique set of credentials. This enhancement helps ensure successful connections across multiple nodes in a clustered environment. -
#15911 The HTTP request timeout for the HTTP Action is now configurable via the
resource_opts.request_ttlsetting. Previously, this timeout was fixed at 30 seconds and could not be adjusted.
Observability
-
#15499 Added a force deactivate alarm API endpoint to allow administrators to forcibly deactivate active alarms.
-
#15944 Improved the information returned when a resource is marked as
disconnectedfor the following Connectors: LDAP, Syskeeper, IoTDB, Snowflake (aggregated), JWKS Authentication.
Performance
-
#15536 Disable the
node.global_gc_intervalconfiguration by default. -
#15539 Optimized Erlang VM parameters to improve performance and stability:
- Increased buffer size for distributed channels to 32 MB (
+zdbbl 32768) to preventbusy_dist_port alarmsduring intensive Mnesia operations. - Disabled scheduler busy-waiting (
+sbwt none +sbwtdcpu none +sbwtdio none) to lower CPU usage reported by the operating system. - Set scheduler binding type to db (
+stbt db) to reduce message latency.
- Increased buffer size for distributed channels to 32 MB (
-
#15907 Improve system memory usage.
- Authorization (authz) cache is now cleared immediately when a client disconnects, reducing unnecessary memory consumption.
- Fields such as client ID, username, password, and topic are copied into new binaries (when more than 64 bytes) instead of being slices from the raw packet to reduce 'binary' part of memory usage in Erlang VM.
-
#15949 Changed the default value of the
parse_unitoption in listener configuration fromchunktoframe. This change can significantly reduce CPU usage when the payload size exceeds the socket buffer (default is 4 KB).Note: With
parse_unit = frame, if aPUBLISHpacket exceeds the maximum allowed size, EMQX will close the connection instead of sending aDISCONNECTpacket. -
#16165 Optimized the performance of the
GET /clients_v2API. Previously, when the cluster had around 50,000 clients or more, API calls to retrieve the client list could be extremely slow or even time out.
Bug Fixes
Core MQTT Functionalities
-
#15884 Resolved an issue where, in rare cases, the global routing table could indefinitely retain routing information for nodes that had long left the cluster.
-
#15518 Resolved a race condition that may lead to accumulating inconsistencies in the routing table and shared subscriptions state in the cluster when a large number of shared subscribers disconnect simultaneously.
-
#15872 Eliminated warning log
unclean_terminatewhen disconnected after CONNACK is sent with a non-zero reason code.
Deployment
-
#15553 Fixed an issue in the Helm chart where deploying EMQX with default values started multiple replicas and caused all nodes except one to crash. The chart now defaults to a single replica, since clustered deployments require an Commercial License.
-
#15580 Added a new
emqxLicenseSecretRefvariable to the EMQX Enterprise Helm chart. This allows users to specify a Kubernetes Secret containing the EMQX license key, so the license is applied automatically.This replaces the non-functional
emqxLicenseSecretNamevariable, which created and mounted a secret file but did not pass the license to EMQX. -
#15712 Fixed node boot-up failure during rolling upgrade from older versions (before 5.9)
In previous EMQX versions (before 5.9), a bug in the ZIP timestamp encoder could store an invalid “seconds” value in archive entries (values corresponding to the 30th or 31st 2-second slot in DOS time format).
-
#15863 Fixed the license quota alarm message to correctly reflect session quotas instead of live connections.
Security
-
#15581 Upgraded Erlang/OTP version from 26.2.5.2 to 26.2.5.14. This upgrade includes two TLS-related fixes from OTP that affect EMQX:
- Fixed a crash in TLS connections caused by a race condition during certificate renewal.
- Added support for RSA certificates signed with RSASSA-PSS parameters. Previously, such certificates could cause TLS handshakes to fail with a
bad_certificate/invalid_signature error.
-
#16237 Fixed an issue where OIDC SSO–related logs might still be printed even after SSO was disabled.
-
#16217 Fixed an issue where the OIDC login callback could fail to locate the user session in multi-node cluster environments.
Access Control
-
#15818 Corrected handling of
{allow|deny, all}ACL rules.Previously, these rules were internally translated to match
#, which incorrectly failed to match topics prefixed with$(e.g.$testtopic/1) due to MQTT spec restrictions.
Now, a special internal value is used to ensure{allow|deny, all}rules correctly match any topic, including$-prefixed ones. -
#15844 Added validation to forbid adding empty usernames to the built-in database authenticator. Such users cannot be deleted via the HTTP API later, since they mess up the API path.
If you have such an user and wish to delete it, run the following in an EMQX console:
mria:transaction(emqx_authn_shard, fun() -> mnesia:delete(emqx_authn_mnesia, {'mqtt:global',<<>>}, write) end).
-
#15899 Improved memory management by ensuring that the authorization (authz) cache is cleared immediately when a client disconnects, reducing unnecessary memory consumption.
-
#16081 Fixed an issue where clients using extended authentication and memory-based sessions could crash with a
session_stepdown_request_exceptioncaused by acalling_selferror.Example error log
2025-09-24T07:13:08.973954+08:00 [error] clientid: someclientid, msg: session_stepdown_request_exception, peername: 127.0.0.1:41782, username: admin, error: exit, reason: calling_self, stacktrace: [{gen_server,call,3,[{file,"gen_server.erl"},{line,1222}]},{emqx_cm,request_stepdown,4,[{file,"emqx_cm.erl"},{line,427}]},{emqx_cm,do_takeover_begin,2,[{file,"emqx_cm.erl"},{line,398}]},{emqx_cm,takeover_session,2,[{file,"emqx_cm.erl"},{line,384}]},{emqx_cm,takeover_session_begin,2,[{file,"emqx_cm.erl"},{line,305}]},{emqx_session_mem,open,4,[{file,"emqx_session_mem.erl"},{line,210}]},{emqx_session,open,3,[{file,"emqx_session.erl"},{line,263}]},{emqx_cm,'-open_session/4-fun-1-',4,[{file,"emqx_cm.erl"},{line,290}]},{emqx_cm_locker,trans,2,[{file,"emqx_cm_locker.erl"},{line,32}]},{emqx_channel,post_process_connect,2,[{file,"emqx_channel.erl"},{line,575}]},{emqx_connection,with_channel,3,[{file,"emqx_connection.erl"},{line,852}]},{emqx_connection,process_msg,2,[{file,"emqx_connection.erl"},{line,470}]},{emqx_connection,process_msgs,2,[{file,"emqx_connection.erl"},{line,462}]},{emqx_connection,handle_recv,3,[{file,"emqx_connection.erl"},{line,406}]},{proc_lib,wake_up,3,[{file,"proc_lib.erl"},{line,340}]}], action: {takeover,'begin'}, ...
Data Integration
-
#15616 Kafka connections are now considered healthy even if a
topic_authorization_failederror is returned for the default probing topic. -
#15826 Improved Kafka consumer connector health check behavior with restricted ACLs. Previously, Kafka Consumer Connector health checks could fail if the configured user lacked permission to access the internal
____emqx_consumer_probeconsumer group used for the check. Wi...
EMQX Enterprise 6.0.1
Enhancements
Message Queue
-
#16080 Added a configuration option to disable the Message Queues feature. Disabling Message Queues can slightly reduce the resource usage in the cluster. When Durable Sessions are also disabled, EMQX avoids maintaining Durable Storage, further reducing administrative overhead and improving performance.
-
#16096 Added support for automatic creation of message queues when clients subscribe to non-existent
$q/topics. Now configuration options are available to enable auto-creation for both regular and last-value semantics queues. -
#16097 Optimized message writing to regular message queues by replacing transactional appends with dirty append functions. For QoS 0 messages, asynchronous append operations are now used. These changes significantly improve the performance of message insertion into regular queues.
-
#16098 Added a maximum queue count configuration option to limit the total number of message queues in the system.
-
#16152 Introduced per-queue limits for maximum message count and total message size. Also added new metrics to monitor message append latency and help diagnose performance or queue-limiting issues.
Data Integration
-
#16121 Upgraded the GreptimeDB ingester client to v0.2.3, which fixes several bugs and introduces support for row-based gRPC protocol (the column-based protocol is now deprecated).
Additionally, updated the CI image to the latest stable version of GreptimeDB.
-
#16127 Fixed an invalid string value issue in the GreptimeDB connector, following the changes introduced in #16121.
Performance
-
#15949 Changed the default value of the
parse_unitoption in listener configuration fromchunktoframe. This change can significantly reduce CPU usage when the payload size exceeds the socket buffer (default is 4 KB).Note: With
parse_unit = frame, if aPUBLISHpacket exceeds the maximum allowed size, EMQX will close the connection instead of sending aDISCONNECTpacket. -
#16165 Optimized the performance of the
GET /clients_v2API. Previously, when the cluster had around 50,000 clients or more, API calls to retrieve the client list could be extremely slow or even time out.
Bug Fixes
Core MQTT Functionalities
-
#15884 Resolve an issue where, in rare cases, the global routing table could indefinitely retain routing information for nodes that had long left the cluster.
-
#15518 Resolved a race condition that may lead to accumulating inconsistencies in the routing table and shared subscriptions state in the cluster when a large number of shared subscribers disconnect simultaneously.
Upgrade
-
#16047 Added support to perform rolling upgrade from EMQX Enterprise base version 5.8.0 and newer to 6.0. During the upgrade, legacy configurations are automatically migrated to the new format supported in 6.0. Specifically, the deprecated
bridgesconfiguration root is converted into the newconnectors,sources, andactionsroots.However, the GCP PubSub Consumer and Kafka Consumer sources will still require manual changes. If any source configuration still includes the deprecated
topic_mappingfield, it must be removed. Then, for each entry previously defined intopic_mapping, a separate "Source + Rule" pair must be created manually.
Security
-
#16156 Fixed an issue where some dependencies were missing default configurations compared to EMQX 5.10, potentially causing RSA signature verification failures. The missing defaults could lead to errors, such as the following log message:
{sign_unsupported,[[{rsa_padding,rsa_pkcs1_padding}]]}, [{jose_jwa_unsupported,verify,5,[{file,"src/jwa/jose_jwa_unsupported.erl"},{line,55}]} -
#16175 Fixed an issue with periodic TLS certificate garbage collection. Previously, the garbage collection process incorrectly deleted certificate files that were actively used by configurations in managed namespaces.
Access Control
-
#16081 Fixed an issue where clients using extended authentication and memory-based sessions could crash with a
session_stepdown_request_exceptioncaused by acalling_selferror.Example error log
2025-09-24T07:13:08.973954+08:00 [error] clientid: someclientid, msg: session_stepdown_request_exception, peername: 127.0.0.1:41782, username: admin, error: exit, reason: calling_self, stacktrace: [{gen_server,call,3,[{file,"gen_server.erl"},{line,1222}]},{emqx_cm,request_stepdown,4,[{file,"emqx_cm.erl"},{line,427}]},{emqx_cm,do_takeover_begin,2,[{file,"emqx_cm.erl"},{line,398}]},{emqx_cm,takeover_session,2,[{file,"emqx_cm.erl"},{line,384}]},{emqx_cm,takeover_session_begin,2,[{file,"emqx_cm.erl"},{line,305}]},{emqx_session_mem,open,4,[{file,"emqx_session_mem.erl"},{line,210}]},{emqx_session,open,3,[{file,"emqx_session.erl"},{line,263}]},{emqx_cm,'-open_session/4-fun-1-',4,[{file,"emqx_cm.erl"},{line,290}]},{emqx_cm_locker,trans,2,[{file,"emqx_cm_locker.erl"},{line,32}]},{emqx_channel,post_process_connect,2,[{file,"emqx_channel.erl"},{line,575}]},{emqx_connection,with_channel,3,[{file,"emqx_connection.erl"},{line,852}]},{emqx_connection,process_msg,2,[{file,"emqx_connection.erl"},{line,470}]},{emqx_connection,process_msgs,2,[{file,"emqx_connection.erl"},{line,462}]},{emqx_connection,handle_recv,3,[{file,"emqx_connection.erl"},{line,406}]},{proc_lib,wake_up,3,[{file,"proc_lib.erl"},{line,340}]}], action: {takeover,'begin'}, ...
Clustering
-
#16123 Fix a bug in the component managing Mria replication that could cause cluster joins to hang or remain incomplete in core-replicant clusters.
During cluster changes involving adding new core nodes, those new core nodes could sometimes fail to start replication-related processes required by replicants. As a result, upgraded or newly added replicants could hang during startup.
In Kubernetes deployments, this often caused readiness probes to fail, leading the controller to repeatedly restart the affected replicant pods.
This issue typically affected upgrade rollouts involving the addition of new core and replicant nodes. For example, adding two cores and two replicants (running a newer EMQX version) to an existing cluster with 2 cores and 2 replicants.
Rule Engine
-
#16028 Fixed rule engine
jqfunction memory leak.Previously if
jqbuilt-in functionindexis used (e.g..key | index("name")), it would result in memory leak.
Data Integration
-
#16010 Fixed an issue where a Republish Fallback Action could fail with a
function_clauseerror if the originating rule's SQL did not include themetadatafield from the rule environment.Example error log:
[error] tag: RESOURCE, msg: failed_to_trigger_fallback_action, reason: {error,function_clause}, fallback_kind: republish, primary_action_resource_id: <<"action:type:name:connector:type:name">>, republish_topic: <<"republish/topic">> -
#16046 Fixed a potential out-of-memory (OOM) crash when loading or restarting a configuration containing a Connector with several hundred Actions.
-
#16140 Fix a Redis cluster failover issue that could cause the Connector to remain stuck in a "connecting" state.
Previously, EMQX’s Redis cluster client only refreshed the cluster topology when regular queries (such as
GET) failed. However, failures in periodicPINGcommands did not trigger a refresh. As a result, after a failover, the connector could continue using the outdated cluster topology if no other commands were issued, preventing recovery.With this fix, failed
PINGresponses now trigger a cluster topology refresh, ensuring that the connector can detect failovers and recover promptly.
MQTT Durable Sessions
-
#16105 Durable storage performance optimization. In particular, this fix reduces the latency of
CONNACKfor clients using a durable session. -
#16129 Durable storage transaction configuration can be changed in the runtime. Previously changing this configuration required a node restart.
Observability
-
#15963 Reduced excessive audit log entries generated during looped evaluations in the remote shell (
remsh). -
#15967 Fixed an issue where Mnesia transaction blocking during the cleanup of large volumes of audit logs could lead to rapid memory growth.
-
#16060 Fixed a logger formatter crash that could occur for some debug-level log messages containing deeply nested terms with non-ASCII characters.
Example error log
2025-09-29T06:55:34.120640+00:00 debug: FORMATTER CRASH: {report,#{request => #{messages => [#{role => <<"user">>,content => <<"{\"msg\": \"hello\"}">>}],sy...
EMQX Enterprise 5.10.2
Enhancements
Data Integration
-
#16183 EMQX now logs messages about dropped expired messages (
buffer_worker_dropped_expired_messages) at the warning level, and throttles such messages per resource ID. This helps identify when specific external resources are not keeping up with incoming message rates, potentially leading to message drops. -
#16206 Added the
allow_auto_topic_creationconfiguration option to the Kafka Producer Connector. When enabled, EMQX allows Kafka to automatically create a topic if it doesn’t exist when a client sends a metadata fetch request. -
#16209 Added support for specifying a custom timestamp column name (
ts_column) parameter to GreptimeDB Connector.
Performance
-
#15949 Changed the default value of the
parse_unitoption in listener configuration fromchunktoframe. This change can significantly reduce CPU usage when the payload size exceeds the socket buffer (default is 4 KB).Note: With
parse_unit = frame, if aPUBLISHpacket exceeds the maximum allowed size, EMQX will close the connection instead of sending aDISCONNECTpacket. -
#16165 Optimized the performance of the
GET /clients_v2API. Previously, when the cluster had around 50,000 clients or more, API calls to retrieve the client list could be extremely slow or even time out.
Bug Fixes
Core MQTT Functionalities
-
#15884 Resolve an issue where, in rare cases, the global routing table could indefinitely retain routing information for nodes that had long left the cluster.
-
#15518 Resolved a race condition that may lead to accumulating inconsistencies in the routing table and shared subscriptions state in the cluster when a large number of shared subscribers disconnect simultaneously.
Access Control
-
#16081 Fixed an issue where clients using extended authentication and memory-based sessions could crash with a
session_stepdown_request_exceptioncaused by acalling_selferror.Example error log
2025-09-24T07:13:08.973954+08:00 [error] clientid: someclientid, msg: session_stepdown_request_exception, peername: 127.0.0.1:41782, username: admin, error: exit, reason: calling_self, stacktrace: [{gen_server,call,3,[{file,"gen_server.erl"},{line,1222}]},{emqx_cm,request_stepdown,4,[{file,"emqx_cm.erl"},{line,427}]},{emqx_cm,do_takeover_begin,2,[{file,"emqx_cm.erl"},{line,398}]},{emqx_cm,takeover_session,2,[{file,"emqx_cm.erl"},{line,384}]},{emqx_cm,takeover_session_begin,2,[{file,"emqx_cm.erl"},{line,305}]},{emqx_session_mem,open,4,[{file,"emqx_session_mem.erl"},{line,210}]},{emqx_session,open,3,[{file,"emqx_session.erl"},{line,263}]},{emqx_cm,'-open_session/4-fun-1-',4,[{file,"emqx_cm.erl"},{line,290}]},{emqx_cm_locker,trans,2,[{file,"emqx_cm_locker.erl"},{line,32}]},{emqx_channel,post_process_connect,2,[{file,"emqx_channel.erl"},{line,575}]},{emqx_connection,with_channel,3,[{file,"emqx_connection.erl"},{line,852}]},{emqx_connection,process_msg,2,[{file,"emqx_connection.erl"},{line,470}]},{emqx_connection,process_msgs,2,[{file,"emqx_connection.erl"},{line,462}]},{emqx_connection,handle_recv,3,[{file,"emqx_connection.erl"},{line,406}]},{proc_lib,wake_up,3,[{file,"proc_lib.erl"},{line,340}]}], action: {takeover,'begin'}, ...
Rule Engine
-
#16028 Fixed rule engine
jqfunction memory leak.Previously if
jqbuilt-in functionindexis used (e.g..key | index("name")), it would result in memory leak.
Data Integration
-
#16010 Fixed an issue where a Republish Fallback Action could fail with a
function_clauseerror if the originating rule's SQL did not include themetadatafield from the rule environment.Example error log:
[error] tag: RESOURCE, msg: failed_to_trigger_fallback_action, reason: {error,function_clause}, fallback_kind: republish, primary_action_resource_id: <<"action:type:name:connector:type:name">>, republish_topic: <<"republish/topic">> -
#16043 Improved log details for Kafka data integration when
not_all_kafka_partitions_connectedevent occurs. -
#16046 Fixed a potential out-of-memory (OOM) crash when loading or restarting a configuration containing a Connector with several hundred Actions.
-
#16138 Fix a Redis cluster failover issue that could cause the Connector to remain stuck in a "connecting" state.
Previously, EMQX’s Redis cluster client only refreshed the cluster topology when regular queries (such as
GET) failed. However, failures in periodicPINGcommands did not trigger a 6880 refresh. As a result, after a failover, the connector could continue using the outdated cluster topology if no other commands were issued, preventing recovery.With this fix, failed
PINGresponses now trigger a cluster topology refresh, ensuring that the connector can detect failovers and recover promptly. -
#16212 Removed Kafka producer linger time when the buffer queue is in memory mode.
Observability
-
#15963 Reduced excessive audit log entries generated during looped evaluations in the remote shell (
remsh). -
#15967 Fixed an issue where Mnesia transaction blocking during the cleanup of large volumes of audit logs could lead to rapid memory growth.
Breaking Changes
-
#16062 Fixed an issue where RocketMQ actions ignored the configured payload template and sent the entire rule output instead.
If you relied on the previous (incorrect) behavior, you may need to update your payload templates to ensure messages are formatted as expected.
EMQX Enterprise 6.0.0
Feature Highlights
EMQX Enterprise 6.0.0 is the first release of the EMQX Enterprise version 6 series, bringing significant architectural improvements and new capabilities.
Message Queue
The native Message Queue feature unifies real-time MQTT publish/subscribe with persistent asynchronous queuing. The server buffers messages that match a topic filter, retaining them even when subscribers are offline. Clients can consume these messages through the special $q/{topic} topic, ensuring reliable message delivery.
Message Queues support offline message storage, last-value retention, and flexible dispatch strategies, enhancing MQTT with both real-time and durable messaging capabilities.
Namespace
The Namespace feature improves multi-tenancy and observability with namespace-level roles in the Dashboard. Users are restricted to their own resources (e.g., Rules, Actions, and Connectors) with fine-grained permissions such as Administrator or Viewer, and roles can be managed via the Dashboard, API, or CLI, simplifying multi-tenant operations.
Session count tracking has also been optimized: counts refresh on demand when there are fewer than 1,000 connections, and every 5 seconds otherwise. During rolling upgrades from older versions, counts may temporarily appear inconsistent, but will stabilize once all nodes are updated.
MQTT Durable Sessions
Durable storage has been optimized by separating session data from the broker’s other metadata, significantly reducing RAM usage and improving storage efficiency.
New configuration options provide finer control over RocksDB memory usage and performance. In addition, the default serialization schema for stored messages has been updated to ASN.1, further enhancing efficiency.
New Data Integrations
- Google BigQuery
- AWS AlloyDB
- CockroachDB
- AWS Redshift
Enhanced Integration
-
AWS:
- Support for Instance Metadata Service v2 APIs from EC2 instances when using S3 or S3Tables data integration. This enables seamless access to S3 buckets without manual AWS credential configuration, leveraging IAM roles for better security.
- Parquet format support for S3 Tables Action.
-
RabbitMQ: Define custom Headers and Properties Templates in RabbitMQ Sink to enhance message routing and compatibility within RabbitMQ.
-
Snowflake: Snowpipe Streaming upload mode for Snowflake Action (preview feature).
-
RocketMQ: New
keyandtagtemplate fields in Action, along with akey_dispatchoption for the Produce Strategy, allowing greater customization of message metadata.
Elixir Support
All packages now ship with Elixir support through the Mix build system, opening EMQX to the Elixir community and enabling better tooling with IEx console.
Enhanced LDAP Support
LDAP authorization now supports extended ACL rules in JSON format, and LDAP authentication can fetch ACL rules directly from LDAP with client-side caching.
Improved Tracing
Configurable limits for maximum traces (trace.max_traces) and trace file sizes (trace.max_file_size).
After max_file_size is reached, the trace log will rotate to a new file instead of halting.
Cluster Management
New cluster.description configuration option allows users to set and display custom cluster descriptions in the EMQX Dashboard.
Enhancements
Message Queue
- #15789 Implemented Message Queues, which are collections of messages identified by
topic_filter. Each queue has an explicit lifecycle and is automatically replenished with published messages matched with the queue's topic filter during the queue's lifetime. Clients can cooperatively consume messages from a queue by subscribing to a special topic in the format:$q/{topic}.
Core MQTT Functionalities
- #15805 Introduced a dedicated worker pool for handling sharded fanout message delivery.
Previously, the broker pool handled both subscription management and message dispatch, which could lead to scheduling contention. This change separates the fanout dispatch workload into its own pool to ensure more balanced and efficient handling of pub/sub operations.
Access Control
-
#15349 Optimize external resource management for authentication and authorization. Previously, EMQX could remain connected to a resource configured for a disabled authenticator or authorizer.
-
#15294 Enhanced LDAP authentication and authorization. LDAP authorization now supports extended ACL rules in JSON format. LDAP authentication can now fetch ACL rules from LDAP. These rules are cached in the client's metadata, so authorization is performed without additional LDAP queries.
-
#15730 Added support for overriding the client ID based on authentication results. If an authentication backend returns a
clientid_overrideattribute upon successful authentication, it will replace the client’s original client ID.The following backends now support
clientid_override:- HTTP
- JWT
- LDAP
- MongoDB
- MySQL
- Postgres
- Redis
-
#15820 Changed default value of config
authorization.no_matchfromallowtodenyfor better security defaults.
Clustering
- #15600 Introduced a new configuration option
cluster.descriptionthat allows you to add a descriptive label to the EMQX cluster. This description can be updated viaPUT /cluster, and retrieved with theGET /clusterAPI.
LLM-Based MQTT Data Processing
-
#15467 Exposed transport configuration options for AI Completion Providers. Users can now configure connection timeouts and the maximum number of connections to AI Completion Providers. This helps prevent
checkout_timeouterrors when message throughp 10BC0 ut is high and the provider is under load. -
Flow designer supports integrating with the Google Gemini model.
-
#15631 Added a new API endpoint to list all models available for an AI provider.
-
#15467 Exposed transport options for AI Completion Providers. These options allow configuring connection timeouts and maximum connections to an AI Completion Provider.
-
#15724 Introduced
openai_responsetype for AI Completion Providers and completion profiles to use OpenAI'sresponseAPI.
Data Integration
-
#15418 EMQX supports data integration with BigQuery.
-
#15401 Added support for the Snowpipe Streaming upload mode in the Snowflake Action.
Note: Snowpipe Streaming is currently a preview feature and is only available for Snowflake accounts hosted on AWS. -
#15387 Added rate limiting to Kinesis Producer Connector and Action health checks to comply with AWS API quotas and improve cluster behavior.
- Health check calls to
ListStreamsandDescribeStreamare now limited to 5/s and 10/s per Connector, respectively, matching AWS rate limits. - A distributed limiter is coordinated by a core node in the cluster to enforce these limits consistently.
- If a health check is throttled or times out, the Connector or Action will now retain its previous status instead of being marked as disconnected.
Also introduced a new
resource_opts.health_check_interval_jitter, which adds a uniform random delay toresource_opts.health_check_intervalto reduce the chance of multiple Actions under the same Connector running health checks at the same time. - Health check calls to
-
#15176 Upgraded the GreptimeDB Connector client and supported an optional new parameter
ttlto set the default time-to-live for automatically created tables. -
#15649 EMQX supports data integration with AWS AlloyDB, CockroachDB, and AWS Redshift.
-
#15635 Added new
keyandtagtemplate fields in the RocketMQ Action, allowing customization of the message's key and tag. Also, introduced a newkey_dispatchoption for theProduce Strategyfield. -
#15621 Now,
access_key_idandsecret_access_keyare optional fields for the S3 Tables Connector. If omitted, they'll be obtained from the Instance Metadata Service v2 APIs from the EC2 instance where EMQX is deployed. -
#15628 Removed HStreamDB data integration.
-
#15544 Added Arrow Flight SQL NIF driver support for Datalayers Integration.
-
#15637 Added support for templating message headers and properties for the RabbitMQ Action.
-
#15864 Removed the deprecated "Bridges V1" APIs and configuration schemas. All endpoints under
/bridges/*and configuration entries under thebridgesroot key are no longer available, as data integrations have fully migrated to the "Connectors/Actions/Sources" model. -
#15583 Updated the
brodclient to version 4.4.4, expanding support for a wider range of Kafka APIs. This update addresses the deprecation ofJoinGroupsAPI versionsv0-v1.
Smart Data Hub
- #15525 Prevented deletion of internal sch...
EMQX Enterprise 5.10.1
Enhancements
Performance
-
#15907 Improve system memory usage. Fields such as client ID, username, password, and topic are copied into new binaries (when more than 64 bytes) instead of being slices from the raw packet to reduce 'binary' part of memory usage in Erlang VM.
-
#15899 Authorization (authz) cache is now cleared immediately when a client disconnects, reducing unnecessary memory consumption.
Observability
-
#15499 Added a force deactivate alarm API endpoint to allow administrators to forcibly deactivate active alarms.
-
#15364 Added HTTP header configuration items to the OpenTelemetry integration to adapt to collectors with HTTP authentication.
Access Control
-
#15294 Enhanced LDAP authentication and authorization.
LDAP authorization now supports an extended ACL rule format using JSON, in addition to the existing simple topic list. ACL rules can also be fetched from LDAP during authentication based on client information, and are cached in the client’s metadata to avoid repeated LDAP queries during authorization. -
#15349 Optimized external resource management for authentication and authorization. Previously, EMQX could remain connected to a resource configured for a disabled authentication or authorization provider.
Data Integration
-
#15360 Added support for writing data files in Parquet format for Amazon S3 Tables Action.
-
#15387 Added rate limiting to Kinesis Producer Connector and Action health checks to comply with AWS API quotas and improve cluster behavior.
- Health check calls to
ListStreamsandDescribeStreamare now limited to 5/s and 10/s per Connector, respectively, matching AWS rate limits. - A distributed limiter is coordinated by a core node in the cluster to enforce these limits consistently.
- If a health check is throttled or times out, the Connector or Action will now retain its previous status instead of being marked as disconnected.
Also introduced a new
resource_opts.health_check_interval_jitter, which adds a uniform random delay toresource_opts.health_check_intervalto reduce the chance of multiple Actions under the same Connector running health checks at the same time. - Health check calls to
-
#15542 Upgraded our
erlcloudlibrary to3.8.3.0. This allows one to setup a S3 Connector without specifying Access Key Id and Secret Access Key, so long as the EC2 instance EMQX is running in has the correct IAM permissions to read/write to the configured bucket(s). -
#15845 The
static_clientidsconfiguration for the MQTT Connector now supports specifying a username and password for each client ID. This is particularly useful for scenarios like connecting to Azure IoT Hub, where each device (client ID) requires a unique set of credentials. This enhancement helps ensure successful connections across multiple nodes in a clustered environment. -
#15944 Improved the information returned when a resource is marked as
disconnectedfor the following Connectors: LDAP, Syskeeper, IoTDB, Snowflake (aggregated), JWKS Authentication. -
#15911 Now, for the HTTP Action, the HTTP request timeout is taken to be the same as
resource_opts.request_ttl. Previously, it was a fixed, non-configurable value of 30 seconds. -
#15371 Added
tagsfields to the return ofGET /actions_summaryandGET /sources_summary, and to the fallback actions returned inGET /actions/:id.
CLI
- #15399 The
node_dumptool now exports the current system configuration in HOCON format, with sensitive information (such as passwords and secrets) automatically redacted for security.
Bug Fixes
API
-
#15547 Resolved an issue where EMQX would fail to process HTTP requests with large bodies (e.g., 10MB) in the REST API.
-
#15797 To improve compatibility with EMQX 4.x, the
encodingparameter has been reintroduced in the batch publish HTTP API (/api/v5/publish/bulk) as an alias forpayload_encoding. This change addresses migration issues for users relying on the originalencodingparameter, and ensures existing integrations using EMQX v4 APIs can continue working without requiring software-level changes.
Observability
- #15785 Resolved a crash that occurred when MQTT usernames containing non-ASCII characters were used in formatting network congestion alarm messages.
Gateway
- #15342 Fixed a crash in the NATS gateway caused by client info override templates referencing undefined packet fields. The system now returns an empty binary instead of undefined atom.
Core MQTT Functions
-
#15361 Fixed a
function_clauseerror when parsing a malformedUser-Propertypair with invalid (too short) length. -
#15396 Removed redundant cleanup operations for shared subscriptions of disconnected clients. These operations were prone to crashes under high disconnect volumes and could lead to inconsistencies in the global broker state.
-
#15416 Fixed occasional warning-level log events and crashes during session expiration of WebSocket connections. This issue was introduced by recent WebSocket performance improvements. If did not affect broker capacity, but produced log entries like the following:
error: {function_clause,[{gen_tcp,send,[closed,[]],[{file,“gen_tcp.erl”},{line,966}]},{cowboy_websocket_linger,commands,3,[{file,“cowboy_websocket_linger.erl”},{line,665}]},...message: {tcp,#Port<0.364>,<<136,130,...>>}, msg: emqx_session_mem_unknown_message
-
#15872 Eliminated warning log
unclean_terminatewhen disconnected after CONNACK is sent with a non-zero reason code. -
#15518 Resolve a race condition that may lead to accumulating inconsistencies in the routing table and shared subscriptions state in the cluster when a large number of shared subscribers disconnect simultaneously.
Data Integration
-
#15394 Fixed a rare race condition where Action metrics could become inconsistent due to unexpected asynchronous replies.
-
#15603 Fixed an issue in the MQTT bridge where a stale connection could be shown as
Connectedand would not automatically reconnect. -
#15826 Improved Kafka consumer connector health check behavior with restricted ACLs. Previously, Kafka Consumer Connector health checks could fail if the configured user lacked permission to access the internal
____emqx_consumer_probeconsumer group used for the check. With this fix, if the Kafka broker returns an "ACL denied" response, EMQX will treat the connection as healthy. -
#15827 Fixed atom and process leaks in the GreptimeDB driver.
Fixed a
function_clauseerror that could arise if certain incorrect write syntaxes were used in GreptimeDB Actions. -
#15836 Enriched the returned information when a Kafka Consumer Source fails to be added, for example, due to denied topic ACLs.
-
#15850 Fixed an issue with the MQTT bridge when a stale connection was displayed as
Connectedand the connection was not re-established. -
#15866 Upgrade Kafka producer lib wollf to
4.0.12to improve handling of temporarily missing partitions in Kafka metadata responses.In rare race conditions, Kafka may return an incomplete partition list.
Previously, this was only handled when a topic was recreated with fewer partitions, but not when partitions were temporarily missing.
This gap could cause the partition producer to stall and block shutdown indefinitely. -
#15906 Upgraded Kafka producer library Wolff from
4.0.12to4.0.13, which adds handling for therecord_list_too_largeerror inProduceResponse. -
#15902 Upgrade MQTT client library to 1.13.8
This improves MQTT bridge connectivity with:
- Connector will automatically reconnect when peer broker does not reply PINGRESP.
- Bridge over TLS failure is more promptly handled if connection breaks while waiting for CONNACK.
-
#15910 Fixed an issue with Connectors where a pool of workers could fail to recover from a failure if multiple workers crashed simultaneously in large worker pools.
Connectors affected and fixed:
- MySQL
- PostgreSQL
- Oracle
- SQLServer
- TDEngine
- Cassandra
- Dynamo
- HTTP
- Couchbase
- GCP PubSub
- Snowflake
Upgraded
gunand related dependencies to 2.1.0.
Deployment
- #15553 Fixed an issue in the Helm chart where deploying EMQX with default values started multiple replicas and caused all nodes except one to crash. The chart now defaults to a single replica, since clustered deployments require an Commerc...
EMQX v5.8.8
Enhancements
Deployment
- #15813 Added package release for Debian 13 (Trixie), and updated Docker images to use Debian 13 as the base.
Core MQTT Functionalities
- #15773 Throttled client ID registration during reconnects.
- When a previous session cleanup is still in progress, new connections using the same client ID are now throttled. This prevents instability when clients reconnect aggressively.
- Affected clients receive reason code
137(Server Busy) in theCONNACKwith Reason-String"THROTTLED", and should retry after the cleanup completes. - Fixed the reason code returned when another connection registers the same client ID; now correctly returns
137instead of133.
Observability
- #15499 Added a force deactivate alarm API endpoint to allow administrators to forcibly deactivate active alarms.
Performance
- #15536 Disabled the
node.global_gc_intervalconfiguration by default to improve overall performance stability, as it caused CPU fluctuations and higher message latency while providing little benefit over Erlang’s built-in garbage collector. - #15539 Optimized Erlang VM parameters to improve performance and stability:
- Increased buffer size for distributed channels to 32 MB (
+zdbbl 32768) to preventbusy_dist_port alarmsduring intensive Mnesia operations. - Disabled scheduler busy-waiting (
+sbwt none +sbwtdcpu none +sbwtdio none) to lower CPU usage reported by the operating system. - Set scheduler binding type to db (
+stbt db) to reduce message latency.
- Increased buffer size for distributed channels to 32 MB (
Bug Fixes
Deployment
-
#15580 Added a new
emqxLicenseSecretRefvariable to the EMQX Enterprise Helm chart. This allows users to specify a Kubernetes Secret containing the EMQX license key, so the license is applied automatically.This replaces the non-functional
emqxLicenseSecretNamevariable, which created and mounted a secret file but did not pass the license to EMQX.
Clustering
- #14778 Fixed an issue where a node could not join a running cluster if that node had broken symlinks in its
data/certsordata/authzdirectories.
Security
- #15581 Upgraded Erlang/OTP version from 26.2.5.2 to 26.2.5.14. This upgrade includes two TLS-related fixes from OTP that affect EMQX:
- Fixed a crash in TLS connections caused by a race condition during certificate renewal.
- Added support for RSA certificates signed with RSASSA-PSS parameters. Previously, such certificates could cause TLS handshakes to fail with a
bad_certificate/invalid_signature error.
Observability
- #15639 Fixed an issue where the
packets.subscribe.auth_errormetric was not incremented when subscription authentication failed.
Gateway
- #15679 Fixed incorrect global chain names for the ExProto gateways. Built-in authentication data for these gateways was previously grouped under
unknown:global, causing conflicts between gateways. - #15699 Fixed an issue where built-in authentication data for gateways (e.g., CoAP) was incorrectly removed when a node was stopped or restarted.
ExHook
- #15683 Fixed ExHook TLS options so that gRPC clients can correctly verify the server hostname during the TLS handshake.
EMQX Enterprise 5.8.8
Enhancements
Deployment
- #15813 Added package release for Debian 13 (Trixie), and updated Docker images to use Debian 13 as the base.
Core MQTT Functionalities
- #15773 Throttled client ID registration during reconnects.
- When a previous session cleanup is still in progress, new connections using the same client ID are now throttled. This prevents instability when clients reconnect aggressively.
- Affected clients receive reason code
137(Server Busy) in theCONNACKwith Reason-String"THROTTLED", and should retry after the cleanup completes. - Fixed the reason code returned when another connection registers the same client ID; now correctly returns
137instead of133.
Data Integration
- #15542 Upgraded our
erlcloudlibrary to3.8.3.0. This allows users to set up an S3 Connector without specifying Access Key Id and Secret Access Key, so long as the EC2 instance EMQX is running in has the correct IAM permissions to read/write to the configured bucket(s). - #15585 Updated the brod client to version 4.4.4, expanding support for a wider range of Kafka APIs. This update addresses the deprecation of
JoinGroupsAPI versionsv0-v1.
Observability
- #15499 Added a force deactivate alarm API endpoint to allow administrators to forcibly deactivate active alarms.
Performance
- #15536 Disabled the
node.global_gc_intervalconfiguration by default to improve overall performance stability, as it caused CPU fluctuations and higher message latency while providing little benefit over Erlang’s built-in garbage collector. - #15539 Optimized Erlang VM parameters to improve performance and stability:
- Increased buffer size for distributed channels to 32 MB (
+zdbbl 32768) to preventbusy_dist_port alarmsduring intensive Mnesia operations. - Disabled scheduler busy-waiting (
+sbwt none +sbwtdcpu none +sbwtdio none) to lower CPU usage reported by the operating system. - Set scheduler binding type to db (
+stbt db) to reduce message latency.
- Increased buffer size for distributed channels to 32 MB (
Bug Fixes
Deployment
-
#15580 Added a new
emqxLicenseSecretRefvariable to the EMQX Enterprise Helm chart. This allows users to specify a Kubernetes Secret containing the EMQX license key, so the license is applied automatically.This replaces the non-functional
emqxLicenseSecretNamevariable, which created and mounted a secret file but did not pass the license to EMQX.
Clustering
- #14778 Fixed an issue where a node could not join a running cluster if that node had broken symlinks in its
data/certsordata/authzdirectories.
Security
- #15581 Upgraded Erlang/OTP version from 26.2.5.2 to 26.2.5.14. This upgrade includes two TLS-related fixes from OTP that affect EMQX:
- Fixed a crash in TLS connections caused by a race condition during certificate renewal.
- Added support for RSA certificates signed with RSASSA-PSS parameters. Previously, such certificates could cause TLS handshakes to fail with a
bad_certificate/invalid_signature error.
Data Integration
- #15616 Kafka connections are now considered healthy even if a
topic_authorization_failederror is returned for the default probing topic.
Smart Data Hub
- #15706 Fixed an indexing issue that could cause Message Transformations and Schema Validations to behave inconsistently. Deleting one item could corrupt the topic index, so that a subsequent item remained active even after being disabled.
- #15708 Fixed an issue where external schema registries were not reloaded after a node restart.
Observability
- #15639 Fixed an issue where the
packets.subscribe.auth_errormetric was not incremented when subscription authentication failed.
Gateway
- #15679 Fixed incorrect global chain names for the ExProto, JT/T 808, GB/T 32960, and OCPP gateways. Built-in authentication data for these gateways was previously grouped under
unknown:global, causing conflicts between gateways. - #15699 Fixed an issue where built-in authentication data for gateways (e.g., CoAP) was incorrectly removed when a node was stopped or restarted.
- #15822 Fixed an issue where the OCPP connection would crash after sending a certain number of messages.
ExHook
- #15683 Fixed ExHook TLS options so that gRPC clients can correctly verify the server hostname during the TLS handshake.
EMQX e6.0.0-M2.202508
Enhancements
-
#15628 Remove HStreamDB data integration.
-
#15463 Durable storage RAM usage and storage efficiency optimizations.
- Added the following configuration parameters for the durable storage:
durable_storage.messages.rocksdb.write_buffer_size: RocksDB memtable size per shard.durable_storage.messages.rocksdb.cache_size: RocksDB block size per shard.durable_storage.messages.rocksdb.max_open_files: Limits the number of file descriptors used by RocksDB per shard.durable_storage.messages.layout.wildcard_thresholds: Allows to tune wildcard thresholds for thewildcard_optimized_v2storage layout
- The default
serialization_schemafor the messages has been changed toasn1.
-
#15484 Changed our build system so that all packages are build with Elixir's Mix. This opens up EMQX to Elixir community and allows us to use Elixir dependencies when required, besides enabling use of IEx as a better EMQX console.
-
#15525 Now, when attempting to remove an Internal Schema which is being referenced by either a Schema Validation or a Message Transformation, the removal will be denied.
-
#15542 Upgraded our
erlcoudlibrary to3.8.3.0. This allows one to setup a S3 Connector without speci 2D7B fying Access Key Id and Secret Access Key, so long as the EC2 instance EMQX is running in has the correct IAM permissions to read/write to the configured bucket(s). -
#15544 Add Arrow Flight SQL NIF driver support for Datalayers Integration.
-
#15556 Exposed maximum trace file size limit per each individual trace as a configuraion option
trace.max_file_size. -
#15583 Updated our
brodclient to version 4.4.4. This expands the supported Kafka API ranges, in particular due to theJoinGroupsAPIv0andv1being deprecated. -
#15594 Exposed maximum number of traces allowed to exist in the cluster simultaneously as a configuration option
trace.max_traces. This limit does not apply to node-local traces managed throughemqx ctl trace.Optimized tracing implementation to eliminate potential atom leaks per created trace.
-
#15600 Added a new
cluster.descriptionconfiguration that allows one to add a description to the EMQX cluster. This description can be changed viaPUT /cluster, and viewed in theGET /clusterresponse. -
#15621 Now,
access_key_idandsecret_access_keyare optional fields for the S3Tables Connector. If omitted, they'll be obtained from the Instance Metadata Service v2 APIs from the EC2 instance where EMQX is deployed. -
#15631 A new API endpoint is added to list all models available for an AI provider.
-
#15635 Added new
keyandtagtemplate fields for the RocketMQ Action which sets the message's key and tag, respectively. Also, added a newkey_dispatchvalue for thestrategyfield. -
#15649 Added new Connectors and Actions that appends data to AWS AlloyDB, CockroachDB and AWS Redshift.
-
#15724 Introduce
openai_responsetype for AI Completion Providers and completion profiles to use OpenAI'sresponseAPI. -
#15536 Disable the
node.global_gc_intervalconfiguration by default. -
#15539 Optimize Erlang VM parameters.
- Increase the buffer sizes for distributed channels to 32MB to avoid
busy_dist_portalarms during intensive Mnesia operations:+zdbbl 32768 - Disable scheduler busy-waiting to reduce CPU usage observed by the operating system:
+sbwt none +sbwtdcpu none +sbwtdio none - Set scheduler binding type to
dbto reduce message latency:+stbt db
- Increase the buffer sizes for distributed channels to 32MB to avoid
-
#15451 Introduce experimental
socketbackend for TCP listeners, designed to improve message processing latency and reduce compute resource usage. This can be enabled via the newtcp_backendlistener option.
Bug Fixes
-
#15383 Fix a potential resource leak in MQTT bridge when the bridge fails to start. Previously, the topic index table was not properly cleaned up when the bridge failed to start.
-
#15547 Fixed error when an HTTP request with a large body is sent.
-
#15489 Fix OIDC issuer scheme validation.
The previously unsupported issuer URLs listed below are now supported.
https://xxxxxxxx:8443/webman/sso/.well-known/openid-configurationhostname
-
#15553 Fixes an issue with helm chart when all nodes except one will be crashing if the chart is deployed with default values.
-
#15569 Fixed an issue where a Republish Rule Action could fail if the template for
direct_dispatchwas an empty string or resolve to a non-boolean value. Now, if such situations occur, the default value,false, will be used. -
#15580 Add emqxLicenseSecretRef variable to EMQX Enterprise helm chart, allowing users to specify a Kubernetes secret containing the EMQX license key. This fixes the issue with defunct emqxLicenseSecretName variable.
-
#15603 Fixed an issue with the MQTT bridge when a stale connection was displayed as `Connected' and the connection was not re-established.
-
#15647 Previously, if the user of a MongoDB Connector did not have sufficient privileges to perform
findqueries in afoocollection, it would be considered disconnected. This has been fixed. -
#15693 Postgres-based bridges were patched to avoid leaking connection pools. Previously, depending on race conditions when initializing the pool, if one later deleted the Connector, the pool could still be present.
-
#15696 Support connection rate limiting for WebSocket (WS) and WebSocket Secure (WSS) listeners. Listener configuration options
max_conn_rateandmax_conn_burstare now respected: incoming connections going over specified connection rate are closed immediately after being accepted, mirroring TCP listener behavior.The
max_connectionsoption for WS/WSS listeners has also slightly changed: connections exceeding the limit are closed immediately after acceptance, before any HTTP protocol exchange. Clients will now see an abrupt socket close instead of HTTP 429.
Breaking Changes
-
#15613 Stopped releasing packages for Debian 10.
-
#15635 We no longer support setting key templates (and thus implicitly specifying key dispatch strategy) in the
parameters.strategyfield of RocketMQ Action. Instead, users should setparameters.strategy = key_dispatchand specify the template inparameters.key.
EMQX Enterprise 6.0.0-M1.202507
e6.0.0-M1.202507
Enhancements
-
#15176 Upgrade the GreptimeDB connector client and support an optional new parameter
ttlto set the default time-to-live for automatically created tables. -
#15294 Enhance LDAP authentication and authorization.
LDAP authorization now supports extended ACL rules in JSON format.
LDAP authenticaton now can fetch ACL rules from LDAP. These rules are cached in the client's metadata, so authorization is performed without additional LDAP queries. -
#15349 Optimize external resource management for authentication and authorization. Previously, EMQX could remain connected to a resource configured for a disabled authentication or authorization provider.
-
#15360 Added support for writing data files in Parquet format for S3Tables Action.
-
#15364 Add HTTP header configuration items to the OpenTelemetry integration to adapt to collectors with HTTP authentication.
-
#15371 Added
tagsfields to the return ofGET /actions_summaryand to the fallback actions returned inGET /actions/:id. -
#15387 Improved Kinesis Producer Connector and Action health checks to mitigate the occurrence of rate limiting when calling
ListStreamsandDescribeStreamAPIs. Now, we limit the the calls per Connector to such APIs to 5/s and 10/s, respectively. If a Connector or Action cannot call their health check API before timing out, they will simply maintain their current status. If they receive a throttling response (e.g.:LimitExceededException), they will also maintain their current status.Introduced a new
resource_opts.health_check_interval_jitterconfiguration to add an uniform random delay toresource_opts.health_check_interval, so that multiple Actions under the same Connector will seldom run their health checks simultaneously. -
#15399 Now,
node_dumpwill export the current system configuration in HOCON format with redacted secrets. -
#15401 Added support for Snowpipe Streaming upload mode for Snowflake Action. Note: this is currently a preview feature by Snowflake, and support for it is available to all accounts on AWS only.
-
#15418 Added new Connector and Action that appends data to BigQuery.
-
#15467 Expose transport options for AI Completion Providers.
These options allow configuring connection timeouts and maximum connections to an AI Completion Provider.
Bug Fixes
-
#15342 Fixed NATS gateway crash when clientinfo override templates contain undefined packet fields by returning empty binary instead of undefined atom.
-
#15361 Fixed a function clause error when parsing a malformed
User-Propertypair where the pair length is wrong (too short). -
#15394 Fixed a very rare race condition in which Action metrics could end up in an inconsistent state.
-
#15396 Removed redundant cleanup operations for shared subscriptions of disconnected clients, which were prone to crashes under high disconnect volume, resulting in potential inconsistencies in the global broker state.
-
#15416 Fixed occasional warning-level log events and crashes during session expiration of WebSocket connections, introduced by recent WebSocket performance improvements. These had no impact on broker capacity, but produced log entries like the following:
error: {function_clause,[{gen_tcp,send,[closed,[]],[{file,“gen_tcp.erl”},{line,966}]},{cowboy_websocket_linger,commands,3,[{file,“cowboy_websocket_linger.erl”},{line,665}]},...message: {tcp,#Port<0.364>,<<136,130,...>>}, msg: emqx_session_mem_unknown_message
-
#15476 When most of the Actions that use aggregated mode (Azure Blob Storage, Snowflake, S3Tables) had a delivery that failed, the following log would be printed:
"emqx_connector_aggreg_delivery:format_status/1 crashed"This has been fixed, and more information about the delivery process will now be logged.
-
#15518 Resolve a race condition that may lead to accumulating inconsistencies in the routing table and shared subscriptions state in the cluster when a large number of shared subscribers disconnect simultaneously.
-
#15522 Fixed an issue where Snowflake Connector would fail to start correctly is
usernamewas not provided.
EMQX v5.8.7
Bug Fixes
- #15383 Fixed a potential resource leak in the MQTT bridge. When the bridge failed to start, the topic index table was not properly cleaned up. This fix ensures that the index table is correctly deleted to prevent resource leaks.