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
- Read the `message` suffix of this error (from report.error_message) for the compactor-side root cause.
- Check the compactor node's logs for the matching task_id.
- Fix the underlying cause (catalog/credentials/permissions) and re-trigger manual compaction.
- 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
- Keep compactor workers healthy and connected to avoid spurious Failed reports.
- Pre-validate Iceberg catalog credentials/permissions before triggering.
- Alert on IcebergReportTaskStatus::Failed reports and include task_id in alerts.
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
- No iceberg compactor available
- Manual iceberg compaction waiter dropped unexpectedly for si
- Iceberg compaction task failed before dispatch for sink {}
- manual iceberg compaction is already waiting for sink {}
- Iceberg branch {} disappeared after manifest rewrite for sin
AI-assisted analysis of risingwavelabs/risingwave@6469eb736d (2026-09-11).
Data as JSON: /api/errors/5d08a228dd137f57.
Report an issue: GitHub.