{"record":{"id":"53a0ad265bb0316c","repo":"influxdata/influxdb","slug":"failed-to-put-initial-table-index-conversion-marker-to","errorCode":null,"errorMessage":"Failed to put initial table index conversion marker to object store","messagePattern":"Failed to put initial table index conversion marker to object store","errorType":"exception","errorClass":"TableIndexCacheError","httpStatus":null,"severity":"error","filePath":"influxdb3_write/src/table_index_cache.rs","lineNumber":87,"sourceCode":"    #[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\")]\n    UpdateTableIndexFromObjectStoreError(#[source] crate::table_index::TableIndexError),\n\n    #[error(\"Failed to create table index from object store\")]\n    CreateTableIndexFromObjectStoreError(#[source] crate::table_index::TableIndexError),\n\n    #[error(\"Failed to delete parquet file {path} from object store\")]","sourceCodeStart":69,"sourceCodeEnd":105,"githubUrl":"https://github.com/influxdata/influxdb/blob/06200ef96ba82c5f6727e5038a83af8e722c6875/influxdb3_write/src/table_index_cache.rs#L69-L105","documentation":"TableIndexCacheError::PutConversionMarkerError, thrown when writing (Put) the initial table index conversion marker to the object store fails. The marker must persist before the cache treats conversion as complete, so a failed put blocks index initialization for that database.","triggerScenarios":"During first-time marker creation, the cache serializes the marker then calls ObjectStore::put on the marker path; any provider-level put failure (permissions, throttling, network, size limits) surfaces here wrapped in object_store::Error.","commonSituations":"Read-only credentials or missing s3:PutObject/gcs storage.objects.create permission; bucket lifecycle/retention policies blocking writes; provider throttling (429/503) during startup bursts; network outage to the store endpoint.","solutions":["Grant write permission for the configured credentials on the bucket/container (e.g. s3:PutObject)","Retry with backoff — startup bursts often hit provider throttling","Check bucket retention/WORM policies and any deny rules preventing new object creation","Inspect the wrapped object_store::Error source for the provider status code to pinpoint the cause"],"exampleFix":"// before: single put, fatal on failure\nstore.put(&marker_path, payload.into()).await?;\n// after: bounded retry\nretry_backoff(5, || async {\n    store.put(&marker_path, payload.clone().into()).await\n}).await.map_err(TableIndexCacheError::from)?;","handlingStrategy":"retry","validationCode":"// preflight: verify write access before initialization\nlet probe = ObjPath::from(\".write_probe\");\nstore.put(&probe, b\"ok\".to_vec().into()).await?;\nstore.delete(&probe).await?;","typeGuard":null,"tryCatchPattern":"match err {\n    TableIndexCacheError::PutConversionMarkerError(e)\n        if e.is_transient() => retry_with_backoff(5, op).await?,\n    TableIndexCacheError::PutConversionMarkerError(e) => {\n        error!(source=?e, \"marker put failed — check write permissions/retention policy\");\n        return Err(e.into());\n    }\n    _ => unreachable!(),\n}","preventionTips":["Grant the service account explicit write permissions (s3:PutObject / GCS create)","Check bucket retention, WORM, and object-lock policies before deployment","Use idempotent retry with backoff for puts during startup bursts","Run a write-probe health check before serving traffic"],"tags":["object-store","network","permissions","influxdb3"],"backgroundTag":"database-write-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"}