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

  1. Only record memory (heap) results for engine=turso with the full query count
  2. Fix the requested_queries/connections columns so their product equals queries
  3. 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

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


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)