influxdata/influxdb · error · Error

object store path error

Error message

object store path error: {0}

What it means

This is the ObjStorePath variant of influxdb3_write::Error, thrown when an object_store::path::Error occurs while constructing or parsing an object-store path (e.g. a database/table/segment key in object storage). The library surfaces it because nearly all persistence goes through object-store paths, and an invalid path is a hard failure before any I/O happens. The original object_store error is preserved as the source.

Solutions

  1. Inspect the inner object_store::path::Error message to identify the offending path segment
  2. Sanitize/validate database and table names before writing (restrict to safe characters, trim slashes)
  3. Use object_store::path::Path::from or parse with error handling at the boundary instead of building strings ad hoc
  4. Check object_store version changelog for changed path validation rules

Example fix

// before
let path = format!("databases/{}/tables/{}", db_name, table_name); // may contain invalid chars
// after
let safe_db: String = db_name.chars().map(|c| if c.is_alphanumeric() || c=='_' || c=='-' { c } else { '_' }).collect();
let path = object_store::path::Path::from(format!("databases/{}/tables/{}", safe_db, table_name));
Defensive patterns

Strategy: validation

Validate before calling

fn validate_path_component(s: &str) -> Result<(), String> {
    if s.is_empty() || s.starts_with('/') || s.ends_with('/') || s.chars().any(|c| c.is_control()) {
        return Err(format!("invalid object-store path component: {:?}", s));
    }
    Ok(())
}

Type guard

fn is_safe_component(s: &str) -> bool {
    !s.is_empty() && s.chars().all(|c| c.is_alphanumeric() || c == '_' || c == '-')
}

Try / catch

match result {
    Err(e @ influxdb3_write::Error::ObjStorePath(p)) => {
        log::error!("object store path issue: {} (source: {})", e, p);
        // sanitize inputs and retry or abort
    }
    other => other?,
}

Prevention

When it happens

Trigger: Calling any write/persist API that builds an object-store Path (e.g. writing a parquet file, chunk key, or catalog entry) with a component containing characters object_store rejects, an empty path segment, or a path that fails `Path::from`/`Path::parse` validation.

Common situations: Database or table names with invalid characters (spaces, control chars, leading/trailing slashes) flowing into storage keys; migrating data with legacy names; tests constructing raw Path values; object_store version changes tightening path validation.

Understand the failure class

Background: "Invalid ... format", "must be in format X", "does not look like a ..." — invalid argument format errors across CLI tools and libraries — this error's family across 17 libraries.

Related errors


AI-assisted analysis of influxdata/influxdb@06200ef96b (2026-09-19). Data as JSON: /api/errors/7401deb4aced493c. Report an issue: GitHub.

Appendix: source

Thrown at influxdb3_write/src/lib.rs:48

use influxdb3_cache::{distinct_cache::DistinctCacheProvider, last_cache::LastCacheProvider};
use influxdb3_catalog::catalog::{
    Catalog, CatalogSequenceNumber, DatabaseSchema, INTERNAL_DB_NAME, TableDefinition,
};
use influxdb3_id::{DbId, ParquetFileId, SerdeVecMap, TableId};
use influxdb3_types::DatabaseName;
pub use influxdb3_types::write::Precision;
use influxdb3_wal::{SnapshotSequenceNumber, Wal, WalFileSequenceNumber};
use iox_query::QueryChunk;
use iox_time::Time;
use observability_deps::tracing::debug;
use schema::TIME_COLUMN_NAME;
use serde::{Deserialize, Serialize};
use std::{fmt::Debug, sync::Arc};
use thiserror::Error;

#[derive(Debug, Error)]
pub enum Error {
    #[error("object store path error: {0}")]
    ObjStorePath(#[from] object_store::path::Error),

    #[error("write buffer error: {0}")]
    WriteBuffer(#[from] write_buffer::Error),

    #[error("persister error: {0}")]
    Persister(#[from] persister::PersisterError),

    #[error("queries not supported in compactor only mode")]
    CompactorOnly,

    #[error("unexpected: {0:?}")]
    Anyhow(#[from] anyhow::Error),
}

pub type Result<T, E = Error> = std::result::Result<T, E>;

pub trait WriteBuffer: Bufferer + ChunkContainer + DistinctCacheManager + LastCacheManager {}

View on GitHub (pinned to 06200ef96b)