{"record":{"id":"fcee7b496611e0ea","repo":"tursodatabase/turso","slug":"need-at-least-one-query-per-connection","errorCode":null,"errorMessage":"need at least one query per connection","messagePattern":"need at least one query per connection","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"perf/fts/src/latency.rs","lineNumber":16,"sourceCode":"use std::sync::Barrier;\nuse std::time::Instant;\n\nuse anyhow::{Result, ensure};\nuse memory_benchmark::fts::RunResult;\nuse tokio::runtime::Runtime;\n\nuse crate::Measurement;\n\npub fn measure<S: Send>(\n    sessions: Vec<S>,\n    queries: usize,\n    execute: impl Fn(&mut S, &Runtime) -> Result<RunResult> + Sync,\n) -> Result<Measurement> {\n    let connections = sessions.len();\n    ensure!(\n        connections > 0 && queries >= connections,\n        \"need at least one query per connection\"\n    );\n    let workers = sessions\n        .into_iter()\n        .map(|session| {\n            Ok((\n                session,\n                tokio::runtime::Builder::new_current_thread()\n                    .enable_all()\n                    .build()?,\n            ))\n        })\n        .collect::<Result<Vec<_>>>()?;\n    let barrier = Barrier::new(connections + 1);\n    std::thread::scope(|scope| {\n        let handles: Vec<_> = workers\n            .into_iter()","sourceCodeStart":1,"sourceCodeEnd":34,"githubUrl":"https://github.com/tursodatabase/turso/blob/8d4a589f8d13ac184700d2a8f724f27e1995be3b/perf/fts/src/latency.rs#L1-L34","documentation":"The FTS latency benchmark harness refuses to start when the caller supplies an empty list of sessions or fewer queries than there are connections. Each connection must run at least one query for the per-connection worker split to make sense, so `measure` fails fast with this message instead of producing meaningless results.","triggerScenarios":"Calling `perf/fts/src/latency.rs::measure` with `sessions: Vec<S>` empty, or with `queries < sessions.len()` (e.g. 1 query across 4 connections).","commonSituations":"Passing a CLI-derived `--connections` value with an incorrectly computed query count, or an empty session vector after filtering failed connections before the call.","solutions":["Pass at least one session/connection to `measure`.","Ensure `queries >= sessions.len()` by scaling the query count to the connection count.","Validate connection and query counts at CLI parse time before invoking `measure`."],"exampleFix":"// before\nmeasure(vec![], 1, &execute)?;\n// after\nmeasure(vec![conn1, conn2], 2, &execute)?; // queries (2) >= connections (2)","handlingStrategy":"validation","validationCode":"assert!(!sessions.is_empty(), \"measure requires at least one session\");\nassert!(queries >= sessions.len(), \"queries ({queries}) must be >= connections ({})\", sessions.len());","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Derive queries as `max(queries, sessions.len())` before calling measure","Sanity-check session list construction before benchmarking","Validate counts in the CLI layer"],"tags":["benchmark","validation","rust"],"backgroundTag":"invalid-argument-value","analyzedSha":"8d4a589f8d13ac184700d2a8f724f27e1995be3b","analyzedAt":"2026-09-20T13:18:14.658Z","contentChangedAt":"2026-09-20T13:18:14.658Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}