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
- Regenerate the snapshot; empty tables should be omitted or contain the required rows, depending on the reader's contract.
- If empty tables are valid for your flow, filter them out of the metadata before opening the reader.
- Inspect the file with parquet-tools (inspect/cat-rowgroups) to confirm the row group is empty.
- 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
- Inspect suspicious snapshot files with parquet-tools before loading.
- If a table can legitimately be empty, exclude it from SnapshotMetadata instead of shipping an empty group.
- Report empty-group output from the snapshot writer upstream — it should omit or fully write tables.
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
- No block height found
- Missing code for contract: {id}
- Missing utxo for contract: {id}
- Missing column. Check the schema!
- Fragments use different compressions.
AI-assisted analysis of FuelLabs/fuel-core@b9d4d170da (2026-08-16).
Data as JSON: /api/errors/4cd5c498b11eab9b.
Report an issue: GitHub.