{"record":{"id":"cade2c403ee5830e","repo":"risingwavelabs/risingwave","slug":"this-is-not-an-actual-error-condition-the-system","errorCode":null,"errorMessage":"This is not an actual error condition. The system is intentionally triggering recovery procedures to ensure ALTER SINK CONFIG are fully applied.","messagePattern":"This is not an actual error condition\\. The system is intentionally triggering recovery procedures to ensure ALTER SINK CONFIG are fully applied\\.","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"info","filePath":"src/stream/src/executor/sink.rs","lineNumber":947,"sourceCode":"                                info!(\n                                    executor_id = %sink_writer_param.executor_id,\n                                    sink_id = %sink_param.sink_id,\n                                    \"alter sink config successfully with rewind\"\n                                );\n                                Ok(())\n                            }\n                            Err(rewind_err) => {\n                                error!(\n                                    error = %rewind_err.as_report(),\n                                    \"failed to rewind the log reader for ALTER SINK CONFIG\"\n                                );\n                                Err(anyhow!(\"failed to rewind the log after ALTER SINK CONFIG\").into())\n                            }\n                        }\n                    } else {\n                        sink_param.properties.extend(config);\n                        sink = TryFrom::try_from(sink_param.clone()).map_err(|e| StreamExecutorError::from((e, sink_param.sink_id)))?;\n                        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())\n                    }\n                    .map_err(|e| StreamExecutorError::from((e, sink_param.sink_id)))?;\n                }\n            }\n        }\n    }\n}\n\nenum RebuildSinkMessage {\n    RebuildSink(Arc<Bitmap>, oneshot::Sender<()>),\n    UpdateConfig(HashMap<String, String>),\n}\n\nfn sink_config_has_changes(\n    current: &BTreeMap<String, String>,\n    incoming: &HashMap<String, String>,\n) -> bool {\n    incoming","sourceCodeStart":929,"sourceCodeEnd":965,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/stream/src/executor/sink.rs#L929-L965","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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"],"exampleFix":null,"handlingStrategy":"fallback","validationCode":null,"typeGuard":null,"tryCatchPattern":"// Treat as expected control flow, not an alert-worthy error\nif err.to_string().contains(\"not an actual error condition\") {\n    tracing::info!(\"ALTER SINK CONFIG forcing recovery (expected)\");\n    return; // allow recovery to proceed\n}","preventionTips":["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"],"tags":["sink","recovery","expected-behavior","alter-sink"],"backgroundTag":"invalid-state-transition","analyzedSha":"6469eb736d691e8e9b8a419a57edd6429ca77417","analyzedAt":"2026-09-11T21:06:21.487Z","contentChangedAt":"2026-09-11T21:06:21.487Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}