Repository navigation
Releases: nats-io/nats-server
Release list
Release v2.15.1-RC.2
Changelog
Refer to the 2.15 Upgrade Guide for backwards compatibility notes with 2.14.x.
Go Version
- 1.27.1
Improved
JetStream
- 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)
Monitoring
- Leafz now reports whether a leafnode connection uses WebSockets (#8683)
MQTT
- Partial packets are no longer copied in full on every read, reducing allocations and buffer copying (#8692)
Fixed
General
- 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)
- Scoped
ProxyRequiredsettings 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)
Leafnodes
- TLS state is now available to auth callouts when leafnodes connect over WebSockets (#8686)
- Leafnode clients are now shed alongside regular clients during lame duck shutdown, avoiding a thundering herd (#8695)
- Remote proxies now support TLS with
https://proxy URLs and an optional proxytlsblock (#8701) - Remote proxies no longer incorrectly warn that
nats://URLs are unsupported or lose the hub's initialINFOmessage (#8701) - Remote proxy options are now rejected when no proxy URL is specified (#8701)
JetStream
- 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 rmresponse (#8702) - Fixed a panic when shutting down a clustered JetStream server immediately after startup (#8707)
- 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)
MQTT
- MQTT packet lengths are validated earlier against
max_payload, and non-QoS 2PUBRECpackets are handled correctly (#8692)
Complete Changes
Release v2.14.8-RC.2
Changelog
Refer to the 2.14 Upgrade Guide for backwards compatibility notes with 2.12.x. Please note that the 2.13.x version was skipped.
Go Version
- 1.26.8
Improved
JetStream
- 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 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)
Monitoring
- Leafz now reports whether a leafnode connection uses WebSockets (#8683)
MQTT
- Partial packets are no longer copied in full on every read, reducing allocations and buffer copying (#8692)
Fixed
General
- 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)
- Fast batch ping no longer starts a new batch incorrectly (#8714)
- Auth callout rejections are now reported as authentication errors instead of account connection limit errors (#8688)
- Scoped
ProxyRequiredsettings 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)
Leafnodes
- TLS state is now available to auth callouts when leafnodes connect over WebSockets (#8686)
- Leafnode clients are now shed alongside regular clients during lame duck shutdown, avoiding a thundering herd (#8695)
- Remote proxies now support TLS with
https://proxy URLs and an optional proxytlsblock (#8701) - Remote proxies no longer incorrectly warn that
nats://URLs are unsupported or lose the hub's initialINFOmessage (#8701) - Remote proxy options are now rejected when no proxy URL is specified (#8701)
JetStream
- Fixed a panic when shutting down a clustered JetStream server immediately after startup (#8707)
- Idempotent stream create requests with sources no longer time out after leader changes (#8703)
MQTT
- MQTT packet lengths are validated earlier against
max_payload(#8692)
Complete Changes
Release v2.15.1-RC.1
Changelog
Refer to the 2.15 Upgrade Guide for backwards compatibility notes with 2.14.x.
Go Version
- 1.27.1
Changed
JetStream
- The
max_ha_assetslimit is now enforced consistently by the metalayer leader during stream and consumer placement, scaling and moves (#8639)
Gateways
- Support for sending and handling the legacy
$GR.reply prefix, used by servers prior to v2.1.2, has been removed (#8615)
Improved
JetStream
- 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)
MQTT
- QOS 2
PUBLISHandPUBRELprocessing is now pipelined for increased throughput (#8416, contributed by @levb) - Reduced allocations and buffer copying when processing QOS 1 and QOS 2 messages and issuing JetStream store and delete requests (#8624, #8625, contributed by @levb)
Fixed
General
Connzrequests selecting a connection bycidnow 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_connectionslimit (#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)
JetStream
- 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_deliveris 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
accountsblock (#8650, contributed by @1995parham)
Leafnodes
- 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)
Gateways
- The legacy
$GR.reply prefix is now reserved on client ingress, preventing clients from publishing to gateway reply subjects using that prefix (#8615)
MQTT
- Config load no longer breaks QoS1/QoS2 delivery when
max_ack_pendingis unset (#8671)
Complete Changes
Release v2.14.8-RC.1
Changelog
Refer to the 2.14 Upgrade Guide for backwards compatibility notes with 2.12.x. Please note that the 2.13.x version was skipped.
Go Version
- 1.26.8
Changed
Gateways
- Support for sending and handling the legacy
$GR.reply prefix, used by servers prior to v2.1.2, has been removed (#8615)
Improved
JetStream
- 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)
Fixed
General
- Concurrent account JWT updates no longer invalidate stream imports and interrupt message delivery (#8610)
- Configuration reloads no longer incorrectly disconnect operator mode clients that send an
nkey(#8609) Connzrequests selecting a connection bycidnow 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_connectionslimit (#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)
JetStream
- Stream scale-down requests are now rejected when the target replica count has no configured account tier (#8608)
- 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_deliveris 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)
- Fixed a memory leak affecting pull requests and direct gets after a configuration reload when the system account is explicitly configured in the
accountsblock (#8650, contributed by @1995parham)
Leafnodes
- 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)
Gateways
- The legacy
$GR.reply prefix is now reserved on client ingress, preventing clients from publishing to gateway reply subjects using that prefix (#8615)
MQTT
- Config load no longer breaks QoS1/QoS2 delivery when
max_ack_pendingis unset (#8671)
Complete Changes
Release v2.15.0
Changelog
Refer to the 2.15 Upgrade Guide for backwards compatibility notes with 2.14.x. This release also contains all changes up to and including v2.14.7.
Go Version
- 1.27.1 (#8551)
Added
JetStream
- Desired state metalayer (#8432, #8437, #8439, #8443, #8452, #8460, #8476, #8576, #8598, #8602, #8603)
- A new desired state reconciliation engine for streams and consumers considerably improves the safety and reliability of asset moves and scales
- Updating the placement or replication factor midway through an existing scale/move operation, cancelling an in-flight scale/move, or peer-removing is now much safer
- ADR: https://github.com/nats-io/nats-architecture-and-design/blob/main/adr/ADR-62.md
- Cancel stream move endpoint (#8476)
- An in-flight scale/move operation on a stream can be cancelled and the asset returned to its original placement using the new
$JS.API.STREAM.CANCEL_MOVEendpoint - ADR: https://github.com/nats-io/nats-architecture-and-design/blob/main/adr/ADR-62.md
- An in-flight scale/move operation on a stream can be cancelled and the asset returned to its original placement using the new
- Evacuate endpoints (#8443)
- The new
$JS.API.SERVER.EVACUATEendpoint can safely evacuate streams, and any consumers on those streams, from a node - The new
$JS.API.STREAM.PEER.EVACUATE.*endpoint can safely evacuate a peer, and any consumers on that peer, from a stream - These operations combined allow for maintenance operations with full transfer of data and state without having to peer-remove first
- ADR: https://github.com/nats-io/nats-architecture-and-design/blob/main/adr/ADR-62.md
- The new
- Metalayer rescue for disaster recovery (#8408)
- The new
$JS.API.META.RESCUEendpoint can temporarily lower the quorum-needed for the metalayer, in order to facilitate the recovery of a system where nodes have been permanently lost and the metalayer cannot reach quorum - ADR: https://github.com/nats-io/nats-architecture-and-design/blob/main/adr/ADR-61.md
- The new
- Stream backup and restore v2 (#7882, #8584, #8591, #8604)
- A new backup format for stream snapshots which reads out per-message rather than per-block
- The new backup format also now correctly includes non-replicated consumers on follower nodes
- ADR: https://github.com/nats-io/nats-architecture-and-design/blob/main/adr/ADR-63.md
- Detect source stream recreation (#8384)
- The server now detects a source stream being recreated, restarting the sourcing back from the beginning, ensuring new messages are sourced
- Stream source indexing (#8282, #8516, #8283)
- Restarts and leader changes previously required expensive backward scans through the stream to find the last sourced indices. These are now persisted in an index for instant lookup.
- Domain-prefixed JS API in system account (#8429)
- When a system account is bridged between the hub and a leaf node, the domain-prefixed JS API can now be used to operate on the leaf node while directly connected to the hub
Changed
JetStream
- Streams now have a default limit of 1000 consumers, unless
max_consumersis specified in the stream config or account limits (#8337, #8566)- Applications planning to use a large number of consumers on a stream should configure
max_consumersin the stream config or account limits to an appropriately high number - The server-wide default of 1000 can be overridden by setting
default_max_consumersin the JetStream limits, or can be disabled by setting to-1 - This limit does not affect existing consumers and will not result in consumer deletions, only the creation of new consumers is prevented
- Applications planning to use a large number of consumers on a stream should configure
- Sync changes for replicated streams (#8447)
- When the
sync_intervalis set toalways, replicated streams now sync their WAL entries but no longer sync upper stream layer writes - The synced log allows the stream to recover safely, but removing unnecessary syncs from the upper stream layer dramatically improves performance
- Non-replicated R1 streams are not affected by this change and will continue to sync at the stream layer as normal
- When the
- The
js_raft_delete_rangefeature is now enabled by default (#8520)
Leafnodes
- The
no_advertiseoption no longer includes the hub's own listener address (#8451, contributed by @freakes)
Improved
JetStream
- Shorter wait for durable source/mirror consumer resets (#8323)
- When using durable consumers for sourcing or mirroring, the heartbeats now short-circuit the recreation backoff
- An atomic batch for a single-replica stream run with
sync: alwaysnow syncs messages as a group (#8539, contributed by @RainyPixel) - JetStream source/mirror reply subjects can now opt-in to be domain/account aware (#8586, contributed by @ayushk-1801)
MQTT
Fixed
Leafnodes
- Leafnode isolation using
request_isolation, or with hub-enforcedisolate, now works correctly across cluster nodes (#8504)
Complete Changes
Release v2.15.0-RC.2
Changelog
This release also contains all changes up to and including v2.14.7.
Go Version
- 1.27.1 (#8551)
Added
JetStream
- Desired state metalayer (#8432, #8437, #8439, #8443, #8452, #8460, #8476, #8576, #8598, #8602)
- A new desired state reconciliation engine for streams and consumers considerably improves the safety and reliability of asset moves and scales
- Updating the placement or replication factor midway through an existing scale/move operation, cancelling an in-flight scale/move, or peer-removing is now much safer
- Cancel stream move endpoint (#8476)
- An in-flight scale/move operation on a stream can be cancelled and the asset returned to its original placement using the new
$JS.API.STREAM.CANCEL_MOVEendpoint
- An in-flight scale/move operation on a stream can be cancelled and the asset returned to its original placement using the new
- Evacuate endpoints (#8443)
- The new
$JS.API.SERVER.EVACUATEendpoint can safely evacuate streams, and any consumers on those streams, from a node - The new
$JS.API.STREAM.PEER.EVACUATE.*endpoint can safely evacuate a peer, and any consumers on that peer, from a stream - These operations combined allow for maintenance operations with full transfer of data and state without having to peer-remove first
- The new
- Metalayer rescue for disaster recovery (#8408)
- The new
$JS.API.META.RESCUEendpoint can temporarily lower the quorum-needed for the metalayer, in order to facilitate the recovery of a system where nodes have been permanently lost and the metalayer cannot reach quorum
- The new
- Stream backup and restore v2 (#7882, #8584, #8591)
- A new backup format for stream snapshots which reads out per-message rather than per-block
- The new backup format also now correctly includes non-replicated consumers on follower nodes
- Detect source stream recreation (#8384)
- The server now detects a source stream being recreated, restarting the sourcing back from the beginning, ensuring new messages are sourced
- Stream source indexing (#8282, #8516, #8283)
- Restarts and leader changes previously required expensive backward scans through the stream to find the last sourced indices. These are now persisted in an index for instant lookup.
- Domain-prefixed JS API in system account (#8429)
- When a system account is bridged between the hub and a leaf node, the domain-prefixed JS API can now be used to operate on the leaf node while directly connected to the hub
Changed
JetStream
- Streams now have a default limit of 1000 consumers, unless
max_consumersis specified in the stream config or account limits (#8337, #8566)- Applications planning to use a large number of consumers on a stream should configure
max_consumersin the stream config or account limits to an appropriately high number - The server-wide default of 1000 can be overridden by setting
default_max_consumersin the JetStream limits, or can be disabled by setting to-1 - This limit does not affect existing consumers and will not result in consumer deletions, only the creation of new consumers is prevented
- Applications planning to use a large number of consumers on a stream should configure
- Sync changes for replicated streams (#8447)
- When the
sync_intervalis set toalways, replicated streams now sync their WAL entries but no longer sync upper stream layer writes - The synced log allows the stream to recover safely, but removing unnecessary syncs from the upper stream layer dramatically improves performance
- Non-replicated R1 streams are not affected by this change and will continue to sync at the stream layer as normal
- When the
- The
js_raft_delete_rangefeature is now enabled by default (#8520)
Leafnodes
- The
no_advertiseoption no longer includes the hub's own listener address (#8451)
Improved
JetStream
- Shorter wait for durable source/mirror consumer resets (#8323)
- When using durable consumers for sourcing or mirroring, the heartbeats now short-circuit the recreation backoff
Fixed
Leafnodes
- Leafnode isolation using
request_isolation, or with hub-enforcedisolate, now works correctly across cluster nodes (#8504)
Complete Changes
Release v2.14.7
Changelog
Refer to the 2.14 Upgrade Guide for backwards compatibility notes with 2.12.x. Please note that the 2.13.x version was skipped.
Go Version
- 1.26.8 (#8551)
Dependencies
- github.com/antithesishq/antithesis-sdk-go v0.8.0-default-no-op (#8562)
- github.com/klauspost/compress v1.20.0 (#8562)
- golang.org/x/crypto v0.57.0 (#8597)
- golang.org/x/sys v0.48.0 (#8597)
- golang.org/x/time v0.16.0 (#8597)
Added
JetStream
- Compatibility for the new desired state metalayer, introduced in v2.15, to support safe upgrades and downgrades (#8554)
Improved
General
- The
fastrandandmath/randpackages have been replaced withmath/rand/v2(#8538, #8557) - Reduced lock contention that could arise from tracking event IDs or closed connections (#8533)
JetStream
- When syncing deletes from a snapshot, block removals are now aggregated, reducing pending calculations (#8545)
- Message size checks are now performed before more expensive header checks (#8561)
- Pending calculations are now considerably faster when the max messages per subject limit is 1 (#8567)
Fixed
General
- The
{{left}}and{{right}}mapping functions now work correctly in account mappings and source/mirror transforms (#8568)
JetStream
- A potential underflow when calculating deletes in skip messages has been fixed (#8546)
- Fixed an issue where catchup signals to the metalayer are blocked, which could stall stream or cluster management operations until the node is restarted (#8555)
- Consumer removal is now handled correctly after a recreate during metalayer recovery at startup (#8556)
- Fixed a potential panic that could happen when filestore block caches were released during message removal (#8548)
- The last dedupe message ID is now restored correctly if the last message was outside of the window after restart (#8564)
- An unreachable send snapshot condition has been removed from the stream monitor (#8565)
- Pull request expiry is now counted as activity when
inactive_thresholdis set (#8575) - Purges and roll-ups on multi-filter subject consumers will no longer advance past unrelated subjects (#8572)
- Filestore compression header checking is now extended to check for compatible compression values and for the presence of correct or incorrect first record checksums, avoiding collisions at the beginning of a message block (#8581)
- JetStream usage from peer-removed nodes is now removed from the remaining cluster node accounting correctly (#8570)
- Fixed a data race between deduplication tracking and stream config updates (#8598)
- Fixed a potential nil consumer info when responding to consumer reset requests (#8598)
- Stream catchups will no longer run for removed or re-synced peers (#8598)
- Fixed a race condition that could leave ghost consumer assignments when deleting consumers (#8598)
- Pausing a consumer with pending changes no longer cancels out the in-flight assignment (#8598)
- Stepping down a consumer leader with pending changes no longer fails (#8598)
- Switching a stream to interest retention policy with no consumers now correctly cleans up messages with no interest (#8598)
- Fixed an issue where removed consumers were incorrectly matched without checking the group name (#8598)
- A number of stream and consumer endpoints will no longer report the wrong state based on in-flight proposals (#8598)
Complete Changes
Release v2.14.7-RC.2
Changelog
Refer to the 2.14 Upgrade Guide for backwards compatibility notes with 2.12.x. Please note that the 2.13.x version was skipped.
Go Version
- 1.26.8
Dependencies
- golang.org/x/crypto v0.57.0 (#8597)
- golang.org/x/sys v0.48.0 (#8597)
- golang.org/x/time v0.16.0 (#8597)
Fixed
JetStream
- Fixed a data race between deduplication tracking and stream config updates (#8598)
- Fixed a potential nil consumer info when responding to consumer reset requests (#8598)
- Stream catchups will no longer run for removed or re-synced peers (#8598)
- Fixed a race condition that could leave ghost consumer assignments when deleting consumers (#8598)
- Pausing a consumer with pending changes no longer cancels out the in-flight assignment (#8598)
- Stepping down a consumer leader with pending changes no longer fails (#8598)
- Switching a stream to interest retention policy with no consumers now correctly cleans up messages with no interest (#8598)
- Fixed an issue where removed consumers were incorrectly matched without checking the group name (#8598)
- A number of stream and consumer endpoints will no longer report the wrong state based on in-flight proposals (#8598)
Complete Changes
Release v2.14.7-RC.1
Changelog
Refer to the 2.14 Upgrade Guide for backwards compatibility notes with 2.12.x. Please note that the 2.13.x version was skipped.
Go Version
- 1.26.8 (#8551)
Dependencies
- github.com/antithesishq/antithesis-sdk-go v0.8.0-default-no-op (#8562)
- github.com/klauspost/compress v1.20.0 (#8562)
- golang.org/x/crypto v0.56.0 (#8562)
Added
JetStream
- Compatibility for the new desired state metalayer, introduced in v2.15, to support safe upgrades and downgrades (#8554)
Improved
General
- The
fastrandandmath/randpackages have been replaced withmath/rand/v2(#8538, #8557) - Reduced lock contention that could arise from tracking event IDs or closed connections (#8533)
JetStream
- When syncing deletes from a snapshot, block removals are now aggregated, reducing pending calculations (#8545)
- Message size checks are now performed before more expensive header checks (#8561)
- Pending calculations are now considerably faster when the max messages per subject limit is 1 (#8567)
Fixed
General
- The
{{left}}and{{right}}mapping functions now work correctly in account mappings and source/mirror transforms (#8568)
JetStream
- A potential underflow when calculating deletes in skip messages has been fixed (#8546)
- Fixed an issue where catchup signals to the metalayer are blocked, which could stall stream or cluster management operations until the node is restarted (#8555)
- Consumer removal is now handled correctly after a recreate during metalayer recovery at startup (#8556)
- Fixed a potential panic that could happen when filestore block caches were released during message removal (#8548)
- The last dedupe message ID is now restored correctly if the last message was outside of the window after restart (#8564)
- An unreachable send snapshot condition has been removed from the stream monitor (#8565)
- Pull request expiry is now counted as activity when
inactive_thresholdis set (#8575) - Purges and roll-ups on multi-filter subject consumers will no longer advance past unrelated subjects (#8572)
- Filestore compression header checking is now extended to check for compatible compression values and for the presence of correct or incorrect first record checksums, avoiding collisions at the beginning of a message block (#8581)
- JetStream usage from peer-removed nodes is now removed from the remaining cluster node accounting correctly (#8570)
Complete Changes
Release v2.15.0-RC.1
Changelog
This release also contains all changes up to and including v2.14.6.
Go Version
- 1.27.1 (#8551)
Added
JetStream
- Desired state metalayer (#8432, #8437, #8439, #8443, #8452, #8460, #8476, #8576)
- A new desired state reconciliation engine for streams and consumers considerably improves the safety and reliability of asset moves and scales
- Updating the placement or replication factor midway through an existing scale/move operation, cancelling an in-flight scale/move, or peer-removing is now much safer
- Cancel stream move endpoint (#8476)
- An in-flight scale/move operation on a stream can be cancelled and the asset returned to its original placement using the new
$JS.API.STREAM.CANCEL_MOVEendpoint
- An in-flight scale/move operation on a stream can be cancelled and the asset returned to its original placement using the new
- Evacuate endpoints (#8443)
- The new
$JS.API.SERVER.EVACUATEendpoint can safely evacuate streams, and any consumers on those streams, from a node - The new
$JS.API.STREAM.PEER.EVACUATE.*endpoint can safely evacuate a peer, and any consumers on that peer, from a stream - These operations combined allow for maintenance operations with full transfer of data and state without having to peer-remove first
- The new
- Metalayer rescue for disaster recovery (#8408)
- The new
$JS.API.META.RESCUEendpoint can temporarily lower the quorum-needed for the metalayer, in order to facilitate the recovery of a system where nodes have been permanently lost and the metalayer cannot reach quorum
- The new
- Stream backup and restore v2 (#7882)
- A new backup format for stream snapshots which reads out per-message rather than per-block
- The new backup format also now correctly includes non-replicated consumers on follower nodes
- Detect source stream recreation (#8384)
- The server now detects a source stream being recreated, restarting the sourcing back from the beginning, ensuring new messages are sourced
- Stream source indexing (#8282, #8516, #8283)
- Restarts and leader changes previously required expensive backward scans through the stream to find the last sourced indices. These are now persisted in an index for instant lookup.
- Domain-prefixed JS API in system account (#8429)
- When a system account is bridged between the hub and a leaf node, the domain-prefixed JS API can now be used to operate on the leaf node while directly connected to the hub
Changed
JetStream
- Streams now have a default limit of 1000 consumers, unless
max_consumersis specified in the stream config or account limits (#8337, #8566)- Applications planning to use a large number of consumers on a stream should configure
max_consumersin the stream config or account limits to an appropriately high number - The server-wide default of 1000 can be overridden by setting
default_max_consumersin the JetStream limits, or can be disabled by setting to-1 - This limit does not affect existing consumers and will not result in consumer deletions, only the creation of new consumers is prevented
- Applications planning to use a large number of consumers on a stream should configure
- Sync changes for replicated streams (#8447)
- When the
sync_intervalis set toalways, replicated streams now sync their WAL entries but no longer sync upper stream layer writes - The synced log allows the stream to recover safely, but removing unnecessary syncs from the upper stream layer dramatically improves performance
- Non-replicated R1 streams are not affected by this change and will continue to sync at the stream layer as normal
- When the
- The
js_raft_delete_rangefeature is now enabled by default (#8520)
Leafnodes
- The
no_advertiseoption no longer includes the hub's own listener address (#8451)
Improved
JetStream
- Shorter wait for durable source/mirror consumer resets (#8323)
- When using durable consumers for sourcing or mirroring, the heartbeats now short-circuit the recreation backoff
Fixed
Leafnodes
- Leafnode isolation using
request_isolation, or with hub-enforcedisolate, now works correctly across cluster nodes (#8504)