risingwavelabs/risingwave · info
This is not an actual error condition. The system is…
Error message
This is not an actual error condition. The system is intentionally triggering recovery procedures to ensure ALTER SINK CONFIG are fully applied.
What it means
When ALTER SINK CONFIG changes sink properties without vnode changes, the executor applies the new config to the sink and then intentionally returns a synthetic error so the framework tears down and recovers the actor, guaranteeing the new config is fully applied everywhere. This message is informational despite being delivered as an Err.
Solutions
- No action needed: this is an intentional control-flow error; confirm the actor recovered and the sink continues with the new config
- Verify the new sink properties took effect (e.g. SHOW SINKS / sink options)
- Filter these messages from alerting to avoid false positives
- If recovery does NOT follow, investigate the real failure — this error is only benign when recovery succeeds
Defensive patterns
Strategy: fallback
Try / catch
// Treat as expected control flow, not an alert-worthy error
if err.to_string().contains("not an actual error condition") {
tracing::info!("ALTER SINK CONFIG forcing recovery (expected)");
return; // allow recovery to proceed
} Prevention
- Exclude this message from error-based alerting
- After ALTER SINK CONFIG, wait for actor recovery before validating new config
- Document the intentional-error pattern for operators
When it happens
Trigger: Any ALTER SINK CONFIG statement whose update reaches the else branch (config-only change, no bitmap-driven rebuild needed) causes this deliberately-raised error to force actor recovery.
Common situations: Running ALTER SINK CONFIG ... SET/RESET on a sink and seeing an ERROR entry in actor logs immediately followed by successful recovery — this is expected behavior, not a fault.
Understand the failure class
Background: "Invalid state transition" errors: "status must be X, actually Y", "already rejected/charging/uninstalled", "cannot ... while running" — what they mean when a library rejects your call — this error's family across 31 libraries.
Related errors
- failed to rewind the log after ALTER SINK CONFIG
- LanceDB pre-commit epoch
- a stream has reached the end but some other stream has not…
- adhoc recovery triggered
- ALTER SINK_RATE_LIMIT is not for sink into table
AI-assisted analysis of risingwavelabs/risingwave@6469eb736d (2026-09-11).
Data as JSON: /api/errors/cade2c403ee5830e.
Report an issue: GitHub.
Appendix: source
Thrown at src/stream/src/executor/sink.rs:947
info!(
executor_id = %sink_writer_param.executor_id,
sink_id = %sink_param.sink_id,
"alter sink config successfully with rewind"
);
Ok(())
}
Err(rewind_err) => {
error!(
error = %rewind_err.as_report(),
"failed to rewind the log reader for ALTER SINK CONFIG"
);
Err(anyhow!("failed to rewind the log after ALTER SINK CONFIG").into())
}
}
} else {
sink_param.properties.extend(config);
sink = TryFrom::try_from(sink_param.clone()).map_err(|e| StreamExecutorError::from((e, sink_param.sink_id)))?;
Err(anyhow!("This is not an actual error condition. The system is intentionally triggering recovery procedures to ensure ALTER SINK CONFIG are fully applied.").into())
}
.map_err(|e| StreamExecutorError::from((e, sink_param.sink_id)))?;
}
}
}
}
}
enum RebuildSinkMessage {
RebuildSink(Arc<Bitmap>, oneshot::Sender<()>),
UpdateConfig(HashMap<String, String>),
}
fn sink_config_has_changes(
current: &BTreeMap<String, String>,
incoming: &HashMap<String, String>,
) -> bool {
incomingView on GitHub (pinned to 6469eb736d)