CQLite v0.15.0
CQLite v0.15.0 — Trino latency, throughput & operations
Section titled “CQLite v0.15.0 — Trino latency, throughput & operations”This release turns the field-validated read path from v0.14 into a fast, observable, overload-resilient one (epic #2403). Warm throughput through Trino is up roughly 15× versus the v0.14 field baseline, the read hot paths were re-cut end to end, saturation is now legible in-process, and a P0 silent-row-loss class is gone.
🚀 Warm Trino throughput up ~15×
Section titled “🚀 Warm Trino throughput up ~15×”Round-11b field validation measured ~34 qps warm, p50 227ms / p99 366ms through Trino, with server-side work at ~2ms and zero cold parses on the warm path — at 80 concurrent threads with no OOMKills. The levers:
- Connector snapshot-lifecycle closure — per-
(keyspace, table)reader reuse plus warm rebind, so repeat queries no longer re-open from cold (#2356, #2306). - Lazy Summary-guided BIG index —
O(summary)open, bounded point-lookup intervals, and token-pushdown scans, so a scan no longer decodes every partition body (#2412, #2413). - Row-granular point-read streaming — point reads and cache-warm merges drive the merge row by row instead of materializing (#2423).
- Multi-node read fan-out — split primaries rotate across replica owners, so reads under RF=N are no longer pinned to a single pod (#2397).
🛠️ Operations — admission control & saturation observability
Section titled “🛠️ Operations — admission control & saturation observability”- Flight
do_getadmission control — bounded scan concurrency (--max-concurrent-scans),UNAVAILABLEload-shedding, and phase-visible queueing keep an overloaded server responsive instead of thrashing (#2420, #2063). - Saturation gauges — five in-process gauges (blocking-task guard, merge egress depth, and an fd/thread/RSS sampler on a 2s tick) make saturation legible during overload (#2419).
- Metrics surface —
cqlite.errors.totalregisters at 0 on startup; an operator-facing flight-metrics reference and a refreshed Grafana dashboard ship from the observability catalog (#2288, #2426, #2427).
✅ Correctness & parity
Section titled “✅ Correctness & parity”- P0 — silent row loss on large single-cell values — rows with a single ≥~1MB cell
were silently dropped because a 1MB
row_sizeheuristic rejected them as corrupt. It is replaced with an authoritative remaining-bytes bound, per the no-heuristics mandate (#2436). - v5 cell parsing hardening — overflow-safe cell bounds,
Float32/varint parity, and a varint arm that decodes a CQL varint asValue::Varintrather than a blob (#1795, #1884, #1885). GROUP BYfloat/double groups by the Cassandra comparator: NaN → one group,±0.0distinct (#2074).CompressionInfofail-closed —max_compressed_length == 0is rejected at parse and read instead of producing garbage (#2529, #2524).
🚀 Read/write hot-path train
Section titled “🚀 Read/write hot-path train”Zero-copy Bytes-backed Value on the read path (#1644); binary-search range
shadowing in the merge core (#1669); a MADV_RANDOM point-read mmap and a global
bounded key→partition-offset cache (#2210, #2059); and a compaction peak-heap drop from
410 → 54 MiB via row-granular streaming (#2299).
Known limitations
Section titled “Known limitations”- Windows Node CI remains deferred debt; Linux and macOS Node bindings are unaffected (#1979).
Get it
Section titled “Get it”brew install pmcfadin/cqlite/cqlite # CLI (macOS + Linux)cargo add cqlite-core # Rust librarypip install cqlite-py # Pythonnpm install @cqlite/node # Node.jsRust crates and the Python and Node bindings move 0.14.1 → 0.15.0 in lockstep. The
Trino connector (in.mcfad:cqlite-trino, 0.14.4) is versioned separately. Full
detail in the
CHANGELOG.