What's Changed since v2.0.27
This release is a hardening pass from a full code review of the disk I/O and cache modules: four fixes, three cleanups, no behavior change on the hot I/O paths.
Fixes
- gRPC server startup failure is now detected: if the listen address cannot be bound (
BuildAndStart()returns null), ezio logs a critical error and exits with code 1, instead of logging "Server listening", running the whole session without a control interface, and crashing at shutdown. (#150) - Session teardown no longer stalls up to 30 s: the cache-stats thread's fixed 30 s sleep is now an interruptible condition-variable wait; measured shutdown 30 s -> 0.06 s. (#151)
- cache: partition
max_entriesis atomic, closing the data race betweensettings_updated(network thread) and the eviction loop ininsert()(worker thread). (#148) - cache: eviction drops stale LRU nodes (map/list inconsistency) instead of re-logging the same error on every pass — log once, self-heal. Defense-in-depth; the condition remains should-not-happen. (#152)
Refactor
- cache: removed the dead write-back-era dirty-block collectors;
get_dirty_count()looked like a query but cleared dirty flags cache-wide as a side effect. (#144) - cache:
get2()now asserts both blocks map to the same partition, replacing an unreachable cross-partition path that would have become a cross-thread race if piece routing ever changed. (#146) - Removed the unused global
raw_disk_ioinstance pointer (dangling after session shutdown). (#147)
Docs
- Buffer pool comments and CLAUDE.md synced with the code: split read/write pools at 512 MB each (not the old "unified 256 MB"), write-through cache, soft-limit watermark semantics. (#149)
- BEP52/v2 hashing load analysis on the single network thread; Go-rewrite effort estimate.
Known issues (tracked, not in this release)
partition_storagedoes not checkpread/pwriteresults; see #145 for the analysis and the coupled prefetch error-path fix.
Full diff: v2.0.27...v2.0.28