tursodatabase/turso · error · ValueError

search results require at least one sample per connection…

Error message

search results require at least one sample per connection and the requested query count

What it means

For benchmark='search' rows, the script requires 0 < connections <= queries and queries == requested_queries so every connection has at least one latency sample and the planned query count was actually executed. Otherwise percentile latency would be computed over an incomplete or inconsistent sample set.

Solutions

  1. Re-run the search benchmark so all requested queries complete on every connection
  2. Fix connections/queries/requested_queries columns to satisfy connections <= queries and queries == requested_queries
  3. Remove incomplete search rows from the CSV

Example fix

// before (CSV)
benchmark=search,queries=10,requested_queries=100,connections=20
// after
benchmark=search,queries=100,requested_queries=100,connections=20
Defensive patterns

Strategy: validation

Validate before calling

def validate_search_row(row):
    q, rq, c = int(row["queries"]), int(row["requested_queries"]), int(row["connections"])
    if not 0 < c <= q or q != rq:
        raise ValueError("search results require at least one sample per connection and the requested query count")

Type guard

def is_valid_search_row(row) -> bool:
    q, rq, c = int(row["queries"]), int(row["requested_queries"]), int(row["connections"])
    return 0 < c <= q and q == rq

Try / catch

try:
    configuration, runs = read_runs(path, percentile)
except ValueError as e:
    print(f"incomplete search run: {e}")

Prevention

When it happens

Trigger: A search row where connections exceeds queries, connections is zero/negative, or executed queries differ from requested_queries.

Common situations: Benchmark aborted early so fewer queries ran than requested; connections set higher than the query count; misconfigured requested_queries column.

Understand the failure class

Background: "value must be between 0 and 1" / "out of range" / "must not be negative" errors: fixing range-validation failures across open-source libraries — this error's family across 42 libraries.

Related errors


AI-assisted analysis of tursodatabase/turso@8d4a589f8d (2026-09-20). Data as JSON: /api/errors/70ec6f095ab2a9c6. Report an issue: GitHub.

Appendix: source

Thrown at perf/fts/plot/plot-fts.py:132

            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:
        raise ValueError("measurements must be finite and positive")
    return value

View on GitHub (pinned to 8d4a589f8d)