risingwavelabs/risingwave · error

Failed to decode prost: field not found `{}`

Error message

Failed to decode prost: field not found `{}`

What it means

When a prost-decoded protobuf message contains an unknown or missing required field (PbFieldNotFound), it is converted into a StreamError with the message `Failed to decode prost: field not found `{field}``. This usually indicates protobuf schema drift between components — one side was built with newer generated code than the other.

Source

Thrown at src/stream/src/error.rs:92

    #[error("Secret error: {0}")]
    Secret(
        #[from]
        #[backtrace]
        SecretError,
    ),

    #[error(transparent)]
    Uncategorized(
        #[from]
        #[backtrace]
        anyhow::Error,
    ),
}

impl From<PbFieldNotFound> for StreamError {
    fn from(err: PbFieldNotFound) -> Self {
        Self::from(anyhow::anyhow!(
            "Failed to decode prost: field not found `{}`",
            err.0
        ))
    }
}

impl From<ConnectorError> for StreamError {
    fn from(err: ConnectorError) -> Self {
        StreamExecutorError::from(err).into()
    }
}

impl From<ExchangeChannelClosed> for StreamError {
    fn from(err: ExchangeChannelClosed) -> Self {
        StreamExecutorError::from(err).into()
    }
}

View on GitHub (pinned to 6469eb736d)

Solutions

  1. Ensure all nodes (meta, compute, frontend) run the same RisingWave version
  2. Complete any interrupted rolling upgrade and restart stale nodes
  3. Regenerate/rebuild with matching prost definitions if running a custom build
  4. If it appears at upgrade time, check release notes for proto field changes requiring migration

Example fix

// before: mixed versions
// meta: v1.10, compute: v1.9 -> proto field mismatch
// after: align versions
// upgrade all nodes to v1.10 and restart the cluster
Defensive patterns

Strategy: validation

Validate before calling

// before rolling deploy, verify versions match across nodes:
// risingwave --version on meta, compute, and frontend nodes

Try / catch

match decode_result {
    Err(e) if e.to_string().contains("Failed to decode prost: field not found") => {
        log::error!("protobuf version skew detected: {e}"); // halt upgrade, align node versions
    }
    other => other,
}

Prevention

When it happens

Trigger: `From<PbFieldNotFound> for StreamError` fires while deserializing any protobuf control/data message in the stream path (barriers, actor messages, dispatcher messages) that references a field absent from the local .prost definitions.

Common situations: Rolling upgrade with mismatched binary versions across meta/compute nodes; mixed-version cluster after partial deployment; consuming protobuf produced by a newer RisingWave build.

Understand the failure class

Background: "cannot parse invalid wire-format data", "cannot unmarshal", "failed unmarshalling": protobuf unmarshal errors explained — this error's family across 10 libraries.

Related errors


AI-assisted analysis of risingwavelabs/risingwave@6469eb736d (2026-09-11). Data as JSON: /api/errors/a651919c75e64a32. Report an issue: GitHub.