cqlite 0.16.0-rc1 — targeted fix-validation

0.16.0-rc1 targeted fix-validation · flight 0.16.0-rc1@sha256:79c7907d (multi-arch INDEX, src f4f13a7cb) · connector 0.16.0-rc1 · Trino 481 · Cassandra 5.0.8 RF=3 · 3× i4i.xlarge · ~1.70M partitions/node, 2 SSTable gens · 2026-07-21

Is 0.16.0-rc1 sound? The core read path is rock-solid — a 3.5h/32-thread soak held ~32 qps with zero errors, flat RSS/fd/threads, zero OOM/restart, and byte-exact integrity (1,703,038 rows start == end). The genuine-error SLI is 0.026% (down from soak-0.15's 0.89% now that the abort taxonomy decomposes it). But two of the three testable targeted fixes do not work in the field: #2679 split pruning is inert (reads the wrong constraint source, so keyed reads still fan out to every pod — the ~39 qps / fan-out-skew ceiling is unrelieved), and #2349's UDT fix is unreachable behind a CQL-parser bug that rejects every keyspace-qualified UDT type name. Both are new, reproducible, and root-caused to source (filed #2806, #2807). Stability = ship-grade; the two headline 0.16 optimizations/fixes need another turn.

Probe verdicts

ProbeFix under testVerdictEvidence
A#2679 plan-time split pruning (connector)REGRESSEDInert: a fully-bound point read still fans out to 13 splits across all 3 pods, identical with pruning on vs off (do_get 5.7/query both ways). PASS threshold was 1 split. Root cause: the connector reads the bound key from constraint.getSummary(), but its own applyFilter pushdown already moved the predicate into the table handle's filterJson, leaving the summary empty. Correctness fail-safe (identical rows); optimization dead. Filed #2806 (P1).
B#2349 UDT registry in both read paths (correctness)BLOCKEDCould-not-observe: every UDT table fails DDL parse before any read — Failed to parse CQL schema … <frozen<ks.udt>> … code: Char. Isolated to keyspace-qualified UDT type names (3 tables, incl. a bare frozen<udt> scalar). Root cause: cql_parser.rs parses a UDT type as a single identifier that stops at .; Cassandra always emits the type keyspace-qualified. Upstream of #2349 (the decode fix is unreachable). Data on disk correct (sstabledump verified). Filed #2807 (P1).
C#2372 BTI (da) tables over FlightCOULD-NOT-OBSERVENo BTI (da) corpus on the rig (only nb/BIG, 40 Data.db files). Testbed BTI provisioning is the separate follow-up called out in the PR. Not improvised, per #2805.
D#2681 do_get abort taxonomy (observability)VERIFIEDcqlite.flight.abort_reason wired and correct. Forced client_cancel (kill_query) and admission_shed (100-thread full-scan flood, limit 64) — both land in their buckets. Hard errors (UDT parse) stay in category=query with no abort_reason, keeping the genuine-error SLI clean. Over the soak: internal=106 / 402,932 queries = 0.026% genuine errors (the soak-0.15 0.89% “other” bucket is now decomposed).
Soak~4h drift soak + integrityVERIFIED3.5h @ 32 threads: qps flat ~32, p50 ~990ms, p99 ~1255ms, 0 errors in all 42 intervals (402,932 queries / 3.73M rows). RSS flat (db0 1135→1095Mi, db1/db2 flat), fd≤48, threads≤29, 0 OOM, 0 restarts. Integrity: 1,703,038 rows start == end (zero delta). Background snapshot grace-sweep drains with zero queries (312→172/node; R12 regression stays fixed).

Headline — 3.5h soak, flat and clean

do_get req/s per pod — flat ~160/160/95 (db0/db2/db1), sharp cutoff at soak end. Fan-out skew (#2680, by design) visible.
do_get req/s per pod — flat ~160/160/95 (db0/db2/db1), sharp cutoff at soak end. Fan-out skew (#2680, by design) visible.
RPC p99 latency — flat ~1.25s across 3.5h, no drift.
RPC p99 latency — flat ~1.25s across 3.5h, no drift.

Driver (source of record): 402,932 queries / 3,733,627 rows / 0 errors over 12,600s at 32 threads; qps steady 31.4–32.6, p50 ~990ms, p99 ~1255ms. The 8-thread comparability block held ~35 qps / p50 226ms / p99 328ms / 0 err (parity+ vs R12's ~33 qps @ 8-thr).

What to fix before 0.16 final

Rig-side fixes (easy-db-lab, noted on #2805)