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

  1. No action needed: this is an intentional control-flow error; confirm the actor recovered and the sink continues with the new config
  2. Verify the new sink properties took effect (e.g. SHOW SINKS / sink options)
  3. Filter these messages from alerting to avoid false positives
  4. 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

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


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 {
    incoming

View on GitHub (pinned to 6469eb736d)