influxdata/influxdb · error · ProtoV1ParquetFileError

Error converting partition_hash_id

Error message

Error converting partition_hash_id: {0}

What it means

ProtoV1ParquetFileError::PartitionHashId is raised when converting a catalog proto v1 ParquetFile to the native ParquetFile type and its partition hash id fails to parse into a valid PartitionHashId (via PartitionHashIdError).

Solutions

  1. Fix the partition_hash_id value in the stored proto so it is a valid hash id
  2. Regenerate/re-write the ParquetFile record from source data with a correctly computed partition hash
  3. Verify the writer and reader use the same PartitionHashId format/version

Example fix

// before (proto)
partition_hash_id: "zz-not-hex"
// after
partition_hash_id: "3f2a9c1e4b7d" // valid hash id
Defensive patterns

Strategy: validation

Validate before calling

fn partition_hash_id_ok(s: &str) -> bool {
    !s.is_empty() && s.chars().all(|c| c.is_ascii_hexdigit())
}

Try / catch

let pf = ParquetFile::try_from(proto).map_err(|e| match e {
    ProtoV1ParquetFileError::PartitionHashId(src) => anyhow!("bad partition hash id: {}", src),
    other => anyhow!(other),
})?;

Prevention

When it happens

Trigger: Converting a v1 ParquetFile proto whose partition_hash_id string is malformed (wrong length, non-hex characters, empty) during catalog deserialization.

Common situations: Corrupted or truncated catalog records; protos written by incompatible versions using a different hash-id format; manual data migration copying ids incorrectly.

Understand the failure class

Background: "invalid id" errors: invalid identifier format — why libraries reject IDs before lookup, and how to fix them — this error's family across 37 libraries.

Related errors


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

Appendix: source

Thrown at core/data_types/src/lib.rs:1261

            min_time: v.min_time.get(),
            max_time: v.max_time.get(),
            to_delete: v.to_delete.map(|v| v.get()),
            file_size_bytes: v.file_size_bytes,
            row_count: v.row_count,
            compaction_level: v.compaction_level as i32,
            created_at: v.created_at.get(),
            column_set: v.column_set.iter().map(|v| v.get()).collect(),
            max_l0_created_at: v.max_l0_created_at.get(),
            source: ParquetFileSource::to_proto(v.source),
        }
    }
}

/// Errors converting from a catalog proto v1 ParquetFile to [`ParquetFile`].
#[derive(Debug, Error)]
pub enum ProtoV1ParquetFileError {
    /// invalid partition hash id
    #[error("Error converting partition_hash_id: {0}")]
    PartitionHashId(#[from] PartitionHashIdError),

    /// invalid object store it
    #[error("Error converting object_store_id: {0}")]
    ObjectStoreId(#[from] uuid::Error),

    /// invalid compaction level
    #[error("Error converting compaction level")]
    CompactionLevel,
}

impl TryFrom<catalog_proto::ParquetFile> for ParquetFile {
    type Error = ProtoV1ParquetFileError;

    fn try_from(v: catalog_proto::ParquetFile) -> Result<Self, Self::Error> {
        Ok(Self {
            id: ParquetFileId::new(v.id),
            namespace_id: NamespaceId::new(v.namespace_id),

View on GitHub (pinned to 06200ef96b)