influxdata/influxdb · error · TableIndexCacheError
Failed to parse snapshot info file path
Error message
Failed to parse snapshot info file path
What it means
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.
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
Example fix
// before: abort load on first unparseable path
let p = SnapshotInfoFilePath::parse(&loc)?;
// after: skip foreign objects
let p = match SnapshotInfoFilePath::parse(&loc) {
Ok(p) => p,
Err(e) => { warn!(%loc, %e, "ignoring non-snapshot-info object"); continue; }
}; Defensive patterns
Strategy: validation
Validate before calling
fn is_snapshot_info_name(loc: &ObjPath) -> bool {
loc.filename()
.map(|f| f.ends_with(".json") && f.contains("snapshot"))
.unwrap_or(false)
} Type guard
fn parse_snapshot_info(loc: &ObjPath) -> Option<SnapshotInfoFilePath> {
SnapshotInfoFilePath::parse(loc.to_string()).ok()
} Try / catch
match result {
Err(TableIndexCacheError::ParseSnapshotPathError(e)) => {
warn!(error=?e, "non-snapshot-info object encountered; skipping");
continue_processing();
}
other => other?,
} Prevention
- 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
When it happens
Trigger: 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.
Common situations: 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.
Understand the failure class
Background: "invalid id" errors: invalid identifier format — why libraries reject IDs before lookup, and how to fix them — this error's family across 37 libraries.
- Parsing and encoding errors: unexpected token, malformed input — why parsers reject input and how to find the real culprit.
Related errors
- Failed to parse table index path from object store path
- Failed to parse table index path from object store path
- Failed to parse table index snapshot path from object store…
- Failed to create table index from object store
- Failed to delete parquet file
AI-assisted analysis of influxdata/influxdb@06200ef96b (2026-09-19).
Data as JSON: /api/errors/12b53528241eee62.
Report an issue: GitHub.
Appendix: source
Thrown at influxdb3_write/src/table_index_cache.rs:90
#[error("Failed to parse table index snapshot path from object store path")]
TableIndexSnapshotPath(#[source] crate::paths::PathError),
#[error("Failed to update table index: join task failed")]
UpdateTaskFailed(#[source] tokio::task::JoinError),
#[error("Failed to list object store metadata")]
ListMetasError(#[source] object_store::Error),
#[error("Failed to load table index conversion marker bytes from object store")]
LoadConversionMarkerBytesError(#[source] object_store::Error),
#[error("Failed to serialize initial table index conversion marker")]
SerializeConversionMarkerError(#[source] serde_json::Error),
#[error("Failed to put initial table index conversion marker to object store")]
PutConversionMarkerError(#[source] object_store::Error),
#[error("Failed to parse snapshot info file path")]
ParseSnapshotPathError(#[source] anyhow::Error),
#[error("Failed to split persisted snapshot into table snapshots")]
SplitPersistedSnapshotError(#[source] crate::table_index::TableIndexError),
#[error("Failed to load table index from object store")]
LoadTableIndexFromObjectStoreError(#[source] crate::table_index::TableIndexError),
#[error("Failed to update table index from object store")]
UpdateTableIndexFromObjectStoreError(#[source] crate::table_index::TableIndexError),
#[error("Failed to create table index from object store")]
CreateTableIndexFromObjectStoreError(#[source] crate::table_index::TableIndexError),
#[error("Failed to delete parquet file {path} from object store")]
DeleteParquetFile {
path: String,
#[source]View on GitHub (pinned to 06200ef96b)