{"record":{"id":"92f204e85d56035b","repo":"neondatabase/neon","slug":"pageserver-connection-information-should-be-provid","errorCode":null,"errorMessage":"pageserver connection information should be provided","messagePattern":"pageserver connection information should be provided","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"critical","filePath":"compute_tools/src/compute.rs","lineNumber":336,"sourceCode":"                pageserver_conninfo = Some(PageserverConnectionInfo::from_connstr(\n                    pageserver_connstr_field,\n                    spec.shard_stripe_size,\n                )?);\n            }\n        }\n        if pageserver_conninfo.is_none() {\n            if let Some(guc) = spec.cluster.settings.find(\"neon.pageserver_connstring\") {\n                let stripe_size = if let Some(guc) = spec.cluster.settings.find(\"neon.stripe_size\")\n                {\n                    Some(ShardStripeSize(u32::from_str(&guc)?))\n                } else {\n                    None\n                };\n                pageserver_conninfo =\n                    Some(PageserverConnectionInfo::from_connstr(&guc, stripe_size)?);\n            }\n        }\n        let pageserver_conninfo = pageserver_conninfo.ok_or(anyhow::anyhow!(\n            \"pageserver connection information should be provided\"\n        ))?;\n\n        // Similarly for safekeeper connection strings\n        let safekeeper_connstrings = if spec.safekeeper_connstrings.is_empty() {\n            if matches!(spec.mode, ComputeMode::Primary) {\n                spec.cluster\n                    .settings\n                    .find(\"neon.safekeepers\")\n                    .ok_or(anyhow::anyhow!(\"safekeeper connstrings should be provided\"))?\n                    .split(',')\n                    .map(|str| str.to_string())\n                    .collect()\n            } else {\n                vec![]\n            }\n        } else {\n            spec.safekeeper_connstrings.clone()","sourceCodeStart":318,"sourceCodeEnd":354,"githubUrl":"https://github.com/neondatabase/neon/blob/8f60b04da47ffefe0e52bda2440134b42874eb75/compute_tools/src/compute.rs#L318-L354","documentation":"While turning a ComputeSpec into a ParsedSpec, compute_ctl found no pageserver address: the explicit pageserver_conninfo argument was None and spec.cluster.settings has no 'neon.pageserver_connstring' GUC. Without a pageserver the compute cannot read pages, so parsing aborts. This is a spec-authoring/cplane problem, not a runtime failure.","triggerScenarios":"ParsedSpec::try_from (compute.rs) receives a spec where pageserver_conninfo is None and settings.find(\"neon.pageserver_connstring\") returns None. Typically a hand-written spec.json for testing, or a control plane that omitted the GUC when assembling cluster settings.","commonSituations":"Local testing with a hand-crafted spec file; version skew where an older/newer cplane stops emitting neon.pageserver_connstring; spec mangled by middleware or manual editing before reaching compute_ctl.","solutions":["Add \"neon.pageserver_connstring\": \"postgresql://...\" to spec.cluster.settings (or pass the conninfo through the code path that sets it directly)","Fix the control-plane spec generation so the pageserver connstring GUC is always included for endpoints that need one","Pre-validate specs (JSON schema or field check) before handing them to compute_ctl"],"exampleFix":"// before: spec.cluster.settings missing the GUC -> error\n// after: spec fragment\n{\n  \"cluster\": {\n    \"settings\": [\n      { \"name\": \"neon.pageserver_connstring\", \"value\": \"postgresql://nouser@pageserver-0:6400\" }\n    ]\n  }\n}","handlingStrategy":"validation","validationCode":"// Validate spec before ParsedSpec::try_from / compute start\nlet has_ps = spec.pageserver_conninfo_arg.is_some()\n    || spec.cluster.settings.find(\"neon.pageserver_connstring\").is_some();\nif !has_ps {\n    anyhow::bail!(\"spec rejected: neon.pageserver_connstring missing\");\n}","typeGuard":"fn spec_has_pageserver(spec: &ComputeSpec) -> bool {\n    spec.cluster.settings.find(\"neon.pageserver_connstring\").is_some()\n}","tryCatchPattern":"// Startup-time config error: fail fast with a precise message, do not retry\nmatch ParsedSpec::try_from(spec) {\n    Ok(p) => p,\n    Err(e) if e.to_string().contains(\"pageserver connection\") =>\n        return Err(anyhow!(\"spec incomplete (pageserver connstring) - fix cplane spec\")),\n    Err(e) => return Err(e),\n}","preventionTips":["Enforce a JSON schema for ComputeSpec at the control plane so the GUC cannot be omitted","Add contract tests between cplane spec generation and ParsedSpec::try_from","For local specs, start from a fixture in the repo rather than a blank file"],"tags":["rust","compute-ctl","spec","configuration","pageserver","startup"],"backgroundTag":"missing-configuration","analyzedSha":"8f60b04da47ffefe0e52bda2440134b42874eb75","analyzedAt":"2026-08-16T23:39:28.135Z","schemaVersion":2},"datasetVersion":"2026-08-17T04:17:16.089Z"}