{"record":{"id":"27caff5f450ba750","repo":"tursodatabase/turso","slug":"first-query-latency-requires-one-query-per-connection","errorCode":null,"errorMessage":"first-query latency requires one query per connection","messagePattern":"first-query latency requires one query per connection","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"perf/fts/src/main.rs","lineNumber":86,"sourceCode":"async fn run(mut args: Args) -> Result<()> {\n    let (query_limit, min_seconds) = match args.benchmark {\n        Benchmark::Search => {\n            ensure!(\n                args.seconds.is_none(),\n                \"--seconds requires --benchmark throughput\"\n            );\n            let queries = args\n                .queries\n                .unwrap_or(if matches!(args.state, QueryState::First) {\n                    args.connections\n                } else {\n                    10_000\n                });\n            ensure!(\n                queries >= args.connections,\n                \"need at least one query per connection\"\n            );\n            ensure!(\n                !matches!(args.state, QueryState::First) || queries == args.connections,\n                \"first-query latency requires one query per connection\"\n            );\n            (queries, 0.0)\n        }\n        Benchmark::Throughput => {\n            ensure!(\n                args.queries.is_none(),\n                \"--queries requires --benchmark search\"\n            );\n            ensure!(\n                matches!(args.state, QueryState::Warm),\n                \"throughput requires --state warm\"\n            );\n            let seconds = args.seconds.unwrap_or(5.0);\n            ensure!(\n                seconds.is_finite() && seconds > 0.0,\n                \"seconds must be finite and positive\"","sourceCodeStart":68,"sourceCodeEnd":104,"githubUrl":"https://github.com/tursodatabase/turso/blob/8d4a589f8d13ac184700d2a8f724f27e1995be3b/perf/fts/src/main.rs#L68-L104","documentation":"First-query latency mode measures exactly the first query issued on each connection, so the query budget must equal the connection count. ensure! at perf/fts/src/main.rs:86 rejects --state first combined with a query count that differs from --connections, since extra queries would no longer be first queries.","triggerScenarios":"Running `fts-bench --state first --queries 500 --connections 8`: the ensure! fires because queries (500) != connections (8). Also fires with --state first when the defaulted/overridden query count does not match connections.","commonSituations":"Mixing first-query-latency intent with a leftover --queries value from a warm/search run; assuming first-query mode can also collect warm-query statistics.","solutions":["Set --queries equal to --connections when using --state first","Omit --queries in first state (the default already equals connections)","Use --state warm if you want more queries per connection than one"],"exampleFix":"// before\nfts-bench --state first --connections 8 --queries 500\n// after\nfts-bench --state first --connections 8 --queries 8","handlingStrategy":"validation","validationCode":"if state == First && queries != connections { panic!(\"--state first requires --queries == --connections\"); }","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Omit --queries entirely in first-query latency runs","Keep latency (first) and throughput/warm invocations in separate scripts","Assert state/queries invariants in CI wrappers"],"tags":["cli","argument-validation","benchmark","latency"],"backgroundTag":"conflicting-config-options","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"}