v0.24.1 — correctness fixes, cache scalability, and an internal refactor
Two correctness fixes, a read-path scalability improvement, and a structural
split of the two largest source files. No storage-format change; no config change.
Correctness
- toInteger() on an out-of-range or non-finite float now returns a clear error
instead of silently saturating (1e19 became i64::MAX, NaN became 0).
toIntegerOrNull() returns NULL for those same inputs, and toInteger("abc")
stays NULL as before. The same guard closes the integer index-argument path
(list.remove / list.insert / …), which had the identical trap. - The auto-consolidation log classifier branches on a typed error code rather
than matching message text, so a benign "already in progress" single-flight
race can never be mis-logged if the wording changes.
Performance
- The query-result cache and the vector-index cache (resident PQ codes + the
Vamana block LRU) now use a CLOCK second-chance eviction with a shared-read-lock
hit path, instead of a global mutex that rewrote an ordered LRU on every hit.
Concurrent cache hits no longer serialise: measured roughly 2x aggregate hit
throughput across four threads, where the previous path fell below parity as
cores were added. This brings both pools in line with the decompressed-block
cache, which already had this design.
Internal (no behaviour change)
- The Cypher executor and the Bolt server — the two largest files in the tree —
are each carved into cohesive submodules: the executor Engine into
exec/{access, driver, matchclause, proc, knn, traverse, scan, project, eval},
and the server into server/{registry, conn, listen, handle, write,
consolidate, query}. Pure relocations; the full test suite is unchanged.
Full Changelog: v0.24.0...v0.24.1