{"record":{"id":"e7aef6c37bdf4c98","repo":"tursodatabase/turso","slug":"heap-results-require-turso-and-the-requested-queries-per","errorCode":null,"errorMessage":"heap results require Turso and the requested queries per connection","messagePattern":"heap results require Turso and the requested queries per connection","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"perf/fts/plot/plot-fts.py","lineNumber":128,"sourceCode":"            query = row[\"query\"]\n            seen = runs.setdefault(row[\"run\"], {}).setdefault(key, set())\n            if query not in QUERIES or query in seen:\n                raise ValueError(f\"{path}: unknown or duplicate query {query}\")\n            seen.add(query)\n            series[query].append(read_measurement(row, percentile))\n    if not runs:\n        raise ValueError(f\"{path}: no results found\")\n    return configuration, runs\n\n\ndef read_measurement(row, percentile):\n    queries = int(row[\"queries\"])\n    positive_number(queries)\n    if row[\"benchmark\"] != \"memory\":\n        seconds = positive_number(row[\"seconds\"])\n    if row[\"benchmark\"] == \"memory\":\n        if row[\"engine\"] != \"turso\" or queries != int(row[\"requested_queries\"]) * int(row[\"connections\"]):\n            raise ValueError(\"heap results require Turso and the requested queries per connection\")\n        value = float(row[\"peak_heap_bytes\"]) / (1024 * 1024)\n    elif row[\"benchmark\"] == \"search\":\n        if not 0 < int(row[\"connections\"]) <= queries or queries != int(row[\"requested_queries\"]):\n            raise ValueError(\"search results require at least one sample per connection and the requested query count\")\n        value = float(row[f\"{percentile}_ms\"])\n    elif row[\"benchmark\"] == \"throughput\":\n        minimum = positive_number(row[\"min_seconds\"])\n        if seconds < minimum:\n            raise ValueError(\"throughput results must meet a positive minimum duration\")\n        value = queries / seconds\n    else:\n        raise ValueError(\"unknown benchmark\")\n    return positive_number(value)\n\n\ndef positive_number(value):\n    value = float(value)\n    if not np.isfinite(value) or value <= 0:","sourceCodeStart":110,"sourceCodeEnd":146,"githubUrl":"https://github.com/tursodatabase/turso/blob/8d4a589f8d13ac184700d2a8f724f27e1995be3b/perf/fts/plot/plot-fts.py#L110-L146","documentation":"For benchmark='memory' rows, read_measurement() only accepts turso engine results where queries == requested_queries * connections, because peak heap is only meaningful per complete query set on Turso. Anything else is rejected.","triggerScenarios":"A memory CSV row produced by a non-turso engine, or where the total executed queries does not equal requested_queries times connections.","commonSituations":"Measuring heap for sqlite rows (unsupported by the plot script); a connection crashed mid-run so fewer queries completed; mis-set requested_queries or connections columns.","solutions":["Only record memory (heap) results for engine=turso with the full query count","Fix the requested_queries/connections columns so their product equals queries","Drop memory rows for other engines and compare memory only for turso"],"exampleFix":"// before (CSV)\nbenchmark=memory,engine=sqlite,queries=100,requested_queries=50,connections=2\n// after\nbenchmark=memory,engine=turso,queries=100,requested_queries=50,connections=2","handlingStrategy":"validation","validationCode":"def validate_memory_row(row):\n    if row[\"benchmark\"] == \"memory\" and (row[\"engine\"] != \"turso\" or int(row[\"queries\"]) != int(row[\"requested_queries\"]) * int(row[\"connections\"])):\n        raise ValueError(\"heap results require Turso and the requested queries per connection\")","typeGuard":"def is_valid_memory_row(row) -> bool:\n    return row[\"benchmark\"] != \"memory\" or (row[\"engine\"] == \"turso\" and int(row[\"queries\"]) == int(row[\"requested_queries\"]) * int(row[\"connections\"]))","tryCatchPattern":"try:\n    configuration, runs = read_runs(path, percentile)\nexcept ValueError as e:\n    print(f\"invalid memory row: {e}\")","preventionTips":["Only collect heap metrics for turso engine runs","Ensure all connections complete all requested queries before recording memory","Cross-check queries == requested_queries * connections after each run"],"tags":["python","benchmark","validation"],"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"}