tursodatabase/turso · error · ValueError
heap results require Turso and the requested queries per…
Error message
heap results require Turso and the requested queries per connection
What it means
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.
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
Example fix
// before (CSV) benchmark=memory,engine=sqlite,queries=100,requested_queries=50,connections=2 // after benchmark=memory,engine=turso,queries=100,requested_queries=50,connections=2
Defensive patterns
Strategy: validation
Validate before calling
def validate_memory_row(row):
if row["benchmark"] == "memory" and (row["engine"] != "turso" or int(row["queries"]) != int(row["requested_queries"]) * int(row["connections"])):
raise ValueError("heap results require Turso and the requested queries per connection") Type guard
def is_valid_memory_row(row) -> bool:
return row["benchmark"] != "memory" or (row["engine"] == "turso" and int(row["queries"]) == int(row["requested_queries"]) * int(row["connections"])) Try / catch
try:
configuration, runs = read_runs(path, percentile)
except ValueError as e:
print(f"invalid memory row: {e}") Prevention
- 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
When it happens
Trigger: A memory CSV row produced by a non-turso engine, or where the total executed queries does not equal requested_queries times connections.
Common situations: 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.
Understand the failure class
Background: "Must be a positive integer", "Invalid value", "Unsupported": the invalid-argument-value error family, when a library rejects the value you pass — this error's family across 35 libraries.
Related errors
- profiled timings must not be used for benchmark comparisons
- search results require at least one sample per connection…
- throughput results must meet a positive minimum duration
- batch mode must be one of
- batch mode must be one of
AI-assisted analysis of tursodatabase/turso@8d4a589f8d (2026-09-20).
Data as JSON: /api/errors/e7aef6c37bdf4c98.
Report an issue: GitHub.
Appendix: source
Thrown at perf/fts/plot/plot-fts.py:128
query = row["query"]
seen = runs.setdefault(row["run"], {}).setdefault(key, set())
if query not in QUERIES or query in seen:
raise ValueError(f"{path}: unknown or duplicate query {query}")
seen.add(query)
series[query].append(read_measurement(row, percentile))
if not runs:
raise ValueError(f"{path}: no results found")
return configuration, runs
def read_measurement(row, percentile):
queries = int(row["queries"])
positive_number(queries)
if row["benchmark"] != "memory":
seconds = positive_number(row["seconds"])
if row["benchmark"] == "memory":
if row["engine"] != "turso" or queries != int(row["requested_queries"]) * int(row["connections"]):
raise ValueError("heap results require Turso and the requested queries per connection")
value = float(row["peak_heap_bytes"]) / (1024 * 1024)
elif row["benchmark"] == "search":
if not 0 < int(row["connections"]) <= queries or queries != int(row["requested_queries"]):
raise ValueError("search results require at least one sample per connection and the requested query count")
value = float(row[f"{percentile}_ms"])
elif row["benchmark"] == "throughput":
minimum = positive_number(row["min_seconds"])
if seconds < minimum:
raise ValueError("throughput results must meet a positive minimum duration")
value = queries / seconds
else:
raise ValueError("unknown benchmark")
return positive_number(value)
def positive_number(value):
value = float(value)
if not np.isfinite(value) or value <= 0:View on GitHub (pinned to 8d4a589f8d)