risingwavelabs/risingwave · error · StreamExecutorError

Uncategorized (anyhow::Error)

Error message

Uncategorized (anyhow::Error)

What it means

The Uncategorized variant transparently wraps an anyhow::Error and is the catch-all for StreamExecutorError. Any error without a dedicated variant (including those created by anyhow! macros or bail!) lands here. The message shown, 'Uncategorized (anyhow::Error)', is the Debug/type name — the actual text comes from the wrapped anyhow error.

Solutions

  1. Read the wrapped anyhow message and backtrace for the real cause.
  2. Match the message to the specific executor/code path that raised it.
  3. Fix the underlying condition described by the inner message.
  4. If caused by a From<PbFieldNotFound>, check for proto schema/version mismatch between nodes.
Defensive patterns

Strategy: try-catch

Type guard

fn is_uncategorized(e: &StreamExecutorError) -> bool {
    e.variant_name() == "Uncategorized"
}

Try / catch

let res: StreamExecutorResult<_> = run().await;
if let Err(e) = res {
    // Uncategorized wraps anyhow::Error; log with backtrace for diagnosis
    tracing::error!(error = ?e, backtrace = ?std::backtrace::Backtrace::capture(), "executor failed");
    return Err(e);
}

Prevention

When it happens

Trigger: Created wherever anyhow::Error is converted into StreamExecutorError via From, including From<String> (src/stream/src/executor/error.rs:151) and bail!/anyhow! calls inside executor code, plus From<PbFieldNotFound> (src/stream/src/executor/error.rs:142).

Common situations: Ad-hoc error messages from executor internals; prost decode failures; miscellaneous invariant checks; errors surfaced by macros like `bail!`.

Understand the failure class

Background: "This is a bug, please report it": internal invariant violations, unreachable panics, and SNH errors explained — this error's family across 47 libraries.

Related errors


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

Appendix: source

Thrown at src/stream/src/executor/error.rs:115

    #[error("Connector error: {0}")]
    ConnectorError(
        #[source]
        #[backtrace]
        BoxedError,
    ),

    #[error(transparent)]
    DmlError(
        #[from]
        #[backtrace]
        DmlError,
    ),

    #[error(transparent)]
    NotImplemented(#[from] NotImplemented),

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

/// Serialize/deserialize error.
impl From<memcomparable::Error> for StreamExecutorError {
    fn from(m: memcomparable::Error) -> Self {
        Self::serde_error(m)
    }
}
impl From<ValueEncodingError> for StreamExecutorError {
    fn from(e: ValueEncodingError) -> Self {
        Self::serde_error(e)
    }
}

View on GitHub (pinned to 6469eb736d)