FuelLabs/fuel-core · error

No config found

Error message

No config found

What it means

After the first row group is found, Reader::read_config takes its first row as the serialized config (block height); if that group contains zero rows, reading fails with 'No config found' (crates/chain-config/src/config/state/reader.rs:212). The parquet file is structurally present but the row group was closed with no records — the table was written but no data rows made it in.

Source

Thrown at crates/chain-config/src/config/state/reader.rs:212

            chain_config,
        })
    }

    #[cfg(feature = "parquet")]
    fn read_config<Config>(path: &std::path::Path) -> anyhow::Result<Config>
    where
        Config: serde::de::DeserializeOwned,
    {
        use super::parquet::decode::Decoder;

        let file = std::fs::File::open(path)?;
        let group = Decoder::new(file)?
            .next()
            .ok_or_else(|| anyhow::anyhow!("No block height found"))??;
        let config = group
            .into_iter()
            .next()
            .ok_or_else(|| anyhow::anyhow!("No config found"))?;
        postcard::from_bytes(&config).map_err(Into::into)
    }

    #[cfg(feature = "std")]
    pub fn open(
        snapshot_metadata: crate::config::SnapshotMetadata,
    ) -> anyhow::Result<Self> {
        Self::open_w_config(snapshot_metadata, MAX_GROUP_SIZE)
    }

    #[cfg(feature = "std")]
    pub fn open_w_config(
        snapshot_metadata: crate::config::SnapshotMetadata,
        json_group_size: usize,
    ) -> anyhow::Result<Self> {
        use crate::TableEncoding;
        let chain_config = ChainConfig::from_snapshot_metadata(&snapshot_metadata)?;

View on GitHub (pinned to b9d4d170da)

Solutions

  1. Regenerate the snapshot; empty tables should be omitted or contain the required rows, depending on the reader's contract.
  2. If empty tables are valid for your flow, filter them out of the metadata before opening the reader.
  3. Inspect the file with parquet-tools (inspect/cat-rowgroups) to confirm the row group is empty.
  4. If the standard snapshot writer produces empty groups for empty tables, report it upstream.
Defensive patterns

Strategy: validation

Validate before calling

// Use parquet metadata to confirm the first row group has rows before reading
use parquet::file::reader::SerializedFileReader;
let reader = SerializedFileReader::new(std::fs::File::open(&path)?)?;
anyhow::ensure!(
    reader.num_row_groups() > 0 && reader.get_row_group(0).unwrap().num_rows() > 0,
    "snapshot table {path:?} has an empty first row group"
);

Try / catch

match read_config::<Config>(&path) {
    Err(e) if e.to_string().contains("No config found") => {
        // row group exists but holds zero rows → regenerate or drop the empty table
        regenerate_snapshot().await?;
    }
    other => other?,
}

Prevention

When it happens

Trigger: read_config on a parquet table whose single row group was closed empty — e.g. a writer flushed a group for zero elements, or a partial write aborted before rows landed.

Common situations: Snapshotting chain state where a table legitimately had no entries but the writer still emitted an empty group; writer bugs after errors; interrupted generation that still finalized a group.

Related errors


AI-assisted analysis of FuelLabs/fuel-core@b9d4d170da (2026-08-16). Data as JSON: /api/errors/4cd5c498b11eab9b. Report an issue: GitHub.