{"record":{"id":"33318d15361f4a26","repo":"neondatabase/neon","slug":"no-response","errorCode":null,"errorMessage":"no response","messagePattern":"no response","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pageserver/pagebench/src/cmd/idle_streams.rs","lineNumber":111,"sourceCode":"                request_id: 1.into(),\n                request_class: GetPageClass::Normal,\n                read_lsn: ReadLsn {\n                    request_lsn: Lsn::MAX,\n                    not_modified_since_lsn: Some(Lsn(1)),\n                },\n                rel: RelTag {\n                    spcnode: 1664, // pg_global\n                    dbnode: 0,     // shared database\n                    relnode: 1262, // pg_authid\n                    forknum: 0,    // init\n                },\n                block_numbers: vec![0],\n            })?;\n            let resp = resp_stream\n                .next()\n                .await\n                .transpose()?\n                .ok_or_else(|| anyhow!(\"no response\"))?;\n            if resp.status_code != GetPageStatusCode::Ok {\n                return Err(anyhow!(\"{} response\", resp.status_code));\n            }\n        }\n\n        // Hold onto streams to avoid closing them.\n        streams.push((req_tx, resp_stream));\n    }\n\n    info!(\"opened {} streams, sleeping\", args.count);\n\n    // Block forever, to hold the idle streams open for inspection.\n    futures::future::pending::<()>().await;\n\n    Ok(())\n}\n","sourceCodeStart":93,"sourceCodeEnd":128,"githubUrl":"https://github.com/neondatabase/neon/blob/8f60b04da47ffefe0e52bda2440134b42874eb75/pageserver/pagebench/src/cmd/idle_streams.rs#L93-L128","documentation":"After sending a GetPage request on the page_api stream, idle_streams awaits the next response. Some(Err(..)) is surfaced via transpose()?, but None means the server closed the stream without answering, which becomes 'no response'. The remote side terminated the stream: connection loss, HTTP/2 GOAWAY, stream reset, or server shutdown.","triggerScenarios":"The pageserver closing the stream after an internal error or during shutdown; opening more concurrent streams (--count) than the server or an intermediary permits; HTTP/2 connection teardown between request and response.","commonSituations":"High --count values tripping max-concurrent-streams limits; proxies or load balancers resetting idle or long-lived streams; pageserver restart while the bench holds streams open.","solutions":["Check pageserver logs for why the stream or connection closed","Lower --count below the server's and any proxy's concurrent-stream limits","Ensure direct connectivity without intermediaries that reset idle streams","Re-run after the pageserver is confirmed healthy"],"exampleFix":"// before\nlet resp = resp_stream\n    .next()\n    .await\n    .transpose()?\n    .ok_or_else(|| anyhow!(\"no response\"))?;\n// after: distinguish error, clean close, and response\nlet resp = match resp_stream.next().await {\n    Some(Ok(resp)) => resp,\n    Some(Err(e)) => return Err(e.into()),\n    None => {\n        return Err(anyhow!(\n            \"server closed the stream before responding; check pageserver logs\"\n        ))\n    }\n};","handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"// treat 'no response' as reconnect-and-retry, not fatal\nloop {\n    match open_stream_and_probe(&args).await {\n        Ok(pair) => break pair,\n        Err(e) if e.to_string().contains(\"no response\") => {\n            tokio::time::sleep(std::time::Duration::from_secs(1)).await;\n            continue;\n        }\n        Err(e) => return Err(e),\n    }\n}","preventionTips":["Bound --count by the server's max concurrent streams setting","Avoid load balancers between pagebench and pageserver for stream tests","Monitor server-side stream close reasons in logs during the run","Reconnect with fresh channels instead of reusing possibly-dead ones"],"tags":["pagebench","grpc","stream-closed","http2","network"],"backgroundTag":"stream-closed-unexpectedly","analyzedSha":"8f60b04da47ffefe0e52bda2440134b42874eb75","analyzedAt":"2026-08-16T23:39:28.135Z","schemaVersion":2},"datasetVersion":"2026-08-17T04:17:16.089Z"}