risingwavelabs/risingwave · error

Manual iceberg compaction task {} for sink {} failed: {}

Error message

Manual iceberg compaction task {} for sink {} failed: {}

What it means

The meta tracks manual Iceberg compaction tasks; when the compactor reports Failed (or Unspecified) status, complete_manual_task_waiter converts the report into an error carrying the task id, sink id and the compactor-provided error message (or a generic fallback).

Source

Thrown at src/meta/src/manager/iceberg_compaction/manual.rs:39

use super::*;

impl IcebergCompactionManager {
    pub(super) fn complete_manual_task_waiter(
        waiter: ManualCompactionWaiter,
        report: &IcebergReportTask,
    ) {
        let status = IcebergReportTaskStatus::try_from(report.status)
            .unwrap_or(IcebergReportTaskStatus::Unspecified);
        let result = match status {
            IcebergReportTaskStatus::Success => Ok(report.task_id),
            IcebergReportTaskStatus::Drained
            | IcebergReportTaskStatus::Failed
            | IcebergReportTaskStatus::Unspecified => {
                let message = report
                    .error_message
                    .clone()
                    .unwrap_or_else(|| "manual iceberg compaction failed".to_owned());
                Err(anyhow!(
                    "Manual iceberg compaction task {} for sink {} failed: {}",
                    report.task_id,
                    report.sink_id,
                    message
                )
                .into())
            }
        };

        let _ = waiter.send(result);
    }

    pub async fn trigger_manual_compaction(
        &self,
        sink_id: SinkId,
    ) -> MetaResult<IcebergCompactionTaskId> {
        // Fast-fail before registering a waiter when no compactor can pull the
        // scheduler task.

View on GitHub (pinned to 6469eb736d)

Solutions

  1. Read the `message` suffix of this error (from report.error_message) for the compactor-side root cause.
  2. Check the compactor node's logs for the matching task_id.
  3. Fix the underlying cause (catalog/credentials/permissions) and re-trigger manual compaction.
  4. If the compactor restarted, ensure it reports status for in-flight tasks or the meta will surface this generic failure.
Defensive patterns

Strategy: try-catch

Try / catch

match trigger_manual_compaction(sink_id).await {
    Err(e) if e.to_string().contains("Manual iceberg compaction task") => {
        // surface the embedded compactor message to operators, then retry after fixing cause
        let cause = e.to_string();
        log::error!("compaction failed: {cause}");
    }
    other => other?,
}

Prevention

When it happens

Trigger: trigger_manual_compaction is waiting on the task result and the compactor reports IcebergReportTaskStatus::Failed or Unspecified for the dispatched task.

Common situations: Compactor node crashed or lost connection mid-task; the compactor failed to open/write the Iceberg table (credentials, permissions, catalog errors); the reported error_message field carries the root cause.

Related errors


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