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

  1. Ensure the control plane populates spec.remote_extensions (the extension index/version list) when it sends specs to this compute
  2. Align control-plane and compute_ctl versions so the spec schema matches
  3. 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

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


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