cqlite 0.16.0 GA — verdict

GA verification round before 0.17 · flight v0.16.0@sha256:74b12ccd (multi-arch INDEX; amd64 a45cac03 / arm64 f2f78d0b; also latest) · connector 0.16.0 (Maven Central) · Trino 481 · Cassandra 5.0.8 RF=3 · 3× i4i.xlarge · ~2.5M partitions/node · 2026-07-23

Verdict: 0.16.0 GA is sound — clear to move to 0.17. All three tracked fixes that failed or were partial in the pre-release rounds now hold in the final release: #2806 split pruning, #2807 UDT parse, and #2815 collection-column exposure. Split pruning delivers a measured −18% p50 / −4× coordinator CPU on isolated keyed reads. One residual (structured in-collection UDT decode) is a natural 0.17 follow-up, not a GA regression.

Fix scorecard — RC1 → GA

FixRC1 (pre-release)0.16.0 GAVerdict
#2806 / #2679 split pruningInert — 13 splits on/off, no benefit1 split, −18% p50, −4× CPUfixed
#2807 UDT keyspace-qualified parseParse crash (code: Char), every UDT table unreadableAll UDT tables parse & queryfixed
#2349 scalar frozen<udt> decodeBlocked behind the parse crash{street: 2 Oak, zip: 10001} readableverified
#2815 list<frozen<udt>> silent dropColumn absent from schema (data-loss-class, found rc2)Column present; SELECT * returns itsymptom fixed
#2372 BTI (da) over FlightCould-not-observe (no da corpus)Not tested (no da corpus)could-not-observe

Split-pruning perf (#2806) — the headline

Method: Trino server-side elapsedTimeMillis + totalSplits via the REST API, driven from the control node against the Trino service clusterIP (no port-forward, no wall-clock noise). 60 samples/mode = 3 warmed passes over 20 distinct keys. Kill-switch = cqlite.split-pruning-enabled, pods restarted between modes.

Isolated WHERE key = ?splitsp50p90p99coordinator CPU p50
pruning ON1152 ms195 ms257 ms2 ms
pruning OFF13185 ms208 ms241 ms8 ms

Collapsing the 13-way fan-out to the single owning split cuts p50 latency −18% and coordinator CPU −4×. Smoke checks: IN(2 keys) ON=1 / OFF=13 splits; WHERE key=? LIMIT 1 ON prunes / OFF full fan-out — all correct, identical rows, 0 errors either mode.

Sustained throughput — 32 threads, 180s

Modesteady qpsp50p99cold ramp (30s: qps / p99)errors
pruning ON~33.0~967 ms~1195 ms15.7 qps / 6384 ms0
pruning OFF~33.9~937 ms~1462 ms9.9 qps / 8492 ms0

Steady-state throughput is equal (~33 qps both) — pruning does not raise the throughput ceiling, which is owned by the known fan-out skew (#2680) and snapshot-resolve floor, not split count. But pruning ON has a markedly faster cold ramp and better tail (p99 −18% steady; 6384 vs 8492 ms cold) because 13× fan-out is expensive to warm.

UDT collections — #2815 fix, with a residual

Symptom fixed, structured decode is the 0.17 follow-up. In rc2 the list<frozen<udt>> column was silently dropped from the projected schema — a data-loss-class omission. In GA the column is back: DESCRIBE udt_simple lists addrs and SELECT * returns it. The residual: elements come back as array(varchar) of raw serialized UDT bytes (e.g. 0x000000053120456c6d0000000400002b67 = "1 Elm"/11111, decoded by hand and matched field-for-field against sstabledump), not a structured array(row(street,zip)). Data is correct and complete and reachable — it is simply not typed yet. Strictly better than rc2 (where the column vanished entirely); the deeper in-collection structured decode (#2349's further target) is a clean 0.17 candidate, not a GA blocker.