{"record":{"id":"f36a9f735fb6d510","repo":"influxdata/influxdb","slug":"failed-to-load-table-index-conversion-marker-bytes-from","errorCode":null,"errorMessage":"Failed to load table index conversion marker bytes from object store","messagePattern":"Failed to load table index conversion marker bytes from object store","errorType":"exception","errorClass":"TableIndexCacheError","httpStatus":null,"severity":"error","filePath":"influxdb3_write/src/table_index_cache.rs","lineNumber":81,"sourceCode":"    #[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\")]\n    PutConversionMarkerError(#[source] object_store::Error),\n\n    #[error(\"Failed to parse snapshot info file path\")]\n    ParseSnapshotPathError(#[source] anyhow::Error),\n\n    #[error(\"Failed to split persisted snapshot into table snapshots\")]\n    SplitPersistedSnapshotError(#[source] crate::table_index::TableIndexError),\n\n    #[error(\"Failed to load table index from object store\")]\n    LoadTableIndexFromObjectStoreError(#[source] crate::table_index::TableIndexError),\n\n    #[error(\"Failed to update table index from object store\")]","sourceCodeStart":63,"sourceCodeEnd":99,"githubUrl":"https://github.com/influxdata/influxdb/blob/06200ef96ba82c5f6727e5038a83af8e722c6875/influxdb3_write/src/table_index_cache.rs#L63-L99","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Retry the get with backoff; transient store errors are the most common cause","Check whether a cleanup/lifecycle rule or script deletes objects in the marker directory concurrently, and exclude the marker from such jobs","Verify credentials and read permissions on the bucket/container","Use a consistent provider (or versioned bucket) if list/get races against concurrent writers are suspected"],"exampleFix":"// before: treat every get error as fatal\nlet bytes = store.get(&marker_path).await?.bytes().await?;\n// after: tolerate NotFound, retry transient errors\nmatch store.get(&marker_path).await {\n    Ok(r) => Some(r.bytes().await?),\n    Err(e) if matches!(e, object_store::Error::NotFound{..}) => None,\n    Err(e) => return retry_backoff(3, || store.get(&marker_path)).await.map_err(Into::into),\n}","handlingStrategy":"retry","validationCode":"// only attempt the get if the marker was listed (avoid races)\nlet exists = store.list(Some(&marker_dir))\n    .any(|m| futures::future::ready(m.as_ref().map(|m| m.location == marker).unwrap_or(false)));\n","typeGuard":null,"tryCatchPattern":"match err {\n    TableIndexCacheError::LoadConversionMarkerBytesError(e)\n        if matches!(e, object_store::Error::NotFound{..}) =>\n            create_initial_marker().await?, // treated as absent\n    TableIndexCacheError::LoadConversionMarkerBytesError(e) =>\n        retry_with_backoff(3, || store.get(&marker)).await??,\n    _ => unreachable!(),\n}","preventionTips":["Exclude the marker path from lifecycle/cleanup policies","Use a strongly consistent store or conditional gets to avoid list/get races","Retry get operations with jittered backoff","Never hand-edit or delete marker objects in production buckets"],"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"}