neondatabase/neon · error
Remote extensions are not configured
Error message
Remote extensions are not configured
What it means
The mirror of error 10: here params.remote_ext_base_url IS configured, but the ComputeSpec itself carries no remote_extensions block (spec.remote_extensions is None), so compute_ctl has no index of available extension archives and refuses. It means the local side is configured while the control-plane side of the contract is missing.
Source
Thrown at compute_tools/src/compute.rs:2616
Ok(ext_version)
}
pub async fn prepare_preload_libraries(
&self,
spec: &ComputeSpec,
) -> Result<RemoteExtensionMetrics> {
if self.params.remote_ext_base_url.is_none() {
return Ok(RemoteExtensionMetrics {
num_ext_downloaded: 0,
largest_ext_size: 0,
total_ext_download_size: 0,
});
}
let remote_extensions = spec
.remote_extensions
.as_ref()
.ok_or(anyhow::anyhow!("Remote extensions are not configured"))?;
info!("parse shared_preload_libraries from spec.cluster.settings");
let mut libs_vec = Vec::new();
if let Some(libs) = spec.cluster.settings.find("shared_preload_libraries") {
libs_vec = libs
.split(&[',', '\'', ' '])
.filter(|s| *s != "neon" && *s != "databricks_auth" && !s.is_empty())
.map(str::to_string)
.collect();
}
info!("parse shared_preload_libraries from provided postgresql.conf");
// that is used in neon_local and python tests
if let Some(conf) = &spec.cluster.postgresql_conf {
let conf_lines = conf.split('\n').collect::<Vec<&str>>();
let mut shared_preload_libraries_line = "";
for line in conf_lines {
if line.starts_with("shared_preload_libraries") {View on GitHub (pinned to 8f60b04da4)
Solutions
- Ensure the control plane populates spec.remote_extensions (the extension index/version list) when it sends specs to this compute
- Align control-plane and compute_ctl versions so the spec schema matches
- If remote extensions are unwanted, also drop --remote-ext-base-url so the whole path short-circuits with zeroed metrics instead of erroring
Example fix
// before: base URL set, spec lacks the field -> Err("Remote extensions are not configured")
// after: spec fragment
"remote_extensions": { "library_index": [ { "ext": ["pg_uuidv7"], "lib": ["pg_uuidv7.so"], "control": ["pg_uuidv7.control"], "artifact": "ext/pg_uuidv7.tar.zst" } ] } Defensive patterns
Strategy: validation
Validate before calling
// Both halves of the contract must hold before the download pass
if params.remote_ext_base_url.is_some() && spec.remote_extensions.is_none() {
anyhow::bail!("compute has extension storage but spec lacks remote_extensions; version skew?");
} Type guard
fn remote_extension_contract_holds(params: &ComputeParams, spec: &ComputeSpec) -> bool {
params.remote_ext_base_url.is_none() || spec.remote_extensions.is_some()
} Try / catch
// Degrade gracefully: zeroed metrics instead of an error (mirrors the base_url==None path)
if spec.remote_extensions.is_none() {
warn!("spec has no remote_extensions index; skipping downloads");
return Ok(RemoteExtensionMetrics { num_ext_downloaded: 0, largest_ext_size: 0, total_ext_download_size: 0 });
} Prevention
- Keep control-plane and compute_ctl versions compatible; test spec/compute pairs together in CI
- Make the cplane emit remote_extensions whenever computes are configured with a base URL
- If you intentionally drop remote extensions, remove the flag on the compute side in the same change
When it happens
Trigger: download_all_remote_extensions runs with remote_ext_base_url set and spec.remote_extensions == None - typically a cplane that did not include the remote_extensions field in the spec, or version skew between control plane and compute_ctl.
Common situations: Upgrading compute_ctl ahead of/behind the control plane so the spec schema no longer matches; control plane disabling remote extensions while computes still pass the base URL; hand-written specs for testing.
Related errors
- pageserver connection information should be provided
- safekeeper connstrings should be provided
- tenant id should be provided
- timeline id should be provided
- Remote extensions storage is not configured
AI-assisted analysis of neondatabase/neon@8f60b04da4 (2026-08-16).
Data as JSON: /api/errors/7f9114864d4e4271.
Report an issue: GitHub.