RATATOSKRATATOSK
Sign in

NATS

v2.15.1Networking & Messaging
Oct 9, 2026

CHECK 5OTHER 60

A maintenance release focused on correctness and performance, with a legacy gateway behavior removed and new limits and validations that may affect existing configurations. It also includes fixes across authentication, account and subscription handling, configuration reloads, clustering, storage, consumers, and client operations.

Check if affected (5)

  • securityauth_users auth callout bypass issues corrected

    Applies if you configure auth_users.

    Issues with the auth callout auth_users bypass have been fixed.

  • breakingThe max_ha_assets limit, enforced consistently

    Applies if you configure max_ha_assets.

    The metalayer leader now enforces the max_ha_assets limit consistently during stream and consumer placement, scaling, and moves.

  • breakingThe legacy $GR. reply prefix, removed

    Applies if you use the legacy $GR. reply prefix.

    Support for sending and handling the legacy $GR. reply prefix used by servers before v2.1.2 has been removed.

  • breakingRemote proxy options rejected without a proxy URL

    Applies if you configure Remote proxy options and do not specify a proxy URL.

    Remote proxy options are now rejected when no proxy URL is specified.

  • breakingThe legacy $GR. reply prefix reserved on client ingress

    Applies if client ingress is in use.

    The legacy $GR. reply prefix is now reserved on client ingress, preventing clients from publishing to gateway reply subjects that use the prefix.

All 60 other recorded changesfixes 43 · value changes 15 · additions 1 · constraints 1

