{"record":{"id":"850da7385cbc48fa","repo":"influxdata/influxdb","slug":"failed-to-persist-table-index-to-object-store","errorCode":null,"errorMessage":"Failed to persist table index to object store","messagePattern":"Failed to persist table index to object store","errorType":"error_code","errorClass":"TableIndexError","httpStatus":null,"severity":"error","filePath":"influxdb3_write/src/table_index.rs","lineNumber":43,"sourceCode":"    #[error(\"Failed to deserialize table index\")]\n    SerializeIndex(#[source] serde_json::Error),\n\n    #[error(\"Failed to deserialize table index\")]\n    DeserializeIndex(#[source] serde_json::Error),\n\n    #[error(\"Failed to list table index snapshots from object store\")]\n    ListSnapshots(#[source] object_store::Error),\n\n    #[error(\"Failed to list table indices from object store\")]\n    ListIndices(#[source] object_store::Error),\n\n    #[error(\"Failed to load table index snapshot from object store\")]\n    LoadSnapshot(#[source] object_store::Error),\n\n    #[error(\"Failed to deserialize table index snapshot\")]\n    DeserializeSnapshot(#[source] serde_json::Error),\n\n    #[error(\"Failed to persist table index to object store\")]\n    PersistIndex(#[source] object_store::Error),\n\n    #[error(\"Failed to delete table index snapshot from object store\")]\n    DeleteSnapshot(#[source] object_store::Error),\n\n    #[error(\"Cannot merge table indices with mismatched identifiers: {expected} != {actual}\")]\n    MergeMismatch {\n        expected: TableIndexId,\n        actual: TableIndexId,\n    },\n\n    #[error(\"Failed to parse table index path from object store path\")]\n    TableIndexPath(#[source] crate::paths::PathError),\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\")]","sourceCodeStart":25,"sourceCodeEnd":61,"githubUrl":"https://github.com/influxdata/influxdb/blob/06200ef96ba82c5f6727e5038a83af8e722c6875/influxdb3_write/src/table_index.rs#L25-L61","documentation":"TableIndexError::PersistIndex is raised when writing a table index object to the configured object store (S3, GCS, Azure, local file store) fails. The table index is an incremental per-database/table index persisted alongside snapshots; if the underlying object_store::Error (from a put/write operation) bubbles up, this variant wraps it. It indicates the index could not be durably written, so the index may be stale or missing for that table.","triggerScenarios":"Calling the table index update/snapshotting code path that issues an object_store put (e.g. ObjectStore::put/put_multipart for a TableIndexPath object) and the store returns a network, permission, throttling, or bucket-missing error.","commonSituations":"Object store credentials lack PutObject/put permission on the bucket; transient network outage or S3 503/timeout; bucket misconfigured or deleted; object store size/quota limits hit; local file store path unwritable in dev environments.","solutions":["Inspect the wrapped #[source] object_store::Error to identify the root cause (auth, throttling, connectivity).","Verify the object store credentials/IAM policy allow writes (PutObject, CompleteMultipartUpload) on the target bucket.","Check network/proxy connectivity to the storage endpoint and retry; wrap writes with the RetryableObjectStore already used in the codebase.","Confirm the bucket/container exists and the configured URL/prefix is correct.","Check for storage quota or size-limit errors and free space or adjust limits."],"exampleFix":"// before: unguarded persist\nindex_cache.persist_to_object_store(&store).await?;\n// after: retry transient failures and log the source\nmatch index_cache.persist_to_object_store(&store).await {\n    Err(TableIndexError::PersistIndex(e)) if e.is_retryable() => {\n        retry_with_backoff(|| index_cache.persist_to_object_store(&store).await).await?\n    }\n    other => other?,\n}","handlingStrategy":"retry","validationCode":"// before writes, verify store writability\nlet probe = object_store::path::Path::from(\"_healthcheck/probe\");\nstore.put(&probe, Bytes::from_static(b\"ok\")).await?;\nstore.delete(&probe).await?;","typeGuard":null,"tryCatchPattern":"match err {\n    TableIndexError::PersistIndex(e) if e.is_retryable() => retry_with_backoff(...).await,\n    TableIndexError::PersistIndex(e) => fail_fast_with_source(e),\n    other => return other,\n}","preventionTips":["Provision IAM with PutObject/multipart permissions before deployment.","Use RetryableObjectStore (as this crate does) for transient faults.","Monitor object store error rates and bucket health.","Pin and validate the object store URL/prefix in configuration at startup."],"tags":["object-store","persistence","io","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"}