{"record":{"id":"fef5a6f6fef68cd0","repo":"databendlabs/databend","slug":"block-meta-ref-is-exchangedeserializemeta","errorCode":null,"errorMessage":"block_meta_ref is ExchangeDeserializeMeta","messagePattern":"block_meta_ref is ExchangeDeserializeMeta","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/query/service/src/pipelines/processors/transforms/aggregator/serde/transform_deserializer.rs","lineNumber":246,"sourceCode":"        mut meta: ExchangeDeserializeMeta,\n    ) -> Result<Vec<DataBlock>> {\n        match meta.packet.pop().unwrap() {\n            DataPacket::FragmentData(v) => self.recv_data(meta.packet, v),\n            DataPacket::ErrorCode(err) => Err(err),\n            _ => unreachable!(),\n        }\n    }\n}\n\nimpl AccumulatingTransform for TransformDeserializer {\n    const NAME: &'static str = \"TransformDeserializer\";\n\n    fn transform(&mut self, mut data_block: DataBlock) -> Result<Vec<DataBlock>> {\n        if let Some(block_meta_ref) = data_block.get_meta() {\n            if ExchangeDeserializeMeta::downcast_ref_from(block_meta_ref).is_some() {\n                let block_meta = data_block.take_meta().unwrap();\n                let Some(meta) = ExchangeDeserializeMeta::downcast_from(block_meta) else {\n                    unreachable!(\"block_meta_ref is ExchangeDeserializeMeta\");\n                };\n\n                if data_block.num_rows() != 0 {\n                    return Err(ErrorCode::Internal(\"DataBlockMeta has rows\"));\n                }\n\n                return self.transform_exchange_meta(meta);\n            }\n        }\n\n        Ok(vec![data_block])\n    }\n}\n\npub type TransformAggregateDeserializer = TransformDeserializer;\n","sourceCodeStart":228,"sourceCodeEnd":262,"githubUrl":"https://github.com/databendlabs/databend/blob/288d84d76e20a2f8f7173bda9691eb6ece301aa9/src/query/service/src/pipelines/processors/transforms/aggregator/serde/transform_deserializer.rs#L228-L262","documentation":"TransformDeserializer::transform first checks that a block's meta downcasts to ExchangeDeserializeMeta, then re-downcasts it via downcast_from; the unreachable! fires only if the ownership-taking downcast unexpectedly fails after the reference check succeeded. In practice this message signals the meta check/double-downcast pairing was violated, i.e. a genuine code-level invariant bug rather than data-dependent failure.","triggerScenarios":"transform() takes meta that just passed ExchangeDeserializeMeta::downcast_ref_from but fails downcast_from — practically only from code changes that desynchronize the is_some() check and the take/downcast pair, or unusual meta layouts.","commonSituations":"Regressions after refactoring DataBlockMeta/downcast helpers in the exchange deserializer; never expected in production on stable code.","solutions":["Upgrade to a version where the deserializer downcast pairing is fixed","Report with a stack trace; the fix is typically to use the checked reference directly instead of a second downcast","If writing similar code, use the reference obtained from downcast_ref_from instead of re-downcasting after take"],"exampleFix":"// before\nlet Some(meta) = ExchangeDeserializeMeta::downcast_from(block_meta) else {\n    unreachable!(\"block_meta_ref is ExchangeDeserializeMeta\");\n};\n// after\nlet meta = ExchangeDeserializeMeta::downcast_ref_from(block_meta_ref).expect(\"checked above\");","handlingStrategy":"try-catch","validationCode":null,"typeGuard":"fn downcast_exchange_meta(m: &Arc<DataBlockMeta>) -> Option<&ExchangeDeserializeMeta> {\n    ExchangeDeserializeMeta::downcast_ref_from(m)\n}","tryCatchPattern":"catch Err(e) where message contains \"block_meta_ref is ExchangeDeserializeMeta\" -> gather stack trace and file bug; not recoverable at runtime.","preventionTips":["Don't desynchronize the downcast_ref check and downcast_from take pair; use the checked reference directly","Run clippy/tests after refactoring DataBlockMeta downcast helpers","Keep exchange meta types in one module so check/take stay co-located"],"tags":["internal","exchange","serde","unreachable"],"backgroundTag":"internal-invariant-violation","analyzedSha":"288d84d76e20a2f8f7173bda9691eb6ece301aa9","analyzedAt":"2026-09-11T11:29:36.208Z","contentChangedAt":"2026-09-11T11:29:36.208Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}