{"record":{"id":"47d73704d1a1cd5f","repo":"quickwit-oss/quickwit","slug":"invalid-recovery-footer-offsets","errorCode":null,"errorMessage":"invalid recovery footer offsets","messagePattern":"invalid recovery footer offsets","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"quickwit/quickwit-metastore/src/split_metadata.rs","lineNumber":218,"sourceCode":"            uncompressed_docs_size_bytes,\n            time_range_start_inclusive,\n            time_range_end_inclusive,\n            create_timestamp,\n            tags,\n            delete_opstamp,\n            num_merge_ops,\n            parent_split_ids,\n            maturation_period_millis,\n        } = recovery_metadata;\n        let time_range = match (time_range_start_inclusive, time_range_end_inclusive) {\n            (Some(start), Some(end)) if start <= end => Some(start..=end),\n            (None, None) => None,\n            (Some(start), Some(end)) => {\n                bail!(\"invalid recovery time range: start {start} is after end {end}\")\n            }\n            _ => bail!(\"recovery time range must contain both start and end\"),\n        };\n        ensure!(\n            !footer_offsets.is_empty(),\n            \"invalid recovery footer offsets\"\n        );\n        let maturity = match maturation_period_millis {\n            Some(maturation_period_millis) => SplitMaturity::Immature {\n                maturation_period: Duration::from_millis(maturation_period_millis),\n            },\n            None => SplitMaturity::Mature,\n        };\n        let split_metadata = Self {\n            split_id: split_id.into(),\n            index_uid: index_uid.ok_or_else(|| anyhow::anyhow!(\"missing recovery index UID\"))?,\n            partition_id,\n            source_id,\n            node_id,\n            num_docs: num_docs.try_into()?,\n            uncompressed_docs_size_in_bytes: uncompressed_docs_size_bytes,\n            time_range,","sourceCodeStart":200,"sourceCodeEnd":236,"githubUrl":"https://github.com/quickwit-oss/quickwit/blob/a39730c5cdcd1a4fe798403737ae293999ea21f8/quickwit/quickwit-metastore/src/split_metadata.rs#L200-L236","documentation":"When deserializing a SplitMetadata from its serialized recovery form (try_from_recovery_metadata), the recovery footer offsets are expected to be a non-empty set. An empty footer offset list means the stored recovery record is incomplete or corrupted, so the library refuses to reconstruct the split metadata. This guards the metastore against silently indexing a split with no footer information.","triggerScenarios":"Calling `SplitMetadata::try_from_recovery_metadata` with a SplitMetadataFooter where the `footer_offsets` map/field is empty — typically from a truncated or partially written metastore record.","commonSituations":"Metastore rows written by an older or buggy Quickwit version that left footer_offsets empty; manual editing of the metastore; corrupted rows after a failed write.","solutions":["Delete or re-stage the affected split so the indexing pipeline rewrites a complete metadata record.","Check which Quickwit version wrote the record; upgrade and re-index if an old version produced empty footers.","If the record is recoverable from a backup, restore the metastore row including footer offsets."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"if recovery_metadata.footer_offsets.is_empty() {\n    // skip or quarantine this split record before calling try_from_recovery_metadata\n}","typeGuard":null,"tryCatchPattern":"match SplitMetadata::try_from_recovery_metadata(rec) {\n    Ok(md) => md,\n    Err(e) if e.to_string().contains(\"invalid recovery footer offsets\") => {\n        warn!(\"corrupt recovery record: {e}\"); /* quarantine/delete record */\n    }\n    Err(e) => return Err(e),\n}","preventionTips":["Never hand-edit metastore records; use Quickwit tooling.","Keep metastore backups so corrupt rows can be restored.","Upgrade Quickwit rather than mixing writer versions against the same metastore."],"tags":["metastore","split-metadata","deserialization"],"backgroundTag":"empty-required-field","analyzedSha":"a39730c5cdcd1a4fe798403737ae293999ea21f8","analyzedAt":"2026-09-08T13:19:37.784Z","contentChangedAt":"2026-09-08T13:19:37.784Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}