fixes (43)

  • - Connz requests selecting a connection by cid now correctly apply account, user and MQTT client ID filters (#8613)
  • - Pipelined client operations are no longer processed after a connection is rejected for exceeding the account's max_connections limit (#8614)
  • - Queue subscription deny permissions are now checked against the mapped delivery subject (#8616)
  • - Outstanding reply permissions are now preserved when inherited account permissions are refreshed without changing the response policy (#8620, contributed by @0xasritha)
  • - Subscription deny filters are now rebuilt atomically when inherited account permissions are refreshed, preventing a window in which denied messages could be delivered (#8622, contributed by @0xasritha)
  • - Unquoted configuration values beginning with a number and a size or exponent suffix, such as 0K1abc, are now correctly parsed as strings (#8263, contributed by @koriyoshi2041)
  • - Account JWT updates now reject invalid subject mappings instead of reporting success, and failed replacements no longer remove existing mappings (#8627, contributed by @vulragrag-star)
  • - Cached subscription results are now cleared when an already connected client sends another CONNECT, preventing stale results from being reused after an account change (#8641, reported by @Tan-JunWei)
  • - Fixed several data races affecting service imports and exports during configuration reloads and account updates (#8675)
  • - Per-account routes no longer double count inbound account message and byte statistics (#8677)
  • - TLS certificate pin validation now checks the correct pins after a configuration reload (#8679)
  • - Auth callout rejections are now reported as authentication errors instead of account connection limit errors (#8688, contributed by @aniketatgithub)
  • - Scoped ProxyRequired settings are now respected in JWTs and auth callouts (#8694)
  • - Subscription interest notifications are no longer missed when a subscription is added or removed concurrently (#8703)
  • - Fast batch ping no longer starts a new batch incorrectly (#8714)
  • - Fixed a PDH counter buffer overflow on Windows
  • - Stale per-message TTL entries are now removed when their messages have already been deleted, avoiding repeated expiry scans and excess CPU and memory usage (#8595, contributed by @digitalstraw)
  • - The maximum deliveries exceeded advisory is now sent correctly when a consumer's max_deliver is lowered below a message's existing delivery count (#8605, contributed by @zeke-lin)
  • - The consumer created time is now preserved after recovery (#8621)
  • - Filestore compaction now respects the configured sync settings when replacing a message block (#8629)
  • - Fixed a race during filestore compaction that could cause consumers to skip messages or lose redelivery tracking (#8623, contributed by @as-clearview)
  • - Concurrent updates to R1 consumers no longer lose API responses (#8628)
  • - Stream and consumer create and delete requests received during metalayer catchup now receive responses once catchup completes (#8643)
  • - R1 consumer create requests no longer lose their responses when the consumer is deleted immediately afterwards (#8643)
  • - Fixed a data race when handling consumer leader stepdown requests (#8647)
  • - Clustered snapshots now use the correct generated names for ephemeral consumers, allowing backup validation and restore to succeed (#8651, contributed by @kris70lesgo)
  • - Fixed a memory leak affecting pull requests and direct gets after a configuration reload when the system account is explicitly configured in the accounts block (#8650, contributed by @1995parham)
  • - Fixed membership change, learner scale-up and metalayer commit recovery issues (#8672)
  • - Fixed migration and R1 scale-up issues that could delete a running store or lose writes (#8673)
  • - Recreated streams with renamed Raft groups now start their monitors correctly (#8673)
  • - Consumers are no longer moved to new stream peers before those peers hold the stream data (#8678)
  • - Failed clustered stream restores now clean up correctly without deleting a subsequently recreated stream or losing a stream rm response (#8702)
  • - Fixed a panic when shutting down a clustered JetStream server immediately after startup (#8707, contributed by @clwluvw)
  • - Idempotent stream create requests with sources no longer time out after leader changes (#8703)
  • - Interest cleanup no longer compacts a stream past its last sequence during recovery (#8710, contributed by @pat-s)
  • - Raft nodes will no longer leak their WAL if stopped before route connections are available (#8711, contributed by @clwluvw)
  • - Recovered ephemeral consumers with inactive_threshold set are now cleaned up properly after a server restart (#8732)
  • - Publish permissions are now checked against the transformed subject sent over the leafnode connection, avoiding the need to also allow the original stream import subject (#8530, contributed by @fbarth-ifr)
  • - Fixed incorrect pending byte accounting after a partial compressed write that could stall a leafnode connection and prevent it from reconnecting (#8636)
  • - Closed leafnode connections are now correctly removed from the account's leafnode list, reducing retained memory and garbage collection pressure (#8637)
  • - Remote proxies no longer incorrectly warn that nats:// URLs are unsupported or lose the hub's initial INFO message (#8701)
  • - Config load no longer breaks QoS1/QoS2 delivery when max_ack_pending is unset (#8671)
  • - MQTT packet lengths are validated earlier against max_payload, and non-QoS 2 PUBREC packets are handled correctly (#8692)

value changes (15)

  • - Stalled source and mirror flow control is now reported in stream info and warning logs, making missing $JS.FC.> imports or exports easier to diagnose (#8633)
  • - Stream and consumer placement now prefers peers that have caught up with the metalayer, reducing delays in API responses (#8643)
  • - Improved the performance of deleting entries from and encoding AVL sequence sets (#8646)
  • - Fast batch publish now reports backward sequence gaps as well as forward gaps (#8699)
  • - Stream pending message calculations avoid unnecessary filestore cache access and handle deleted sequence ranges more efficiently (#8680, #8681)
  • - Stream restore format detection now stops after the first S2 chunk (#8693)
  • - Stream restore waits for the preferred node to become leader, avoiding an incorrect create response during clustered restore (#8690)
  • - Memory backed streams avoid copying message headers and bodies twice when storing messages (#8652, contributed by @randomizedcoder)
  • - Leafz now reports whether a leafnode connection uses WebSockets (#8683)
  • - QoS2 PUBLISH and PUBREL processing is now pipelined for increased throughput (#8416, contributed by @levb)
  • - Reduced allocations and buffer copying when processing QoS1 and QoS2 messages and issuing JetStream store and delete requests (#8624, #8625, contributed by @levb)
  • - Partial packets are no longer copied in full on every read, reducing allocations and buffer copying (#8692)
  • - TLS state is now available to auth callouts when leafnodes connect over WebSockets (#8686, contributed by @jurry-duty)
  • - Leafnode clients are now shed alongside regular clients during lame duck shutdown, avoiding a thundering herd (#8695)
  • - Leafnode isolation is now checked before the subscription permission checks, reducing CPU usage on hubs with large numbers of isolated leafnodes (#8727)

additions (1)

  • - Leafnode interest and request/reply across account imports (#8730, contributed by @edjeffreys)

constraints (1)

  • - Remote proxies now support TLS with https:// proxy URLs and an optional proxy tls block (#8701)
Add NATS to your stack

A weekly email arrives when a release needs action. Like the security patches and breaking changes in this release.

Add to stack →