Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog.
1.1.0 (2026-07-30)
Added
- Added bounded key-range scans through
SegmentIndex.scan(fromInclusive, toExclusive)andSegmentIndex.scan(fromInclusive, toExclusive, isolation). - Added conditional write operations on
SegmentIndex:putIfAbsent(key, value)andreplace(key, expectedValue, newValue). - Added strict UTF-8 string descriptors for emoji and multilingual keys and
values:
TypeDescriptorTinyUtf8Stringfor payloads up to 255 encoded bytes andTypeDescriptorUtf8Stringfor larger payloads. - Added a composite-key example to show descriptor-backed ordering for multi-part keys.
- Added benchmark coverage for bounded range scans, persisted mutations, hot route writes, and per-change benchmark history.
Changed
- Improved point-operation synchronization, route leasing, WAL append concurrency, cache memory retention, and sorted cache snapshot allocation.
- Refreshed benchmark documentation and added more stable benchmark profile baselines for release-to-release performance review.
- Improved startup memory reporting and monitoring-console startup scripts.
Breaking
SegmentIndexnow declaresputIfAbsent(...)andreplace(...). External implementations ofSegmentIndexmust implement both methods.SegmentIndex.scan(...)is now part of the public API. Implementations that do not support bounded scans may keep the default unsupported behavior, but callers can now compile against the range-scan contract.
Compatibility Notes
- Conditional writes are currently supported only when WAL is disabled. They
throw
IndexExceptionwhen WAL is enabled. SegmentIndex.scan(...)uses half-open bounds: the lower bound is inclusive and the upper bound is exclusive. Anullupper bound scans to the end.- The default
Stringdescriptor remains ISO-8859-1 for on-disk compatibility. UseTypeDescriptorTinyUtf8StringorTypeDescriptorUtf8Stringexplicitly before creating indexes that must store emoji or multilingual text.
1.0.0 (2026-06-30)
Added
- Published the first stable HestiaStore release to Maven Central.
- Published the multi-module release artifacts, including the engine, operational tools, monitoring bridges, source jars, and Javadocs.
Changed
- Key encoding uses a single-pass API (
TypeEncoder#encode(T, byte[])) across read and write paths, including Bloom filter lookup, WAL encoding, and type writers. - Added
EncodedBytesas the shared return type for encoded payload bytes and effective encoded length.
Breaking
TypeEncoderno longer exposesbytesLength(T)andtoBytes(T, byte[]).- External/custom
TypeEncoderimplementations must migrate toEncodedBytes encode(T value, byte[] reusableBuffer).
0.0.5
Added
- Data blocks were introduced and the on-disk storage format was significantly improved.
- All disk writes now use a temporary file followed by an atomic rename; all streams are correctly closed.
- Data storage is configurable via the application configuration.
- Data in chunks and data blocks are validated using a magic number and CRC32.
- Added support for Snappy compression.
0.0.4
Added
- Add recovery support to rebuild indexes after failures. (#22)
- Introduce pages for segment-based indexing. (#31)
- Create
Directoryimplementation usingjava.nio. (#50) - Add a performance comparison framework for benchmark testing. (#60)
- Add integration tests for deletion and graceful degradation. (#76, #63)
- Add a test class for long-running index operations. (#49)