{"record":{"id":"df97ac1a01b159c0","repo":"influxdata/influxdb","slug":"failed-to-parse-table-index-path-from-object-store-path-df97ac","errorCode":null,"errorMessage":"Failed to parse table index path from object store path","messagePattern":"Failed to parse table index path from object store path","errorType":"exception","errorClass":"TableIndexCacheError","httpStatus":null,"severity":"error","filePath":"influxdb3_write/src/table_index_cache.rs","lineNumber":66,"sourceCode":"    #[error(\"TableIndex operation failed\")]\n    TableIndex(#[source] crate::table_index::TableIndexError),\n\n    #[error(\"Object meta is missing filename\")]\n    MissingFilename,\n\n    #[error(\"Failed to parse snapshot sequence number from filename\")]\n    InvalidSnapshotSequenceNumber,\n\n    #[error(\"Unexpected error\")]\n    Unexpected(#[source] anyhow::Error),\n\n    #[error(\"Table snapshot persistence task failed\")]\n    TableSnapshotPersistenceTaskFailed(#[source] tokio::task::JoinError),\n\n    #[error(\"Failed to list table indices from object store\")]\n    ListIndices(#[source] object_store::Error),\n\n    #[error(\"Failed to parse table index path from object store path\")]\n    TableIndexPath(#[source] crate::paths::PathError),\n\n    #[error(\"Failed to list table index snapshots from object store\")]\n    ListSnapshots(#[source] object_store::Error),\n\n    #[error(\"Failed to parse table index snapshot path from object store path\")]\n    TableIndexSnapshotPath(#[source] crate::paths::PathError),\n\n    #[error(\"Failed to update table index: join task failed\")]\n    UpdateTaskFailed(#[source] tokio::task::JoinError),\n\n    #[error(\"Failed to list object store metadata\")]\n    ListMetasError(#[source] object_store::Error),\n\n    #[error(\"Failed to load table index conversion marker bytes from object store\")]\n    LoadConversionMarkerBytesError(#[source] object_store::Error),\n\n    #[error(\"Failed to serialize initial table index conversion marker\")]","sourceCodeStart":48,"sourceCodeEnd":84,"githubUrl":"https://github.com/influxdata/influxdb/blob/06200ef96ba82c5f6727e5038a83af8e722c6875/influxdb3_write/src/table_index_cache.rs#L48-L84","documentation":"TableIndexCacheError::TableIndexPath, thrown by the table index LRU cache (influxdb3_write/src/table_index_cache.rs) when an object store path returned by a List call cannot be parsed into the strongly-typed TableIndexPath via crate::paths. The cache expects every object under the table index prefix to follow the canonical layout; a malformed name means the store contains unexpected or corrupt objects.","triggerScenarios":"During cache warm-up or index enumeration, list_indices() iterates a stream of ObjectMeta and calls TableIndexPath::from_obj_path (or equivalent parse); any object whose relative path lacks the expected db/table/index segments yields PathError and this variant.","commonSituations":"Manual file copies or migrations into the object store bucket placing files outside the canonical layout; objects written by an older/newer InfluxDB 3 version with a changed path scheme; leftover temp/partial objects in the index directory.","solutions":["List and inspect objects under the table index prefix; identify the object whose name does not match the expected layout and remove or rename it to the canonical path format","Check for mixed InfluxDB 3 versions or migration tooling writing to the same bucket and align the path scheme","Upgrade the crate if the path format changed between versions; regenerate/rebuild the index by re-running the conversion/recovery tooling","File an issue if the offending object was written by the server itself — this usually indicates a writer bug"],"exampleFix":"// before: blindly parsing every listed path\nfor meta in store.list(Some(&prefix)) {\n    let idx = TableIndexPath::from_obj_path(meta.location())?;\n}\n// after: skip non-conforming objects with a warning\nfor meta in store.list(Some(&prefix)) {\n    match TableIndexPath::from_obj_path(meta.location()) {\n        Ok(idx) => handle(idx),\n        Err(e) => warn!(path=%meta.location(), error=%e, \"skipping non-index object\"),\n    }\n}","handlingStrategy":"validation","validationCode":"fn is_valid_table_index_path(loc: &object_store::path::Path) -> bool {\n    let parts: Vec<_> = loc.parts().map(|p| p.as_ref()).collect();\n    parts.len() >= 3 && parts.iter().all(|p| !p.is_empty())\n}\n// pre-filter list results before parsing","typeGuard":"fn parse_index_path(loc: &ObjPath) -> Option<TableIndexPath> {\n    TableIndexPath::from_obj_path(loc).ok()\n}","tryCatchPattern":"match result {\n    Err(TableIndexCacheError::TableIndexPath(e)) => {\n        warn!(error=?e, \"unparseable index path; skipping\");\n        // continue processing other entries\n    }\n    other => other?,\n}","preventionTips":["Never place foreign or hand-copied objects under the table index prefix","Keep one InfluxDB 3 version and one path scheme per bucket","Complete migrations/ restores fully before serving traffic","Alert on any object under index prefixes not matching the naming convention"],"tags":["object-store","path-parsing","influxdb3"],"backgroundTag":"invalid-url-format","analyzedSha":"06200ef96ba82c5f6727e5038a83af8e722c6875","analyzedAt":"2026-09-19T12:55:30.003Z","contentChangedAt":"2026-09-19T12:55:30.003Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}