v2.15.0

deepseek-ai/DeepSeek-OCR-2v2.15.0Sep 17, 2026by github-actions[bot]

Upgrading?

AI Summary

This release introduces a new desired state reconciliation engine for JetStream streams and consumers to improve safety and reliability during asset moves and scale operations. It adds new endpoints for cancelling stream moves, evacuating endpoints, and disaster recovery, alongside a new backup format for stream snapshots.

Key Highlights

  • New desired state reconciliation engine for JetStream
  • New endpoints for cancelling stream moves and evacuating endpoints
  • Metalayer rescue endpoint for disaster recovery
  • Stream backup and restore v2
  • Optimized source indexing for faster recovery

New Features

  • Desired state metalayer reconciliation
  • Cancel stream move endpoint
  • Evacuate endpoints
  • Metalayer rescue for disaster recovery
  • Stream backup and restore v2

Full Release Notes

## Changelog

Refer to the [2.15 Upgrade Guide](https://docs.nats.io/release-notes/upgrade-to-2.15) for backwards compatibility notes with 2.14.x. This release also contains all changes up to and including [v2.14.7](https://github.com/nats-io/nats-server/releases/tag/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_MOVE` endpoint
  - ADR: https://github.com/nats-io/nats-architecture-and-design/blob/main/adr/ADR-62.md
- Evacuate endpoints (#8443)
  - The new `$JS.API.SERVER.EVACUATE` endpoint 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
- Metalayer rescue for disaster recovery (#8408)
  - The new `$JS.API.META.RESCUE` endpoint 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
- 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_consumers` is 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_consumers` in the stream config or account limits to an appropriately high number
  - The server-wide default of 1000 can be overridden by setting `default_max_consumers` in 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
- Sync changes for replicated streams (#8447)
  - When the `sync_interval` is set to `always`, 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
- The `js_raft_delete_range` feature is now enabled by default (#8520)

Leafnodes

- The `no_advertise` option 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: always` now 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

- QOS 1 published into JetStream are pipelined for increased throughput (#8415, contributed by @levb)

### Fixed

Leafnodes

- Leafnode isolation using `request_isolation`, or with hub-enforced `isolate`, now works correctly across cluster nodes (#8504)

### Complete Changes
 
https://github.com/nats-io/nats-server/compare/v2.14.7...v2.15.0

Related Repositories