{"record":{"id":"0916c255c00b241f","repo":"influxdata/influxdb","slug":"failed-to-load-table-index-snapshot-from-object-store","errorCode":null,"errorMessage":"Failed to load table index snapshot from object store","messagePattern":"Failed to load table index snapshot from object store","errorType":"error_code","errorClass":"TableIndexError","httpStatus":null,"severity":"error","filePath":"influxdb3_write/src/table_index.rs","lineNumber":37,"sourceCode":"\n#[derive(Debug, Error)]\npub enum TableIndexError {\n    #[error(\"Failed to load table index from object store\")]\n    LoadIndex(#[source] object_store::Error),\n\n    #[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\")]","sourceCodeStart":19,"sourceCodeEnd":55,"githubUrl":"https://github.com/influxdata/influxdb/blob/06200ef96ba82c5f6727e5038a83af8e722c6875/influxdb3_write/src/table_index.rs#L19-L55","documentation":"TableIndexError::LoadSnapshot wraps an object_store::Error returned when fetching (GET) a single table index snapshot object fails. While replaying a table's snapshot history, each snapshot object is fetched from its TableIndexSnapshotPath; a failed GET (NotFound, network, auth, throttling) is wrapped here with the source error attached.","triggerScenarios":"Calling the snapshot replay path that does a get(...).bytes() on a snapshot object and maps Err(e) => TableIndexError::LoadSnapshot(e) (table_index.rs:436); also the direct bytes() read failure on the fetched request result.","commonSituations":"A snapshot referenced by the index was manually deleted or expired by a lifecycle policy; S3 eventual consistency/cross-region replication lag; credentials can list but not GET objects.","solutions":["Check #[source] object_store::Error: if NotFound, the snapshot object is missing — repair or rebuild the index without it","Verify object-store credentials allow GET on the snapshot prefix","Check bucket lifecycle/expiration rules are not deleting snapshot objects prematurely","Retry with backoff for transient network/5xx errors; then fall back to rebuilding the index from persisted parquet snapshots"],"exampleFix":"// before: lifecycle rule deleting snapshot objects after 1 day\n{\"Rules\":[{\"Prefix\":\"snapshots/\",\"Expiration\":{\"Days\":1}}]}\n// after: keep snapshots at least as long as retention requires\n{\"Rules\":[{\"Prefix\":\"snapshots/\",\"Expiration\":{\"Days\":30}}]}","handlingStrategy":"retry","validationCode":"// ensure referenced snapshots exist before replay\nfor snap in index.snapshots() {\n    client.head(&snap.path()).await?; // NotFound here means repair needed\n}","typeGuard":"fn is_load_snapshot(e: &TableIndexError) -> bool {\n    matches!(e, TableIndexError::LoadSnapshot(_))\n}","tryCatchPattern":"match load_snapshot(path).await {\n    Err(e) if is_load_snapshot(&e) => {\n        if source_is_not_found(&e) { rebuild_index_without(path).await?; }\n        else { retry_with_backoff(load_snapshot(path), 3).await?; }\n    }\n    other => other?,\n}","preventionTips":["Align bucket lifecycle rules with snapshot retention needs","Never delete snapshot objects manually while a node is running","Grant GET permissions on the snapshot prefix","Add retry/backoff for transient GET failures"],"tags":["object-store","snapshot","table-index","io"],"backgroundTag":"file-read-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"}