v2.11.2
nats-io/nats-serverv2.11.2Apr 25, 2025by github-actions[bot]
AI Summary
This is a patch release for NATS Server 2.11 that includes numerous improvements and bug fixes. Note: This version contains a regression fixed in 2.11.3. Key improvements include default sentinel JWT support, new trace_headers security option, improved JetStream purge performance, and fixes for clustered consumer consistency. A notable change is that replicated consumer throughput may be impacted by the consumer consistency fix.
Key Highlights
- Default sentinel JWT support enables default users in operator mode
- New trace_headers option prevents payload exposure in trace logs
- Major JetStream purge performance improvements, especially for KV PurgeDeletes
- Fixed clustered consumer consistency - prevents redelivery of acknowledged messages after leader changes
- GOMAXPROCS and GOMEMLIMIT now reported in statsz and varz endpoints
Breaking Changes
- Clustered consumer throughput may be negatively impacted by the consistency fix (waiting for delivered state to reach quorum before delivering new messages)
New Features
- Default sentinel JWT for operator mode
- trace_headers configuration option for secure trace logging
- Subject delete markers now placed for TTL-aged messages (not just MaxAge policy)
- Support importing same subject from multiple different accounts via service imports
- Per-message TTLs can be set lower than SubjectDeleteMarkerTTL when stream has max messages per subject of 1
- Auto re-admission of peer-removed servers after 5 minutes without restart
- Auth tokens now redacted in trace-level logs
- Improved tls_timeout configuration parsing consistency
Full Release Notes
> [!IMPORTANT] > This version contains a regression that has since been fixed in 2.11.3. Please upgrade to that version instead. ## Changelog Refer to the [2.11 Upgrade Guide](https://docs.nats.io/release-notes/whats_new/whats_new_211) for backwards compatibility notes with 2.10.x. ### Go Version - 1.24.2 ### Dependencies - github.com/nats-io/nats.go v1.41.2 (#6805) - github.com/nats-io/nkeys v0.4.11 (#6805) - github.com/nats-io/jwt/v2 v2.7.4 (#6813) ### Added General - Support for a default sentinel JWT, which is used in operator mode when none is specified, has been added making it possible to have default users (#6577) - New `trace_headers` option to ensure that trace logging only emits headers and not message payloads (#6638) JetStream - Subject delete markers are now placed for messages that have aged out due to their TTL and not just because of the `MaxAge` policy (#6741) ### Improved General - The publish permissions cache should now remain under the max allowed size more aggressively with improved pruning (#6674) - It is now possible with service imports to import the same subject from multiple different accounts (#6704) - Updating an account claim with a reduced max connection count no longer causes internal clients to be closed, fixing cases where JetStream assets could become unavailable (#6785) - `GOMAXPROCS` and `GOMEMLIMIT` are now reported in both `statsz` and `varz` (#6791) - Improved `tls_timeout` configuration parsing consistency between `authorization` and `timeout` (#6731) - Allow servers with different pool sizes when using multiple routes, simplifying configuration changes and rolling updates (#6676) - Auth tokens are now redacted in trace-level logs for enhanced security (#6808) - Trapped signals are now logged at notice level instead of debug (#6800) JetStream - Improved purge performance, particularly for KV `PurgeDeletes` calls, with optimised code paths for finding last sequences and reducing allocations (#6801, #6825) - Improved replicated asset creation performance by campaigning for group leadership more quickly (#6697) - Improved the debug log message when resetting a group WAL after failing to truncate (#6705) - Improved checking for streams that overlap with JS API or system subjects, so that badly-configured streams should not be able to break the API (#6786) - Allow setting per-message TTLs to values lower than the configured `SubjectDeleteMarkerTTL` when the stream has a max messages per subject limit of 1 (#6818) - Servers that have been `peer-remove`'d can now be re-admitted automatically after 5 minutes without a server restart (#6815) ### Fixed General - Fix a possible panic when a subject transform has missing tokens (#6612) - Fix a possible panic when adding dedicated routes during a configuration reload (#6668) - Data race when shutting down eventing has been resolved (#6620) - A deadlock when updating account claims with service imports/exports has now been fixed (#6726) - The `jsz` monitoring endpoint now correctly paginates with `offset` (#6794, #6816) - Parsing the `cluster_traffic` option at startup no longer results in a panic if the account has not loaded yet (#6733) JetStream - Fix clustered consumer consistency problems by waiting for delivered state to reach quorum before delivering new messages, resolving issues where acknowledged messages could be redelivered after a consumer leader change - **NOTE:** This may negatively impact the throughput of replicated consumers. R1 consumers, consumers with `AckNone` ack policy and ordered consumers are not affected and may be more suitable for high-speed processing - JetStream is no longer incorrectly disabled when specifying `--js` and `--store_dir` on the command line and then issuing a configuration reload (#6609) - Correctly remove messages from an interest-based stream when using `AckAll` consumers (#6587) - Preserve the first sequence when rebuilding state due to invalid checksums with no remaining messages (#6647) - When recovering from disk, ignore temporary files that can be created during stream compression so that the same blocks do not get loaded more than once (#6684) - Do not incorrectly reset group WALs when a new leader sends matching term information after a snapshot (#6691) - Corrected a regression in the memory store when purging, aligning it with the filestore behaviour (#6714) - When issuing a peer remove on a stream, the new peer set is now proposed through the NRG layer, potentially avoiding a drift in peers (#6720) - When issuing a peer remove on a consumer, the new peer set is now proposed through the NRG layer, potentially avoiding a drift in peers (#6727) - A race condition that could result in observer nodes becoming incorrectly elected as a group leader has been fixed when using leafnodes with shared system accounts (#6730) - Ensure that duplicate Raft groups are not created for the same asset during a restart (#6732) - Allow the use of the extended consumer create API when combining service imports/exports and limited API permissions (#6759) - Streams with the `FirstSeq` configured are no longer incorrectly purged after a restart if the stream first sequence still matches the configured first sequence (#6753) - Correctly write tombstones when purging and compacting, fixing a bug that could result in some deleted messages returning if the stream index had to be rebuilt (#6685) - The memory store no longer leaks memory tracking deleted sequences after a full stream purge (#6769) - Correctly handle acks for subjects that include a `@` character (#6777) - Avoid losing stream sequence numbers of the server is interrupted by generating a new last message block before removing the final remaining block, particularly noticeable with WQ or interest retention policies (#6778) - Use the correct floor when using `AckAll` in R1 consumers (#6790) - Preserve consumer state when a stream needs to be reset due to a failed catchup (#6796) - Correctly enforce the 32MB maximum publish size limit into JetStream, avoiding filestore corruption from overflowing the maximum record length (#6798) - Preserve the redelivered state if the consumer leader is placed on a server that is a lagging stream follower to keep accounting correct (#6698) - Idempotent stream or consumer creations on a server upgrade from 2.10.x will no longer fail due to metadata changes (#6716) - Do not place rejected messages with invalid TTLs into the deduplication map if using `Nats-Msg-Id` (#6725) - Message TTLs are now recovered properly from multiple messages if the timed hash wheel state is lost or corrupted on disk (#6758) - Consumer priority groups will no longer get stuck in a tight-loop if there are multiple requests from different clients but some are not receiving due to the priority policy (#6749) - Subject delete markers are now replicated more reliably and are now retriable, improving consistency in clustered mode (#6776) - Tombstones are now correctly written for messages that have aged out due to their TTL, such that the deletion is preserved if the stream state is rebuilt (#6781) - Corrected an off-by-one error that could cause the TTL state to be rebuilt unnecessarily on a server restart (#6679) - Fixed a race condition in the timed hash wheel that could result in an underflow of the hash count (#6787) - Push consumers are no longer incorrectly marked as inactive after a delivery failure if there is continued interest (#6807) - Internal clients for JetStream are no longer closed unexpectedly after updating an expired account claim (#6817) - Fixed a panic that could potentially occur when starting clustered consumers when the metalayer is shutting down (#6823) - Fixed a bug in subject tree intersection that could miss some subjects when looking for first matching messages matching `FilterSubjects` (#6828) - Subject delete markers now have the correct headers when retrieved using direct get (#6826) - Messages with a TTL now are removed correctly after a restart has interrupted the deletion process (#6828) Gateways - Fixed a bug that could result in a lost queue subscriptions on gateway connections after a restart or a remote unsubscribe (#6607) ### Complete Changes https://github.com/nats-io/nats-server/compare/v2.11.1...v2.11.2