influxdata/influxdb · error · TableIndexCacheError
Failed to create table index from object store
Error message
Failed to create table index from object store
What it means
TableIndexCacheError::CreateTableIndexFromObjectStoreError is thrown when constructing a brand-new TableIndex from object-store snapshot data fails. Like its siblings it wraps a crate::table_index::TableIndexError via #[source]. This is the cold-start path: no cached index existed, so one had to be built from persisted snapshots and that build failed.
Solutions
- Check the wrapped #[source] TableIndexError for object-not-found vs permission vs parse failures.
- Verify the object store bucket/prefix configuration matches where snapshots were written.
- Ensure bucket IAM credentials grant read access to snapshot objects.
- If no snapshots exist for a legitimately empty database, bootstrap an empty index instead of treating this as fatal.
Example fix
// before
let idx = cache.get_or_create_index(db, table).await?;
// after: diagnose source before failing
let idx = cache.get_or_create_index(db, table).await
.map_err(|e| { log::error!("create index failed: {e}; source={:?}", e.source()); e })?; Defensive patterns
Strategy: try-catch
Validate before calling
// Rust: verify the database snapshot prefix exists before cold create
let list = object_store.list(Some(&db_snapshot_prefix)).next().await;
match list {
None => log::warn!("no snapshots under prefix; expect empty index"),
Some(Err(e)) => return Err(e.into()),
_ => {}
} Type guard
fn is_create_index_err(e: &TableIndexCacheError) -> bool {
matches!(e, TableIndexCacheError::CreateTableIndexFromObjectStoreError(_))
} Try / catch
match cache.get_or_create_index(db, table).await {
Err(TableIndexCacheError::CreateTableIndexFromObjectStoreError(src)) => {
if is_object_not_found(&src) { bootstrap_empty_index(db, table).await } else { Err(src.into()) }
}
other => other,
} Prevention
- Verify bucket/prefix config once at deploy time with a smoke read.
- Grant the node's IAM identity read access to the snapshot prefix.
- Avoid sharing the InfluxDB bucket with unrelated workloads.
- Bootstrap empty databases explicitly so cold misses are expected states.
When it happens
Trigger: First access to a database/table index in the TableIndexCache (cache miss) where building the index from object-store snapshots returns a TableIndexError — snapshot objects missing/unreadable, deserialization failure, or store error.
Common situations: Fresh node or restarted server bootstrapping its cache against an empty/partial bucket; bucket region or prefix misconfiguration pointing at the wrong snapshot location; snapshots deleted by retention/GC while still referenced; permissions on the bucket denying reads.
Related errors
- Failed to delete table index
- Failed to load table index from object store
- Failed to update table index from object store
- Failed to delete parquet file
- Failed to list object store metadata
AI-assisted analysis of influxdata/influxdb@06200ef96b (2026-09-19).
Data as JSON: /api/errors/6b68846b2c80c953.
Report an issue: GitHub.
Appendix: source
Thrown at influxdb3_write/src/table_index_cache.rs:102
#[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]
source: object_store::Error,
},
#[error("Failed to delete table index {table_id} from object store")]
DeleteTableIndex {
table_id: TableIndexId,
#[source]
source: object_store::Error,
},
}
pub type Result<T> = std::result::Result<T, TableIndexCacheError>;View on GitHub (pinned to 06200ef96b)