# Changelog

All notable changes to this distributed key-value store are documented here.

## [2.8.0] - 2026-07-02

### Added

- Added learner replicas for low-impact reads from follower regions.
- Added per-range compaction metrics for tombstones, SSTable count, and write amplification.
- Added `kvctl repair quorum-status` to detect ranges with stale or unavailable voters.
- Added support for rotating node certificates without restarting the process.

### Fixed

- Fixed a rare lease transfer race that could temporarily route linearizable reads to the previous leaseholder.
- Fixed excessive snapshot retries when a recovering node had partially applied range metadata.
- Fixed incorrect latency histograms for batched compare-and-swap operations.
- Fixed a memory leak in the Raft transport when peers disconnected during snapshot streaming.

### Changed

- Reduced default election timeout variance to improve failover consistency across multi-zone clusters.
- Improved range split selection to account for hot keys, not only total range size.
- Changed admin API pagination defaults from 100 to 500 results.
- Deprecated legacy `--join` discovery syntax in favor of `--initial-peers`.

## [2.7.2] - 2026-06-13

### Added

- Added warning logs when clock skew exceeds 60% of the configured lease duration.
- Added `kvctl backup verify` for validating backup manifests before restore.
- Added Prometheus counters for rejected writes by reason.

### Fixed

- Fixed restore failures when backups contained empty ranges.
- Fixed follower read staleness checks after NTP time correction.
- Fixed a deadlock during graceful shutdown while background compaction was running.
- Fixed incorrect HTTP 500 responses for conditional write conflicts; these now return 409.

### Changed

- Increased snapshot chunk size from 2 MiB to 8 MiB for faster node bootstrap.
- Improved retry backoff for internal range lookups under heavy metadata contention.
- Reduced log noise for expected peer reconnect events.

## [2.7.1] - 2026-05-29

### Added

- Added structured audit events for keyspace creation, deletion, and permission updates.
- Added startup validation for mismatched cluster IDs in persisted metadata.
- Added `kvctl range describe --json` for automation-friendly range inspection.

### Fixed

- Fixed inconsistent TTL expiration behavior after leader failover.
- Fixed a bug where deleted keys could reappear after restoring from an incremental backup.
- Fixed high CPU usage in clusters with many idle watches.
- Fixed incorrect handling of IPv6 peer addresses in gossip discovery.

### Changed

- Changed default watch buffer size from 1,024 to 4,096 events.
- Improved error messages for failed authentication handshakes.
- Made range rebalancing less aggressive when disk usage differs by less than 5%.