{"record":{"id":"75c07224a897575d","repo":"influxdata/influxdb","slug":"table-index-error-0","errorCode":null,"errorMessage":"table index error: {0}","messagePattern":"table index error: (.+?)","errorType":"error_code","errorClass":"PersisterError","httpStatus":null,"severity":"error","filePath":"influxdb3_write/src/persister.rs","lineNumber":77,"sourceCode":"    #[error(\"parquet error: {0}\")]\n    ParquetError(#[from] parquet::errors::ParquetError),\n\n    #[error(\"tried to serialize a parquet file with no rows\")]\n    NoRows,\n\n    #[error(\"parse int error: {0}\")]\n    ParseInt(#[from] std::num::ParseIntError),\n\n    #[error(\"unexpected persister error: {0:?}\")]\n    Unexpected(#[from] anyhow::Error),\n\n    #[error(\"table snapshot persistence task panicked: {0}\")]\n    TableSnapshotPersistenceTaskFailed(#[source] tokio::task::JoinError),\n\n    #[error(\"snapshot manifest parse task panicked: {0}\")]\n    SnapshotParseTaskFailed(#[source] tokio::task::JoinError),\n\n    #[error(\"table index error: {0}\")]\n    TableIndexPathError(#[source] crate::paths::PathError),\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\nimpl From<PersisterError> for DataFusionError {\n    fn from(error: PersisterError) -> Self {\n        match error {\n            PersisterError::DataFusion(e) => e,\n            PersisterError::ObjectStore(e) => DataFusionError::ObjectStore(Box::new(e)),\n            PersisterError::ParquetError(e) => DataFusionError::ParquetError(Box::new(e)),\n            _ => DataFusionError::External(Box::new(error)),\n        }\n    }","sourceCodeStart":59,"sourceCodeEnd":95,"githubUrl":"https://github.com/influxdata/influxdb/blob/06200ef96ba82c5f6727e5038a83af8e722c6875/influxdb3_write/src/persister.rs#L59-L95","documentation":"PersisterError::TableIndexPathError wraps a crate::paths::PathError produced while building or parsing a structured object-store path (SnapshotInfoFilePath / TableIndexPath / TableIndexSnapshotPath) during snapshot persistence or load. The path helpers validate that identifiers (db, table, snapshot sequence) are well-formed before constructing the object-store key. It surfaces from the persister whenever an invalid or malformed path component is used to address snapshot/table-index files.","triggerScenarios":"Calling Persister methods (persist snapshot, load snapshot, write/load table index) where the path constructor crate::paths::* receives an identifier or parsed filename component that fails PathError validation, e.g. an empty table name or a snapshot path whose sequence-number component cannot be parsed.","commonSituations":"Manually renaming or crafting snapshot files in the object store bucket with non-canonical names; restoring data written by a different InfluxDB3 version whose filename layout changed; database/table names with characters that do not round-trip through the path encoding.","solutions":["Inspect the #[source] PathError to identify which path component failed validation","List the object store prefix and verify snapshot/index files follow the expected canonical naming scheme","Re-check the database and table identifiers being passed to the persister for emptiness or invalid characters","Delete or re-persist the offending snapshot files so paths are regenerated by the writer"],"exampleFix":"// before: manually renamed snapshot file\nsnapshots/0000012.json  // trailing content changed, name truncated\n// after\nsnapshots/0000012.persisted_snapshot.json  // canonical Persister snapshot filename","handlingStrategy":"validation","validationCode":"fn valid_path_component(s: &str) -> bool { !s.is_empty() && !s.contains('/') && s.chars().all(|c| c.is_ascii_alphanumeric() || c=='-' || c=='_') }\n// validate db/table names before handing them to persister APIs","typeGuard":"fn is_table_index_path_error(e: &PersisterError) -> Option<&crate::paths::PathError> {\n    if let PersisterError::TableIndexPathError(pe) = e { Some(pe) } else { None }\n}","tryCatchPattern":"match persister_result {\n    Err(PersisterError::TableIndexPathError(pe)) => log::error(\"bad path component: {pe}\"),\n    other => other?,\n}","preventionTips":["Never hand-rename or hand-craft snapshot objects in the object store","Use canonical path helpers (crate::paths) instead of building keys with format!","Validate db/table identifiers at ingestion time","Keep reader and writer on compatible InfluxDB3 versions"],"tags":["object-store","path-parsing","persistence","rust"],"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"}