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

  1. Check the wrapped #[source] TableIndexError for object-not-found vs permission vs parse failures.
  2. Verify the object store bucket/prefix configuration matches where snapshots were written.
  3. Ensure bucket IAM credentials grant read access to snapshot objects.
  4. 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

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


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)