# Changelog

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

## [3.8.0] - 2026-07-24

### Added

- Added follower reads with configurable staleness bounds, allowing read-heavy workloads to scale without sacrificing application-level consistency requirements.
- Added incremental snapshot streaming to reduce peak memory usage and speed up replica recovery for large keyspaces.
- Added per-namespace quotas for storage, request rate, and concurrent watches.
- Added Prometheus metrics for Raft proposal latency, snapshot transfer progress, compaction backlog, and lease expiration.
- Added an administrative API for safely moving replicas between nodes with progress reporting and automatic rollback.

### Fixed

- Fixed a race during leader transfer that could briefly reject linearizable reads after the new leader was elected.
- Fixed watch streams occasionally missing events when reconnecting at a revision that was compacted concurrently.
- Fixed excessive disk usage caused by obsolete snapshot chunks not being removed after interrupted transfers.
- Fixed incorrect quota accounting when a transaction updated the same key multiple times.
- Fixed a startup failure when the write-ahead log ended with a valid but empty segment.

### Changed

- Changed replica recovery to prefer incremental snapshots when the follower has a compatible base snapshot.
- Changed the default Raft election timeout from 1 second to 1.5 seconds to reduce unnecessary elections on congested networks.
- Changed range scans to return a continuation token instead of silently truncating results at the server limit.
- Changed compaction scheduling to prioritize namespaces with the highest reclaimable space.

## [3.7.2] - 2026-06-18

### Added

- Added request IDs to client-visible errors and server logs for easier tracing across gateways and storage nodes.
- Added a health-check field that reports whether a node is caught up enough to serve bounded-staleness reads.

### Fixed

- Fixed a deadlock between lease revocation and key compaction under sustained write load.
- Fixed duplicate change notifications emitted after a watch stream resumed from a transient network failure.
- Fixed TLS certificate rotation requiring existing peer connections to be restarted manually.
- Fixed incorrect `NOT_FOUND` responses for keys created immediately after namespace restoration.
- Fixed a memory leak in clients that repeatedly cancelled long-running range requests.
- Fixed backup verification failing when object storage returned multipart ETags.

### Changed

- Changed lease cleanup to process expired leases in bounded batches, reducing latency spikes.
- Changed peer connection retry behavior to use jittered exponential backoff.
- Changed snapshot checksum failures to mark the local snapshot unusable and retry from another replica automatically.

## [3.7.1] - 2026-05-09

### Added

- Added optional compression for client responses and inter-node snapshot transfers.
- Added a command to validate backup metadata and checksums without restoring data.
- Added logging for slow transactions, including namespace, operation count, and commit duration.

### Fixed

- Fixed linearizable reads hanging when the leader stepped down while a read-index request was in flight.
- Fixed tombstones being reclaimed before all replicas had advanced past the corresponding revision.
- Fixed transaction conflicts being reported as internal errors by the Go client.
- Fixed nodes joining with reused data directories retaining stale cluster membership metadata.
- Fixed range deletion returning an incorrect deleted-key count when keys expired concurrently.
- Fixed uneven replica placement in clusters spanning three or more availability zones.

### Changed

- Changed the default maximum transaction size from 1 MiB to 2 MiB.
- Changed cluster membership updates to require confirmation from the current leader before being persisted.
- Changed warning logs for expected client cancellations to debug level.