{"record":{"id":"460f8d3678659c0c","repo":"risingwavelabs/risingwave","slug":"dynamic-utf-8-conversion-error-from-metadata-byt","errorCode":null,"errorMessage":"(dynamic: UTF-8 conversion error from metadata bytes)","messagePattern":"\\(dynamic: UTF-8 conversion error from metadata bytes\\)","errorType":"validation","errorClass":"SinkError::Config","httpStatus":null,"severity":"error","filePath":"src/connector/src/sink/snowflake_redshift/redshift.rs","lineNumber":674,"sourceCode":"            }\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            })\n            .map(|metadata| {\n                let path = if let Some(sink_metadata::Metadata::Serialized(SerializedMetadata {\n                    metadata,\n                })) = metadata.metadata\n                {\n                    String::from_utf8(metadata).map_err(|e| SinkError::Config(anyhow!(e)))\n                } else {\n                    Err(SinkError::Config(anyhow!(\"Invalid metadata format\")))\n                }?;\n                Ok(path)\n            })\n            .collect::<Result<Vec<_>>>()?;\n\n        // Write manifest file to S3 instead of inserting to database\n        if !paths.is_empty() {\n            let s3_inner = self.config.s3_inner.as_ref().ok_or_else(|| {\n                SinkError::Config(anyhow!(\"S3 configuration is required for S3 sink\"))\n            })?;\n            {\n                Self::write_manifest_to_s3(s3_inner, paths, &self.config.table).await?;\n            }\n            tracing::info!(\n                \"Manifest file written to S3 for sink id {} at epoch {}\",\n                self.sink_id,","sourceCodeStart":656,"sourceCodeEnd":692,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/connector/src/sink/snowflake_redshift/redshift.rs#L656-L692","documentation":"During `commit_data` with S3 manifests, each sink metadata entry must be a `Serialized` metadata variant whose bytes decode as UTF-8 (the file path written to S3). This message is the dynamic UTF-8 conversion error text produced when the serialized metadata bytes are not valid UTF-8.","triggerScenarios":"A `sink_metadata::Metadata::Serialized` payload contains bytes that fail `String::from_utf8` — i.e., something upstream wrote non-UTF-8 data as the metadata path.","commonSituations":"Custom/modified sink code putting raw binary into Serialized metadata; corrupted data in the stream's metadata column; version mismatch between producer and consumer of the metadata format.","solutions":["Inspect the upstream data/metadata generation to find where non-UTF-8 bytes originate","Ensure the metadata column contains valid UTF-8 path strings","Replay the affected epoch or skip corrupted metadata entries"],"exampleFix":null,"handlingStrategy":"type-guard","validationCode":"// validate metadata bytes are UTF-8 before emitting them as sink metadata\nstd::str::from_utf8(&bytes).map_err(|_| \"non-UTF-8 sink metadata\")?;","typeGuard":"fn valid_path_meta(m: &Option<SinkMetadataEnum>) -> Option<String> {\n    match m.as_ref()? {\n        Metadata::Serialized(SerializedMetadata { metadata }) =>\n            String::from_utf8(metadata.clone()).ok(),\n        _ => None,\n    }\n}","tryCatchPattern":null,"preventionTips":["Only produce UTF-8 path strings in sink metadata","Keep RisingWave component versions consistent"],"tags":["redshift","sink","metadata","utf8"],"backgroundTag":"invalid-argument-format","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"}