influxdata/influxdb · critical · PersisterError
object_store error
Error message
object_store error: {0} What it means
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]`.
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.
Example fix
// before: missing region in object store config
let store = AmazonS3Builder::new().with_bucket_name("db").build()?;
// after: supply region and credentials
let store = AmazonS3Builder::new()
.with_bucket_name("db")
.with_region("us-east-1")
.with_access_key_id(key)
.with_secret_access_key(secret)
.build()?; Defensive patterns
Strategy: retry
Validate before calling
// preflight: ensure bucket/dir is reachable before writes
store.head(&object_store::path::Path::from("healthcheck")).await?; Type guard
fn is_object_store_error(e: &PersisterError) -> bool {
matches!(e, PersisterError::ObjectStore(_))
} Try / catch
match persister.persist(...).await {
Err(PersisterError::ObjectStore(e)) if is_transient(&e) => retry_with_backoff(|| persister.persist(...)).await,
Err(PersisterError::ObjectStore(e)) => eprintln!("storage misconfig: {e}"),
Err(e) => return Err(e.into()),
Ok(v) => v,
} Prevention
- 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.
When it happens
Trigger: 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.
Common situations: 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.
Understand the failure class
Background: "failed to write file", "Could not save figure", "Error saving remote file" — file write failed: causes and fixes across languages and libraries — this error's family across 38 libraries.
Related errors
- object store error
- Object store operation failed
- Object store operation failed
- Operation with object store failed
- another process has written to the WAL ahead of this one
AI-assisted analysis of influxdata/influxdb@06200ef96b (2026-09-19).
Data as JSON: /api/errors/07022361687bcec7.
Report an issue: GitHub.
Appendix: source
Thrown at influxdb3_write/src/persister.rs:56
use object_store::{ObjectMeta, ObjectStore};
use object_store_utils::{AdaptiveGetExt, AdaptivePutExt};
use observability_deps::tracing::{debug, error, info, trace, warn};
use parking_lot::RwLock;
use parquet::arrow::ArrowWriter;
use parquet::basic::Compression;
use parquet::file::metadata::ParquetMetaData;
use parquet::file::properties::WriterProperties;
use tokio::sync::Semaphore;
#[derive(Debug, thiserror::Error)]
pub enum PersisterError {
#[error("datafusion error: {0}")]
DataFusion(#[from] DataFusionError),
#[error("serde_json error: {0}")]
SerdeJson(#[from] serde_json::Error),
#[error("object_store error: {0}")]
ObjectStore(#[from] object_store::Error),
#[error("parquet error: {0}")]
ParquetError(#[from] parquet::errors::ParquetError),
#[error("tried to serialize a parquet file with no rows")]
NoRows,
#[error("parse int error: {0}")]
ParseInt(#[from] std::num::ParseIntError),
#[error("unexpected persister error: {0:?}")]
Unexpected(#[from] anyhow::Error),
#[error("table snapshot persistence task panicked: {0}")]
TableSnapshotPersistenceTaskFailed(#[source] tokio::task::JoinError),
#[error("snapshot manifest parse task panicked: {0}")]View on GitHub (pinned to 06200ef96b)