influxdata/influxdb · error · TableIndexCacheError

Failed to load table index conversion marker bytes from…

Error message

Failed to load table index conversion marker bytes from object store

What it means

TableIndexCacheError::LoadConversionMarkerBytesError, thrown when a Get on the object store fails while fetching the bytes of the table index conversion marker file (the marker recording that table index conversion completed). Note a NotFound here means the marker was expected to exist; absence of the marker otherwise triggers creation of an initial marker, so this variant reflects genuine get failures.

Solutions

  1. Retry the get with backoff; transient store errors are the most common cause
  2. Check whether a cleanup/lifecycle rule or script deletes objects in the marker directory concurrently, and exclude the marker from such jobs
  3. Verify credentials and read permissions on the bucket/container
  4. Use a consistent provider (or versioned bucket) if list/get races against concurrent writers are suspected

Example fix

// before: treat every get error as fatal
let bytes = store.get(&marker_path).await?.bytes().await?;
// after: tolerate NotFound, retry transient errors
match store.get(&marker_path).await {
    Ok(r) => Some(r.bytes().await?),
    Err(e) if matches!(e, object_store::Error::NotFound{..}) => None,
    Err(e) => return retry_backoff(3, || store.get(&marker_path)).await.map_err(Into::into),
}
Defensive patterns

Strategy: retry

Validate before calling

// only attempt the get if the marker was listed (avoid races)
let exists = store.list(Some(&marker_dir))
    .any(|m| futures::future::ready(m.as_ref().map(|m| m.location == marker).unwrap_or(false)));

Try / catch

match err {
    TableIndexCacheError::LoadConversionMarkerBytesError(e)
        if matches!(e, object_store::Error::NotFound{..}) =>
            create_initial_marker().await?, // treated as absent
    TableIndexCacheError::LoadConversionMarkerBytesError(e) =>
        retry_with_backoff(3, || store.get(&marker)).await??,
    _ => unreachable!(),
}

Prevention

When it happens

Trigger: During cache/table-index initialization, the code checks for the conversion marker by listing, then loads its bytes with ObjectStore::get; a get that errors (as opposed to returning NotFound, which is handled by writing an initial marker) produces this variant.

Common situations: Auth/permission failures on get (403); throttling (429/503); the marker deleted concurrently by another process between list and get (racy cleanup script); network interruption mid-request.

Understand the failure class

Background: "API request failed": what wrapped HTTP errors from external APIs mean and how to find the real cause — this error's family across 29 libraries.

Related errors


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

Appendix: source

Thrown at influxdb3_write/src/table_index_cache.rs:81

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

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

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

    #[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("Failed to list object store metadata")]
    ListMetasError(#[source] object_store::Error),

    #[error("Failed to load table index conversion marker bytes from object store")]
    LoadConversionMarkerBytesError(#[source] object_store::Error),

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

View on GitHub (pinned to 06200ef96b)