{"record":{"id":"f8b07936c9c79119","repo":"quickwit-oss/quickwit","slug":"unsupported-split-footer-trailer-version-version","errorCode":null,"errorMessage":"unsupported split footer trailer version {version}","messagePattern":"unsupported split footer trailer version (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"quickwit/quickwit-storage/src/bundle_storage.rs","lineNumber":190,"sourceCode":"    writer.put_u64_le(footer_start_inclusive);\n    writer.put_u32_le(SPLIT_FOOTER_TRAILER_VERSION);\n    writer.put_slice(SPLIT_FOOTER_TRAILER_MAGIC);\n    debug_assert!(!writer.has_remaining_mut());\n    trailer\n}\n\nfn deserialize_split_footer_trailer(trailer: &[u8]) -> anyhow::Result<Option<u64>> {\n    if trailer.len() != SPLIT_FOOTER_TRAILER_NUM_BYTES {\n        return Ok(None);\n    }\n    let mut reader = trailer;\n    let footer_start_inclusive = reader.get_u64_le();\n    let version = reader.get_u32_le();\n\n    if reader != SPLIT_FOOTER_TRAILER_MAGIC {\n        return Ok(None);\n    }\n    ensure!(\n        version == SPLIT_FOOTER_TRAILER_VERSION,\n        \"unsupported split footer trailer version {version}\"\n    );\n    Ok(Some(footer_start_inclusive))\n}\n\n/// Locates a split footer range using its fixed trailer, with support for legacy split layouts.\npub async fn locate_split_footer_range(\n    storage: &dyn Storage,\n    split_path: &Path,\n    split_len: u64,\n) -> anyhow::Result<Range<u64>> {\n    ensure!(\n        split_len >= SPLIT_FOOTER_TRAILER_NUM_BYTES as u64,\n        \"split is too short to contain a footer\"\n    );\n    let end = split_len as usize;\n    let start = end - SPLIT_FOOTER_TRAILER_NUM_BYTES;","sourceCodeStart":172,"sourceCodeEnd":208,"githubUrl":"https://github.com/quickwit-oss/quickwit/blob/a39730c5cdcd1a4fe798403737ae293999ea21f8/quickwit/quickwit-storage/src/bundle_storage.rs#L172-L208","documentation":"Split files end with a footer trailer containing a version number alongside the footer start offset. deserialize_split_footer_trailer rejects trailers whose version differs from SPLIT_FOOTER_TRAILER_VERSION, since the layout cannot be interpreted across incompatible versions. This protects readers from misparsing splits written by incompatible Quickwit versions.","triggerScenarios":"Reading a split whose footer trailer version field differs from the version the current binary expects — i.e. the split was written by a newer or otherwise incompatible Quickwit release.","commonSituations":"Rolling upgrades where a newer writer version created splits before the cluster was fully upgraded; downgrading Quickwit below the version that wrote the splits; corrupted trailer bytes flipping the version field.","solutions":["Upgrade Quickwit to the version that wrote the splits (check the trailer version against release notes).","Avoid downgrading a cluster that already contains splits written by a newer version.","Re-index the affected splits into a format the current version supports if upgrading is impossible."],"exampleFix":null,"handlingStrategy":"fallback","validationCode":null,"typeGuard":null,"tryCatchPattern":"match locate_split_footer_range(split, &storage).await {\n    Ok(footer) => footer,\n    Err(e) if e.to_string().contains(\"unsupported split footer trailer version\") => {\n        // re-index the split with a compatible version, or fail with a clear upgrade message\n    }\n    Err(e) => return Err(e.into()),\n}","preventionTips":["Complete rolling upgrades before generating new traffic against splits.","Never downgrade Quickwit below the version that wrote existing splits.","Record the writer version per split and check compatibility before search."],"tags":["storage","versioning","split-footer"],"backgroundTag":"unsupported-enum-value","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"}