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
- Inspect the listed object-store prefix for keys that lack a filename segment (trailing or malformed keys)
- Remove or rewrite non-conforming keys so every object has a canonical filename
- Upgrade the object_store crate / backend if listing is returning malformed Location values
- 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
- Keep dedicated prefixes for InfluxDB3 snapshot data
- Avoid directory-like keys without filenames in snapshot prefixes
- Use standard object-store SDKs that produce well-formed Locations
- Audit bucket contents before pointing a writer at it
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
- error from persister
- Failed to list table index snapshots from object store
- Failed to list table indices from object store
- Failed to list table indices from object store
- failed to parse snapshot sequence number from filename
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)