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

  1. Read the inner object_store::Error message to identify the failing operation and source (403/404/timeout etc.).
  2. Verify object-store configuration (bucket, endpoint, region, credentials) and that the bucket exists and is writable.
  3. For the local backend, check the data directory exists and the process has write permissions and free disk space.
  4. 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

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


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)