# Changelog

All notable changes to this project are documented in this file.

## [2.8.0] - 2026-07-14

### Added

- Introduced learner replicas for asynchronously scaling read capacity without affecting quorum size.
- Added incremental snapshot streaming with configurable bandwidth limits and automatic resume after interrupted transfers.
- Added per-tenant request, storage, and watch-stream metrics to the Prometheus endpoint.
- Added support for rotating TLS certificates without restarting nodes.
- Added `kvctl compact status` to report compaction progress and retained revision ranges.

### Fixed

- Fixed a Raft election race that could briefly stall writes when two nodes rejoined simultaneously after a network partition.
- Fixed watch streams occasionally omitting the final event when a client reconnected during compaction.
- Fixed excessive memory use while restoring snapshots containing many small keys.
- Fixed incorrect lease expiration after a follower's system clock moved backward.
- Fixed stale endpoint health results remaining cached after cluster membership changes.

### Changed

- Snapshot compression now uses Zstandard by default; existing gzip snapshots remain readable.
- New clusters now retain seven days of revision history by default, replacing the previous unlimited retention policy.
- Range queries are now scheduled independently from write transactions to reduce tail latency under scan-heavy workloads.
- Increased the default maximum gRPC message size from 4 MiB to 8 MiB.

## [2.7.3] - 2026-06-18

### Added

- Added a metric for time spent waiting to acquire the backend commit lock.
- Added structured audit events for member promotion, removal, and snapshot restoration.

### Fixed

- Fixed a deadlock triggered by concurrent lease revocation and automatic compaction.
- Fixed linearizable reads returning `deadline exceeded` immediately after a leader transfer.
- Fixed a file descriptor leak when peers repeatedly failed TLS negotiation.
- Fixed snapshot cleanup leaving temporary files behind after disk-full errors.
- Fixed `kvctl endpoint status` displaying negative Raft log lag after a member restart.

### Changed

- Failed peer connections now use exponential backoff with jitter to prevent reconnection storms.
- Improved diagnostics for rejected cluster joins by including the conflicting cluster and member IDs.

## [2.7.2] - 2026-05-29

### Added

- Added optional request tracing headers to correlate client operations across proxies and cluster members.
- Added `--exclude-prefix` support to `kvctl snapshot save` for omitting transient keyspaces.

### Fixed

- Fixed a regression in v2.7.1 that caused serializable reads to return stale data after snapshot restoration.
- Fixed keepalive responses being delayed when thousands of leases expired in the same interval.
- Fixed follower snapshot installation failing when the data directory was located on a different filesystem from the temporary directory.
- Fixed incorrect database size reporting after online defragmentation.
- Fixed an authentication cache race that could briefly preserve revoked role permissions.

### Changed

- Lease expiration work is now processed in bounded batches to reduce write latency spikes.
- Warning logs for expected client cancellations have been moved to debug level.
- Member removal now waits for local transport shutdown before deleting peer metadata.