Skip to content

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.

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 indexO(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_get admission control — bounded scan concurrency (--max-concurrent-scans), UNAVAILABLE load-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 surfacecqlite.errors.total registers at 0 on startup; an operator-facing flight-metrics reference and a refreshed Grafana dashboard ship from the observability catalog (#2288, #2426, #2427).
  • P0 — silent row loss on large single-cell values — rows with a single ≥~1MB cell were silently dropped because a 1MB row_size heuristic 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 as Value::Varint rather than a blob (#1795, #1884, #1885).
  • GROUP BY float/double groups by the Cassandra comparator: NaN → one group, ±0.0 distinct (#2074).
  • CompressionInfo fail-closedmax_compressed_length == 0 is rejected at parse and read instead of producing garbage (#2529, #2524).

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).

  • Windows Node CI remains deferred debt; Linux and macOS Node bindings are unaffected (#1979).
Terminal window
brew install pmcfadin/cqlite/cqlite # CLI (macOS + Linux)
cargo add cqlite-core # Rust library
pip install cqlite-py # Python
npm install @cqlite/node # Node.js

Rust 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.