{"record":{"id":"2760c9ad22883975","repo":"risingwavelabs/risingwave","slug":"iceberg-pk-index-sink-report-missing-metadata-in-a","errorCode":null,"errorMessage":"iceberg pk-index sink report missing metadata in aggregate_reports","messagePattern":"iceberg pk-index sink report missing metadata in aggregate_reports","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/meta/src/manager/iceberg_pk_index_sink/coordinator.rs","lineNumber":573,"sourceCode":"}\n\nfn aggregate_reports(\n    reports: &[PbIcebergPkIndexSinkMetadata],\n) -> Result<IcebergPkIndexSinkAggResult> {\n    let mut shared_schema_id: Option<i32> = None;\n    let mut shared_partition_spec_id: Option<i32> = None;\n\n    let mut data_files: Vec<SerializedDataFile> = Vec::new();\n    let mut delete_files: Vec<SerializedDataFile> = Vec::new();\n    let mut overwrite_files: Vec<SerializedDataFile> = Vec::new();\n\n    if reports.is_empty() {\n        bail!(\"no reports to aggregate for iceberg pk-index sink coordinator\");\n    }\n\n    for r in reports {\n        let Some(meta) = &r.metadata else {\n            bail!(\"iceberg pk-index sink report missing metadata in aggregate_reports\");\n        };\n\n        // Validate role: explicitly-Unspecified is a wire-format bug.\n        let role = PbIcebergPkIndexSinkRole::try_from(r.role)\n            .ok()\n            .filter(|r| !matches!(r, PbIcebergPkIndexSinkRole::Unspecified))\n            .ok_or_else(|| anyhow!(\"iceberg pk-index sink report has invalid role: {}\", r.role))?;\n\n        match role {\n            PbIcebergPkIndexSinkRole::Writer => {\n                let commit_result = IcebergCommitResult::try_from(meta)?;\n                align_report_id(\n                    commit_result.schema_id,\n                    commit_result.partition_spec_id,\n                    &mut shared_schema_id,\n                    &mut shared_partition_spec_id,\n                )?;\n                data_files.extend(commit_result.data_files);","sourceCodeStart":555,"sourceCodeEnd":591,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/meta/src/manager/iceberg_pk_index_sink/coordinator.rs#L555-L591","documentation":"Each report in `aggregate_reports` must carry a `metadata` payload (the serialized commit result from the writer or merger). A report with `metadata: None` cannot contribute file lists, so the coordinator bails. This indicates a wire-format/serialization bug rather than a user configuration problem.","triggerScenarios":"A `PbIcebergPkIndexSinkMetadata` in the epoch's report list has `metadata == None` — e.g. an actor sent a role stub without its serialized `IcebergCommitResult`/`IcebergPositionDeleteCommitResult`, or proto deserialization left the oneof unset.","commonSituations":"Version skew between frontend/stream nodes and the meta node producing incompatible protobuf payloads; a writer bug serializing an empty message; corrupted report aggregation across the barrier.","solutions":["Check node versions: ensure all stream/frontend nodes and the meta node run the same RisingWave build (protobuf compatibility).","Log/inspect the offending report's role to identify which actor type (Writer vs PositionDeleteMerger) sent metadata-less results.","Retry the epoch after the affected actor is restarted; if reproducible, fix the serialization path so metadata is always populated."],"exampleFix":"// before: sending a stub\npb.metadata = None;\n// after: always attach serialized result\npb.role = PbIcebergPkIndexSinkRole::Writer as i32;\npb.metadata = Some(iceberg_commit_result.into());","handlingStrategy":"type-guard","validationCode":"for r in reports {\n    anyhow::ensure!(r.metadata.is_some(), \"report for role {} missing metadata\", r.role);\n}","typeGuard":"fn has_metadata(r: &PbIcebergPkIndexSinkMetadata) -> bool { r.metadata.is_some() }","tryCatchPattern":"let Some(meta) = &r.metadata else {\n    tracing::error!(role = r.role, \"pk-index sink report missing metadata\");\n    bail!(\"iceberg pk-index sink report missing metadata in aggregate_reports\");\n};","preventionTips":["Keep all RisingWave components on the same version to avoid protobuf skew.","Always populate the metadata oneof when emitting sink reports from actors.","Add a serialization round-trip test for PbIcebergPkIndexSinkMetadata."],"tags":["iceberg","protobuf","wire-format","internal-invariant-violation"],"backgroundTag":"protobuf-unmarshal-failed","analyzedSha":"6469eb736d691e8e9b8a419a57edd6429ca77417","analyzedAt":"2026-09-11T21:06:21.487Z","contentChangedAt":"2026-09-11T21:06:21.487Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}