influxdata/influxdb · error · TableIndexError

Failed to parse table index snapshot path from object store…

Error message

Failed to parse table index snapshot path from object store path

What it means

TableIndexError::TableIndexSnapshotPath is identical in nature to TableIndexPath but applies to table index *snapshot* objects: an object store path could not be parsed into the typed TableIndexSnapshotPath. The snapshot path encodes identifiers plus a snapshot sequence number, and a parse failure means the raw path does not conform. It wraps a crate::paths::PathError.

Solutions

  1. Compare the offending path (from the wrapped PathError) against the expected snapshot filename layout including sequence number.
  2. Delete or archive legacy/foreign objects that fail to parse so listing can proceed.
  3. Verify writer/reader use the same InfluxDB 3 version and object store prefix layout.
  4. Re-run snapshotting after cleanup to regenerate well-formed snapshot objects.

Example fix

// before
let snap = TableIndexSnapshotPath::from_object_store_path(&path)?;
// after
match TableIndexSnapshotPath::from_object_store_path(&path) {
    Ok(snap) => process(snap),
    Err(e) => warn!(?path, %e, "ignoring non-conforming snapshot path"),
}
Defensive patterns

Strategy: fallback

Validate before calling

fn looks_like_snapshot_path(p: &object_store::path::Path) -> bool {
    let name = p.filename().unwrap_or("");
    name.ends_with(".json") && name.split('_').last().map_or(false, |s| s.trim_end_matches(".json").parse::<u64>().is_ok())
}

Try / catch

match TableIndexSnapshotPath::from_object_store_path(&raw) {
    Ok(typed) => use(typed),
    Err(TableIndexError::TableIndexSnapshotPath(e)) => {
        warn!(%e, path=%raw, "skipping malformed snapshot path");
        continue;
    }
    Err(e) => return Err(e),
}

Prevention

When it happens

Trigger: Listing snapshot objects and calling TableIndexSnapshotPath::from_object_store_path on a path missing or malforming the sequence-number/filename segment.

Common situations: Snapshot files written by an older schema version; partial/interrupted writes leaving truncated filenames; foreign objects in the snapshot prefix; renamed or manually moved files in the bucket.

Understand the failure class

Background: "Invalid ... format", "must be in format X", "does not look like a ..." — invalid argument format errors across CLI tools and libraries — this error's family across 17 libraries.

Related errors


AI-assisted analysis of influxdata/influxdb@06200ef96b (2026-09-19). Data as JSON: /api/errors/29625df8d1ac62ff. Report an issue: GitHub.

Appendix: source

Thrown at influxdb3_write/src/table_index.rs:58

    #[error("Failed to deserialize table index snapshot")]
    DeserializeSnapshot(#[source] serde_json::Error),

    #[error("Failed to persist table index to object store")]
    PersistIndex(#[source] object_store::Error),

    #[error("Failed to delete table index snapshot from object store")]
    DeleteSnapshot(#[source] object_store::Error),

    #[error("Cannot merge table indices with mismatched identifiers: {expected} != {actual}")]
    MergeMismatch {
        expected: TableIndexId,
        actual: TableIndexId,
    },

    #[error("Failed to parse table index path from object store path")]
    TableIndexPath(#[source] crate::paths::PathError),

    #[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("Object meta is missing filename")]
    MissingFilename,

    #[error("Failed to parse snapshot sequence number from filename")]
    InvalidSnapshotSequenceNumber,

    #[error("Table snapshot persistence task failed")]
    TableSnapshotPersistenceTaskFailed(#[source] tokio::task::JoinError),

    #[error("Unexpected error")]
    Unexpected(#[source] anyhow::Error),

    #[error("Object store operation failed")]

View on GitHub (pinned to 06200ef96b)