neondatabase/neon · error

{} response

Error message

{} response

What it means

idle_streams sends one probe GetPage for the pg_authid init-fork block on each opened stream. When a response arrives but its status_code differs from GetPageStatusCode::Ok, this error reports the raw status. The probe is valid on any healthy timeline, so a non-Ok status points to request-level or version-level problems rather than missing data.

Source

Thrown at pageserver/pagebench/src/cmd/idle_streams.rs:113

                read_lsn: ReadLsn {
                    request_lsn: Lsn::MAX,
                    not_modified_since_lsn: Some(Lsn(1)),
                },
                rel: RelTag {
                    spcnode: 1664, // pg_global
                    dbnode: 0,     // shared database
                    relnode: 1262, // pg_authid
                    forknum: 0,    // init
                },
                block_numbers: vec![0],
            })?;
            let resp = resp_stream
                .next()
                .await
                .transpose()?
                .ok_or_else(|| anyhow!("no response"))?;
            if resp.status_code != GetPageStatusCode::Ok {
                return Err(anyhow!("{} response", resp.status_code));
            }
        }

        // Hold onto streams to avoid closing them.
        streams.push((req_tx, resp_stream));
    }

    info!("opened {} streams, sleeping", args.count);

    // Block forever, to hold the idle streams open for inspection.
    futures::future::pending::<()>().await;

    Ok(())
}

View on GitHub (pinned to 8f60b04da4)

Solutions

  1. Confirm pagebench and pageserver come from the same neon build
  2. Check pageserver logs for the failing probe request
  3. Retry after the tenant reports active and has ingested initial WAL

Example fix

// before
if resp.status_code != GetPageStatusCode::Ok {
    return Err(anyhow!("{} response", resp.status_code));
}
// after: switch on the status to give an actionable message
match resp.status_code {
    GetPageStatusCode::Ok => {}
    code => {
        return Err(anyhow!(
            "probe got {code}; verify pagebench/pageserver versions match"
        ))
    }
}
Defensive patterns

Strategy: try-catch

Type guard

fn is_ok(resp: &page_api::GetPageResponse) -> bool {
    resp.status_code == page_api::GetPageStatusCode::Ok
}

Try / catch

match run_probe(&args).await {
    Ok(_) => {}
    Err(err) if err.to_string().ends_with("response") => {
        tracing::warn!(?err, "probe returned non-Ok status; continuing with fewer streams");
    }
    Err(err) => return Err(err),
}

Prevention

When it happens

Trigger: A page_api protocol or schema mismatch between the pagebench build and the pageserver; the tenant not yet ready to serve page reads; a server-side lookup failure for the probed key.

Common situations: Version skew between neon components in mixed environments; benching a tenant immediately after creation before it can serve reads.

Related errors


AI-assisted analysis of neondatabase/neon@8f60b04da4 (2026-08-16). Data as JSON: /api/errors/87f006361ce64299. Report an issue: GitHub.