influxdata/influxdb · error · TableIndexError

Failed to list table index snapshots from object store

Error message

Failed to list table index snapshots from object store

What it means

TableIndexError::ListSnapshots wraps an object_store::Error raised while listing the snapshot objects referenced by a table index. The code issues list() against the snapshot prefix and collects entries into a Vec; any listing failure (network, auth, throttling) is mapped to this variant. The source object_store::Error identifies the exact cause.

Solutions

  1. Check #[source] object_store::Error for the HTTP status and operation
  2. Verify the identity has list permission on the bucket/prefix (e.g. s3:ListBucket)
  3. Retry with backoff — list failures are frequently transient throttling
  4. Confirm the configured bucket/endpoint matches the environment that wrote the snapshots

Example fix

// before: IAM policy missing list rights
{"Effect":"Deny","Action":"s3:ListBucket","Resource":"arn:aws:s3:::mybucket"}
// after
{"Effect":"Allow","Action":"s3:ListBucket","Resource":"arn:aws:s3:::mybucket"}
Defensive patterns

Strategy: retry

Validate before calling

// pre-flight: confirm LIST permission on the snapshot prefix
client.list(Some(snapshot_prefix)).next().await.transpose()?;

Type guard

fn is_list_snapshots(e: &TableIndexError) -> bool {
    matches!(e, TableIndexError::ListSnapshots(_))
}

Try / catch

match list_result {
    Err(e) if is_list_snapshots(&e) => retry_with_backoff(list, 5),
    other => other?,
}

Prevention

When it happens

Trigger: Calling the table-index snapshot enumeration path that does .collect::<Result<Vec<_>, _>>() over the object store list stream and maps the error to ListSnapshots (table_index.rs:380).

Common situations: S3/Azure/GCS throttling or 5xx during list pagination; misconfigured credentials that pass auth for GET but fail LIST; wrong bucket or prefix permissions (s3:ListBucket denied).

Related errors


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

Appendix: source

Thrown at influxdb3_write/src/table_index.rs:31

use influxdb3_wal::SnapshotSequenceNumber;

use crate::{
    ParquetFile, PersistedSnapshot, PersistedSnapshotVersion,
    paths::{SnapshotInfoFilePath, TableIndexPath, TableIndexSnapshotPath},
};

#[derive(Debug, Error)]
pub enum TableIndexError {
    #[error("Failed to load table index from object store")]
    LoadIndex(#[source] object_store::Error),

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

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

    #[error("Failed to list table index snapshots from object store")]
    ListSnapshots(#[source] object_store::Error),

    #[error("Failed to list table indices from object store")]
    ListIndices(#[source] object_store::Error),

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

    #[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}")]

View on GitHub (pinned to 06200ef96b)