{"record":{"id":"7629ea92c16f4ab6","repo":"risingwavelabs/risingwave","slug":"invalid-metadata-format","errorCode":null,"errorMessage":"Invalid metadata format","messagePattern":"Invalid metadata format","errorType":"validation","errorClass":"SinkError::Config","httpStatus":null,"severity":"error","filePath":"src/connector/src/sink/snowflake_redshift/redshift.rs","lineNumber":676,"sourceCode":"        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,\n                epoch\n            );","sourceCodeStart":658,"sourceCodeEnd":694,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/connector/src/sink/snowflake_redshift/redshift.rs#L658-L694","documentation":"Each sink metadata entry for the S3-manifest path must be the `Serialized` variant containing the written file path. This error is thrown when the metadata enum is any other variant (or None), so no file path can be extracted for the manifest.","triggerScenarios":"`commit_data` receives `SinkMetadata` whose `metadata` field is not `sink_metadata::Metadata::Serialized(...)` — e.g., a different metadata type or missing metadata.","commonSituations":"Downstream/upstream version mismatch in the sink metadata protobuf; users writing custom metadata into the stream; internal bug populating the wrong metadata variant.","solutions":["Ensure the source of the metadata populates `Metadata::Serialized` with the S3 path","Check RisingWave version consistency across frontend/compute/meta nodes","Replay the epoch with correctly formed metadata"],"exampleFix":null,"handlingStrategy":"type-guard","validationCode":"// reject non-Serialized metadata upstream before commit\nmatches!(meta.metadata, Some(Metadata::Serialized(_)));","typeGuard":"fn is_serialized(m: &Option<SinkMetadataEnum>) -> bool {\n    matches!(m, Some(Metadata::Serialized(_)))\n}","tryCatchPattern":null,"preventionTips":["Emit metadata only via the Serialized variant","Avoid custom code that writes foreign metadata into sink epochs","Keep protobuf definitions in sync across components"],"tags":["redshift","sink","metadata","protobuf"],"backgroundTag":"unexpected-response-shape","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"}