{"record":{"id":"07022361687bcec7","repo":"influxdata/influxdb","slug":"object-store-error-0-persister","errorCode":null,"errorMessage":"object_store error: {0}","messagePattern":"object_store error: (.+?)","errorType":"error_code","errorClass":"PersisterError","httpStatus":null,"severity":"critical","filePath":"influxdb3_write/src/persister.rs","lineNumber":56,"sourceCode":"use object_store::{ObjectMeta, ObjectStore};\nuse object_store_utils::{AdaptiveGetExt, AdaptivePutExt};\nuse observability_deps::tracing::{debug, error, info, trace, warn};\nuse parking_lot::RwLock;\nuse parquet::arrow::ArrowWriter;\nuse parquet::basic::Compression;\nuse parquet::file::metadata::ParquetMetaData;\nuse parquet::file::properties::WriterProperties;\nuse tokio::sync::Semaphore;\n\n#[derive(Debug, thiserror::Error)]\npub enum PersisterError {\n    #[error(\"datafusion error: {0}\")]\n    DataFusion(#[from] DataFusionError),\n\n    #[error(\"serde_json error: {0}\")]\n    SerdeJson(#[from] serde_json::Error),\n\n    #[error(\"object_store error: {0}\")]\n    ObjectStore(#[from] object_store::Error),\n\n    #[error(\"parquet error: {0}\")]\n    ParquetError(#[from] parquet::errors::ParquetError),\n\n    #[error(\"tried to serialize a parquet file with no rows\")]\n    NoRows,\n\n    #[error(\"parse int error: {0}\")]\n    ParseInt(#[from] std::num::ParseIntError),\n\n    #[error(\"unexpected persister error: {0:?}\")]\n    Unexpected(#[from] anyhow::Error),\n\n    #[error(\"table snapshot persistence task panicked: {0}\")]\n    TableSnapshotPersistenceTaskFailed(#[source] tokio::task::JoinError),\n\n    #[error(\"snapshot manifest parse task panicked: {0}\")]","sourceCodeStart":38,"sourceCodeEnd":74,"githubUrl":"https://github.com/influxdata/influxdb/blob/06200ef96ba82c5f6727e5038a83af8e722c6875/influxdb3_write/src/persister.rs#L38-L74","documentation":"PersisterError::ObjectStore wraps an object_store::Error from any operation against the configured object store (local file system, S3, etc.). All `Put`, `Get`, `List`, `Delete` failures inside the Persister propagate here via `#[from]`.","triggerScenarios":"Persisting parquet files or JSON documents via Persister when the object store operation fails: bucket/region misconfiguration, missing credentials, network failure, wrong path, or the local data directory being unavailable.","commonSituations":"Wrong AWS credentials or IAM permissions on the S3 bucket; incorrect endpoint/region config; disk full or permission denied for the local file-store backend; transient network outages during writes.","solutions":["Read the inner object_store::Error message to identify the failing operation and source (403/404/timeout etc.).","Verify object-store configuration (bucket, endpoint, region, credentials) and that the bucket exists and is writable.","For the local backend, check the data directory exists and the process has write permissions and free disk space.","Retry transient network failures; check connectivity/proxy settings for remote stores."],"exampleFix":"// before: missing region in object store config\nlet store = AmazonS3Builder::new().with_bucket_name(\"db\").build()?;\n// after: supply region and credentials\nlet store = AmazonS3Builder::new()\n    .with_bucket_name(\"db\")\n    .with_region(\"us-east-1\")\n    .with_access_key_id(key)\n    .with_secret_access_key(secret)\n    .build()?;","handlingStrategy":"retry","validationCode":"// preflight: ensure bucket/dir is reachable before writes\nstore.head(&object_store::path::Path::from(\"healthcheck\")).await?;","typeGuard":"fn is_object_store_error(e: &PersisterError) -> bool {\n    matches!(e, PersisterError::ObjectStore(_))\n}","tryCatchPattern":"match persister.persist(...).await {\n    Err(PersisterError::ObjectStore(e)) if is_transient(&e) => retry_with_backoff(|| persister.persist(...)).await,\n    Err(PersisterError::ObjectStore(e)) => eprintln!(\"storage misconfig: {e}\"),\n    Err(e) => return Err(e.into()),\n    Ok(v) => v,\n}","preventionTips":["Validate object-store config (bucket, region, endpoint, credentials) at startup with a probe call.","Monitor disk space for the local file backend.","Wrap remote-store writes with bounded exponential backoff retry.","Least-privilege IAM policy covering put/get/list/delete on the bucket prefix."],"tags":["object-store","storage","s3","network","rust","wrapper-error"],"backgroundTag":"file-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"}