{"record":{"id":"12b53528241eee62","repo":"influxdata/influxdb","slug":"failed-to-parse-snapshot-info-file-path","errorCode":null,"errorMessage":"Failed to parse snapshot info file path","messagePattern":"Failed to parse snapshot info file path","errorType":"exception","errorClass":"TableIndexCacheError","httpStatus":null,"severity":"error","filePath":"influxdb3_write/src/table_index_cache.rs","lineNumber":90,"sourceCode":"    #[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\")]\n    SerializeConversionMarkerError(#[source] serde_json::Error),\n\n    #[error(\"Failed to put initial table index conversion marker to object store\")]\n    PutConversionMarkerError(#[source] object_store::Error),\n\n    #[error(\"Failed to parse snapshot info file path\")]\n    ParseSnapshotPathError(#[source] anyhow::Error),\n\n    #[error(\"Failed to split persisted snapshot into table snapshots\")]\n    SplitPersistedSnapshotError(#[source] crate::table_index::TableIndexError),\n\n    #[error(\"Failed to load table index from object store\")]\n    LoadTableIndexFromObjectStoreError(#[source] crate::table_index::TableIndexError),\n\n    #[error(\"Failed to update table index from object store\")]\n    UpdateTableIndexFromObjectStoreError(#[source] crate::table_index::TableIndexError),\n\n    #[error(\"Failed to create table index from object store\")]\n    CreateTableIndexFromObjectStoreError(#[source] crate::table_index::TableIndexError),\n\n    #[error(\"Failed to delete parquet file {path} from object store\")]\n    DeleteParquetFile {\n        path: String,\n        #[source]","sourceCodeStart":72,"sourceCodeEnd":108,"githubUrl":"https://github.com/influxdata/influxdb/blob/06200ef96ba82c5f6727e5038a83af8e722c6875/influxdb3_write/src/table_index_cache.rs#L72-L108","documentation":"TableIndexCacheError::ParseSnapshotPathError, thrown when parsing a snapshot info file path fails, wrapping an anyhow::Error. The cache derives a SnapshotInfoFilePath from object store paths; failure means the path does not encode the expected database/snapshot sequence components.","triggerScenarios":"During index loading, snapshot info file locations discovered in the object store are converted into SnapshotInfoFilePath via a fallible parse returning anyhow::Result; any path whose filename/segments don't match the expected snapshot-info naming triggers this variant.","commonSituations":"Non-InfluxDB files placed in the snapshot directory by backup tools or manual operations; partially uploaded snapshot info files; path scheme drift between InfluxDB 3 versions sharing a bucket; renamed/moved objects during restore.","solutions":["List the snapshot directory and remove or relocate objects that are not valid snapshot info files","Restore from the same InfluxDB 3 version that wrote the data so path schemes match; complete interrupted restores","Re-run the catalog/index recovery tooling to rebuild derived snapshot paths from canonical data","Report upstream with the offending path if the server itself wrote the malformed name"],"exampleFix":"// before: abort load on first unparseable path\nlet p = SnapshotInfoFilePath::parse(&loc)?;\n// after: skip foreign objects\nlet p = match SnapshotInfoFilePath::parse(&loc) {\n    Ok(p) => p,\n    Err(e) => { warn!(%loc, %e, \"ignoring non-snapshot-info object\"); continue; }\n};","handlingStrategy":"validation","validationCode":"fn is_snapshot_info_name(loc: &ObjPath) -> bool {\n    loc.filename()\n        .map(|f| f.ends_with(\".json\") && f.contains(\"snapshot\"))\n        .unwrap_or(false)\n}","typeGuard":"fn parse_snapshot_info(loc: &ObjPath) -> Option<SnapshotInfoFilePath> {\n    SnapshotInfoFilePath::parse(loc.to_string()).ok()\n}","tryCatchPattern":"match result {\n    Err(TableIndexCacheError::ParseSnapshotPathError(e)) => {\n        warn!(error=?e, \"non-snapshot-info object encountered; skipping\");\n        continue_processing();\n    }\n    other => other?,\n}","preventionTips":["Keep backup/tooling output out of snapshot directories","Restore data only with matching InfluxDB 3 versions","Write snapshot info files atomically (temp + rename) to avoid truncation","Alert on unparseable paths — they usually indicate foreign objects or writer bugs"],"tags":["object-store","path-parsing","influxdb3"],"backgroundTag":"invalid-identifier-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"}