v2.12.3
nats-io/nats-serverv2.12.3Dec 17, 2025by github-actions[bot]
AI Summary
This release (v2.12.3) of nats-server focuses on stability improvements and bug fixes, particularly for JetStream/Raft consensus and MQTT functionality. It adds a new WebSocket ping interval configuration option and includes numerous fixes for data races, quorum issues, and potential data corruption scenarios.
Key Highlights
- Added WebSocket-specific ping interval configuration with `ping_internal` in the websocket block
- Fixed multiple Raft consensus issues including peer removal, quorum counting, and membership change race conditions
- Resolved numerous JetStream data corruption scenarios including filestore compaction and message block handling
- Fixed MQTT retained messages to work correctly across accounts with subject transforms
- Addressed multiple data races in clustered JetStream operations
New Features
- WebSocket ping interval configuration via `ping_internal` in the websocket block
Full Release Notes
## Changelog Refer to the [2.12 Upgrade Guide](https://docs.nats.io/release-notes/whats_new/whats_new_212) for backwards compatibility notes with 2.11.x. ### Go Version - 1.25.5 (#7604) ### Dependencies - github.com/google/go-tpm v0.9.7 (#7578) - github.com/nats-io/nkeys v0.4.12 (#7578) - golang.org/x/crypto v0.45.0 (#7578) - github.com/klauspost/compress v1.18.2 (#7604) - github.com/antithesishq/antithesis-sdk-go v0.5.0-default-no-op (#7604) - golang.org/x/crypto v0.46.0 (#7648) - golang.org/x/sys v0.39.0 (#7648) ### Added General - Added WebSocket-specific ping interval configuration with `ping_internal` in the `websocket` block (#7614) ### Improved JetStream - The scan for the last sourced message sequence when setting up a subject-filtered source is now considerably faster (#7553) - The metalayer will now stage and deduplicate recovery operations at startup, instead of rapidly applying and then undoing conflicting assignments (#7540) - Consumer interest checks on interest-based streams are now significantly faster when there are large gaps in interest (#7656) MQTT - Retained messages will now work correctly even when sourced from a different account and has a subject transform (#7636) ### Fixed General - WebSocket connections will now correctly limit the buffer size during decompression (#7625, thanks to Pavel Kokout at Aisle Research) JetStream - A protocol error caused by an invalid transform of acknowledgement reply subjects when originating from a gateway connection has been fixed (#7579) - The meta layer will now only respond to peer remove requests after quorum has been reached (#7581) - Invalid subject filters containing non-terminating full wildcard no longer produce unexpected matches (#7585) - A data race when creating a stream in clustered mode has been fixed (#7586) - Raft will no longer allow multiple membership changes to take place concurrently (#7565, #7609) - A panic when processing snapshots with missing nodes or assignments has been fixed (#7588) - When purging whole message blocks, the subject tracking and scheduled messages are now updated correctly (#7593) - Raft will no longer count responses from peer-removed nodes towards quorum (#7589) - The filestore will no longer unexpectedly lose writes when `AsyncFlush` is enabled after a process pause (#7594) - The filestore now will process message removal on disk before updating accounting, which improves error handling (#7595, #7601) - Raft quorum counting has been refactored so the implicit leader ack is now only counted if still a part of the membership (#7600) - Raft now writes the peer state immediately when handling a peer-remove to ensure the removed peers cannot unexpectedly reappear after a restart (#7602) - The `DiscardNewPerSubject` retention policy is now enforced by the leader before proposing rather than by individual replicas, reducing the potential for stream desync (#7607) - Raft will no longer allow peer-removing the one remaining peer (#7610) - A data race has been fixed in the stream health check (#7619) - Tombstones are now correctly written for recovering the sequences after compacting or purging an almost-empty stream to seq 2 (#7627) - Combining skip sequences and compactions will no longer overwrite the block at the wrong offset, correcting a `corrupt record state` error (#7627) - Compactions that reclaim over half of the available space now use an atomic write to avoid losing messages if killed (#7627) - Filestore message lookups will now expire the cache if a cache error is encountered (#7630) - Improved error handling within the loading of message blocks if not already cached (#7631) - Add peer operations to Raft can no longer result in disjoint majorities (#7632) - Filestore compaction should no longer result in `no idx present` cache errors (#7634) - Filestore compaction now correctly adjusts the high and low sequences for a message block, as well as cleaning up the deletion map accordingly (#7634) - Raft groups should no longer readmit a previously removed peer if a heartbeat occurs between the peer removal and the leadership transfer (#7649) - Potential stream desyncs that could happen during stream snapshotting have been fixed (#7655) MQTT - The maximum payload size is now correctly enforced for MQTT clients (#7555, thanks to @yixianOu) - Fixed a panic that could occur when reloading config if the user did not have permission to access retained messages (#7596) - Fixed account mapping for JetStream API requests when traversing non-JetStream-enabled servers (#7598) - QoS0 messages are now mapped correctly across account imports/exports with subject mappings (#7605) - Loading retained messages no longer fails after restarting due to last sequence checks (#7616) - A bug which could corrupt retained messages in clustered deployments has been fixed (#7622) - Permissions to `$MQTT.` subscriptions are now handled implicitly, with the exception of `deny` ACLs which still permit restriction (#7637) - A bug where QoS2 messages could not be retrieved after a server restart has been fixed (#7643) ### Complete Changes https://github.com/nats-io/nats-server/compare/v2.12.2...v2.12.3