{"record":{"id":"eb9109cb125d1bc0","repo":"risingwavelabs/risingwave","slug":"periodic-task-for-sink-id-panicked","errorCode":null,"errorMessage":"Periodic task for sink id {} panicked: {}","messagePattern":"Periodic task for sink id (.+?) panicked: (.+?)","errorType":"exception","errorClass":"SinkError::Redshift","httpStatus":null,"severity":"critical","filePath":"src/connector/src/sink/snowflake_redshift/redshift.rs","lineNumber":650,"sourceCode":"                &self.client,\n                &self.config,\n                self.config.s3_inner.as_ref().ok_or_else(|| {\n                    SinkError::Config(anyhow!(\"S3 configuration is required for redshift s3 sink\"))\n                })?,\n                self.is_append_only,\n            )\n            .await?;\n        }\n        Ok(())\n    }\n\n    async fn commit_data(&mut self, epoch: u64, metadata: Vec<SinkMetadata>) -> Result<()> {\n        if let Some(handle) = &self.periodic_task_handle {\n            let is_finished = handle.is_finished();\n            if is_finished {\n                let handle = self.periodic_task_handle.take().unwrap();\n                handle.await.map_err(|e| {\n                    SinkError::Redshift(anyhow!(\n                        \"Periodic task for sink id {} panicked: {}\",\n                        self.sink_id,\n                        e.to_report_string()\n                    ))\n                })?;\n            }\n        };\n        let paths = metadata\n            .into_iter()\n            .filter(|m| {\n                if let Some(sink_metadata::Metadata::Serialized(SerializedMetadata { metadata })) =\n                    &m.metadata\n                {\n                    !metadata.is_empty()\n                } else {\n                    false\n                }\n            })","sourceCodeStart":632,"sourceCodeEnd":668,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/connector/src/sink/snowflake_redshift/redshift.rs#L632-L668","documentation":"The Redshift sink spawns a background periodic task; `commit_data` detects that the task handle has finished and awaits the JoinError to surface the panic. This error reports that the periodic task panicked (not a normal query failure), meaning commits were not being performed in the background.","triggerScenarios":"The spawned periodic task panics (bug in query execution, DB client dropped/closed, unexpected unwrap/assert) and the next `commit_data(epoch, ...)` observes `handle.is_finished()`.","commonSituations":"Redshift connection closed mid-run causing a panic path; RisingWave bug or OOM in the task; database restart during COPY leaving the task in a panic state.","solutions":["Read the JoinError report and preceding task logs to find the underlying panic cause","Restart/recreate the sink to respawn the periodic task","Verify Redshift availability and credentials; upgrade RisingWave if the panic is an internal bug and file an issue"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"if handle.is_finished() {\n    let h = self.periodic_task_handle.take().unwrap();\n    if let Err(join_err) = h.await {\n        // JoinError = task panicked; inspect cause(), alert, and restart sink\n        log::error!(\"periodic task panicked: {:?}\", join_err);\n    }\n}","preventionTips":["Monitor sink logs for background task errors continuously","Ensure Redshift availability and correct credentials so the task does not hit panic paths","Upgrade RisingWave if the panic traces to internal sink code and report the bug"],"tags":["redshift","sink","panic","background-task"],"backgroundTag":"internal-invariant-violation","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"}