{"record":{"id":"4cd5c498b11eab9b","repo":"FuelLabs/fuel-core","slug":"no-config-found","errorCode":null,"errorMessage":"No config found","messagePattern":"No config found","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/chain-config/src/config/state/reader.rs","lineNumber":212,"sourceCode":"            chain_config,\n        })\n    }\n\n    #[cfg(feature = \"parquet\")]\n    fn read_config<Config>(path: &std::path::Path) -> anyhow::Result<Config>\n    where\n        Config: serde::de::DeserializeOwned,\n    {\n        use super::parquet::decode::Decoder;\n\n        let file = std::fs::File::open(path)?;\n        let group = Decoder::new(file)?\n            .next()\n            .ok_or_else(|| anyhow::anyhow!(\"No block height found\"))??;\n        let config = group\n            .into_iter()\n            .next()\n            .ok_or_else(|| anyhow::anyhow!(\"No config found\"))?;\n        postcard::from_bytes(&config).map_err(Into::into)\n    }\n\n    #[cfg(feature = \"std\")]\n    pub fn open(\n        snapshot_metadata: crate::config::SnapshotMetadata,\n    ) -> anyhow::Result<Self> {\n        Self::open_w_config(snapshot_metadata, MAX_GROUP_SIZE)\n    }\n\n    #[cfg(feature = \"std\")]\n    pub fn open_w_config(\n        snapshot_metadata: crate::config::SnapshotMetadata,\n        json_group_size: usize,\n    ) -> anyhow::Result<Self> {\n        use crate::TableEncoding;\n        let chain_config = ChainConfig::from_snapshot_metadata(&snapshot_metadata)?;\n","sourceCodeStart":194,"sourceCodeEnd":230,"githubUrl":"https://github.com/FuelLabs/fuel-core/blob/b9d4d170da3a31c9ace5f963d633b326348e0d42/crates/chain-config/src/config/state/reader.rs#L194-L230","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// Use parquet metadata to confirm the first row group has rows before reading\nuse parquet::file::reader::SerializedFileReader;\nlet reader = SerializedFileReader::new(std::fs::File::open(&path)?)?;\nanyhow::ensure!(\n    reader.num_row_groups() > 0 && reader.get_row_group(0).unwrap().num_rows() > 0,\n    \"snapshot table {path:?} has an empty first row group\"\n);","typeGuard":null,"tryCatchPattern":"match read_config::<Config>(&path) {\n    Err(e) if e.to_string().contains(\"No config found\") => {\n        // row group exists but holds zero rows → regenerate or drop the empty table\n        regenerate_snapshot().await?;\n    }\n    other => other?,\n}","preventionTips":["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."],"tags":["rust","fuel-core","chain-config","parquet","snapshot","empty-row-group"],"backgroundTag":null,"analyzedSha":"b9d4d170da3a31c9ace5f963d633b326348e0d42","analyzedAt":"2026-08-16T08:56:42.692Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}