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
| Probe | Fix under test | Verdict | Evidence |
|---|---|---|---|
| A | #2679 plan-time split pruning (connector) | REGRESSED | Inert: 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) | BLOCKED | Could-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 Flight | COULD-NOT-OBSERVE | No 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) | VERIFIED | cqlite.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 + integrity | VERIFIED | 3.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). |
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).
filterJson,
not constraint.getSummary(). Add an end-to-end test that exercises the post-applyFilter
split path (a unit test feeding a populated summary passes while the real path is empty).frozen<ks.udt>); today every real UDT table is unreadable, which blocks #2349 entirely.resourcedetection re-applied to the collector's metrics/otlp
pipeline (PR #806 still unmerged on main). Discovered mid-run that a live configmap patch is reverted
by kit start/stop (the OTel config is regenerated from the built binary). Rebuilt the dist so the
fix is durable through kit churn — stronger than soak-0.15's live-patch. rate() is now per-host_name,
no 1000× inflation.OTEL_METRIC_EXPORT_INTERVAL=2000; was the 60s SDK
default) so the ~2s saturation gauges are sampled at resolution.