{"record":{"id":"38cc3d3e588f5fb6","repo":"influxdata/influxdb","slug":"failed-to-list-table-index-snapshots-from-object-store-cache","errorCode":null,"errorMessage":"Failed to list table index snapshots from object store","messagePattern":"Failed to list table index snapshots from object store","errorType":"exception","errorClass":"TableIndexCacheError","httpStatus":null,"severity":"error","filePath":"influxdb3_write/src/table_index_cache.rs","lineNumber":69,"sourceCode":"    #[error(\"Object meta is missing filename\")]\n    MissingFilename,\n\n    #[error(\"Failed to parse snapshot sequence number from filename\")]\n    InvalidSnapshotSequenceNumber,\n\n    #[error(\"Unexpected error\")]\n    Unexpected(#[source] anyhow::Error),\n\n    #[error(\"Table snapshot persistence task failed\")]\n    TableSnapshotPersistenceTaskFailed(#[source] tokio::task::JoinError),\n\n    #[error(\"Failed to list table indices from object store\")]\n    ListIndices(#[source] object_store::Error),\n\n    #[error(\"Failed to parse table index path from object store path\")]\n    TableIndexPath(#[source] crate::paths::PathError),\n\n    #[error(\"Failed to list table index snapshots from object store\")]\n    ListSnapshots(#[source] object_store::Error),\n\n    #[error(\"Failed to parse table index snapshot path from object store path\")]\n    TableIndexSnapshotPath(#[source] crate::paths::PathError),\n\n    #[error(\"Failed to update table index: join task failed\")]\n    UpdateTaskFailed(#[source] tokio::task::JoinError),\n\n    #[error(\"Failed to list object store metadata\")]\n    ListMetasError(#[source] object_store::Error),\n\n    #[error(\"Failed to load table index conversion marker bytes from object store\")]\n    LoadConversionMarkerBytesError(#[source] object_store::Error),\n\n    #[error(\"Failed to serialize initial table index conversion marker\")]\n    SerializeConversionMarkerError(#[source] serde_json::Error),\n\n    #[error(\"Failed to put initial table index conversion marker to object store\")]","sourceCodeStart":51,"sourceCodeEnd":87,"githubUrl":"https://github.com/influxdata/influxdb/blob/06200ef96ba82c5f6727e5038a83af8e722c6875/influxdb3_write/src/table_index_cache.rs#L51-L87","documentation":"TableIndexCacheError::ListSnapshots, thrown when an object_store List call fails while enumerating table index snapshot objects under a table index prefix. The cache must list snapshots to hydrate a TableIndex; if the underlying store returns an error (network, auth, throttling), listing aborts with this variant.","triggerScenarios":"Calling code that builds/refreshes a TableIndex from the object store: listing objects under the table-index snapshot prefix (e.g. while populating the LRU cache on a cache miss or during startup recovery) when the object_store::ObjectStore::list stream yields an error.","commonSituations":"S3/GCS/Azure transient 5xx or throttling during startup; wrong bucket/container credentials; region misconfiguration; bucket deleted or renamed; network partition between the InfluxDB 3 node and the object store.","solutions":["Retry the operation — object store list failures are frequently transient; the RetryableObjectStore wrapper used here helps but does not eliminate all failures","Verify object store credentials, endpoint, region, and bucket/container name in the configuration","Check network connectivity and DNS from the node to the object store endpoint","Inspect the inner object_store::Error via #[source] for the exact provider error code (e.g. NoSuchBucket, AccessDenied)"],"exampleFix":"// before: single attempt\nlet snapshots = cache.list_snapshots(&index_path).await?;\n// after: bounded retry for transient store errors\nlet snapshots = retry_with_backoff(3, Duration::from_millis(200), ||\n    cache.list_snapshots(&index_path)\n).await.map_err(|e| warn!(error=?e, \"listing index snapshots failed\"))?;","handlingStrategy":"retry","validationCode":"// preflight: verify store reachability and credentials\nstore.head(&ObjPath::from(\"healthcheck\")).await\n    .map_err(|e| format!(\"object store unavailable: {e}\"))?;","typeGuard":null,"tryCatchPattern":"match err {\n    TableIndexCacheError::ListSnapshots(e)\n        if e.is_transient() => retry_with_backoff(3, op).await?,\n    TableIndexCacheError::ListSnapshots(e) => {\n        error!(source=?e, \"permanent list failure — check credentials/bucket\");\n        return Err(e.into());\n    }\n    _ => unreachable!(),\n}","preventionTips":["Use retrying/rotating cloud credentials and refresh them before expiry","Enable a RetryableObjectStore or client-level retry policy","Monitor object store 5xx/429 rates and set alerts","Validate bucket/region config in a startup health check"],"tags":["object-store","network","influxdb3"],"backgroundTag":"api-request-failed","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"}