influxdata/influxdb · error · PersisterError

object meta is missing filename

Error message

object meta is missing filename

What it means

PersisterError::MissingFilename is thrown when an ObjectMeta returned by the object store listing API has no file name in its Location. During snapshot enumeration the persister relies on the object's filename to extract metadata (e.g. snapshot sequence numbers), so a nameless location is treated as unusable. This indicates a listing result that does not conform to the expected object-store key layout.

Solutions

  1. Inspect the listed object-store prefix for keys that lack a filename segment (trailing or malformed keys)
  2. Remove or rewrite non-conforming keys so every object has a canonical filename
  3. Upgrade the object_store crate / backend if listing is returning malformed Location values
  4. Check that the configured bucket/prefix is dedicated to InfluxDB3 snapshots and not shared with other data

Example fix

// before: mixing other data into the snapshot prefix
snapshots/some/other/data
// after: only canonical snapshot objects under the prefix
snapshots/0000012.persisted_snapshot.json
Defensive patterns

Strategy: type-guard

Validate before calling

// after listing, verify every object has a usable filename
for obj in list_result {
    if obj.location.filename().is_none() { /* quarantine/delete key */ }
}

Type guard

fn has_filename(meta: &object_store::ObjectMeta) -> bool {
    meta.location.filename().is_some()
}

Try / catch

match res {
    Err(PersisterError::MissingFilename) => {
        log::warn("skipping object without filename in snapshot listing");
        continue;
    }
    other => other?,
}

Prevention

When it happens

Trigger: Iterating ListResult entries from the object store while scanning snapshot prefixes, where entry.location.filename() returns None and the code maps that to MissingFilename before parsing snapshot metadata.

Common situations: Using an in-memory or test object store configured with unusual key formats; listing a prefix that contains directory-like keys without filenames; object-store backend quirks producing locations the filename() helper cannot split.

Related errors


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

Appendix: source

Thrown at influxdb3_write/src/persister.rs:80

    #[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}")]
    SnapshotParseTaskFailed(#[source] tokio::task::JoinError),

    #[error("table index error: {0}")]
    TableIndexPathError(#[source] crate::paths::PathError),

    #[error("object meta is missing filename")]
    MissingFilename,

    #[error("failed to parse snapshot sequence number from filename")]
    InvalidSnapshotSequenceNumber,
}

impl From<PersisterError> for DataFusionError {
    fn from(error: PersisterError) -> Self {
        match error {
            PersisterError::DataFusion(e) => e,
            PersisterError::ObjectStore(e) => DataFusionError::ObjectStore(Box::new(e)),
            PersisterError::ParquetError(e) => DataFusionError::ParquetError(Box::new(e)),
            _ => DataFusionError::External(Box::new(error)),
        }
    }
}

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

View on GitHub (pinned to 06200ef96b)