{"record":{"id":"8f019e7a09fcf72b","repo":"risingwavelabs/risingwave","slug":"meta-client-is-required-for-iceberg-pk-index-posit","errorCode":null,"errorMessage":"meta client is required for iceberg pk-index position-delete merger","messagePattern":"meta client is required for iceberg pk-index position-delete merger","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/stream/src/from_proto/iceberg_with_pk_index/position_delete_merger.rs","lineNumber":53,"sourceCode":"\n    async fn new_boxed_executor(\n        params: ExecutorParams,\n        node: &Self::Node,\n        _store: impl StateStore,\n    ) -> StreamResult<Executor> {\n        let [input]: [_; 1] = params.input.try_into().unwrap();\n\n        let sink_desc = node.sink_desc.as_ref().unwrap();\n        let sink_id: SinkId = sink_desc.get_id();\n\n        let properties_with_secret = LocalSecretManager::global().fill_secrets(\n            sink_desc.get_properties().clone(),\n            sink_desc.get_secret_refs().clone(),\n        )?;\n        let config = IcebergConfig::from_btreemap(properties_with_secret)\n            .map_err(|err| StreamExecutorError::sink_error(err, sink_id))?;\n        let meta_client = params.env.meta_client().ok_or_else(|| {\n            anyhow!(\"meta client is required for iceberg pk-index position-delete merger\")\n        })?;\n\n        let handler = PositionDeleteHandlerImpl::new(\n            config,\n            params.actor_context.id,\n            params.vnode_bitmap.clone(),\n            sink_id,\n            meta_client,\n        );\n\n        let exec = PositionDeleteMergerExecutor::new(\n            params.actor_context.id,\n            sink_id,\n            params.local_barrier_manager.clone(),\n            input,\n            handler,\n        );\n        Ok((params.info, exec).into())","sourceCodeStart":35,"sourceCodeEnd":71,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/stream/src/from_proto/iceberg_with_pk_index/position_delete_merger.rs#L35-L71","documentation":"The iceberg pk-index position-delete merger executor needs a meta client to coordinate position delete file merging across parallelities. `new_boxed_executor` fails fast with this anyhow error when `params.env.meta_client()` is `None`. Like the compaction resolver, the merger cannot operate without meta-side coordination, so the error is raised at executor build time.","triggerScenarios":"Constructing a `PositionDeleteMerger` executor from its proto node when the stream environment lacks a meta client (`params.env.meta_client()` returns `None`), right after building `IcebergConfig` from the sink properties.","commonSituations":"Embedded or test environments without a meta client; simulation runs (madsim) where meta client wiring differs; a compute node started without meta connection attempting to serve an Iceberg pk sink graph.","solutions":["Start the node in a real cluster so a meta client is available in the stream environment.","In tests, construct the environment with a mock meta client implementation.","Check compute node configuration/startup to ensure the meta client is initialized before executor building.","Remove or reconfigure the Iceberg pk-index sink if meta coordination is unavailable."],"exampleFix":"// before\nlet env = StreamEnvironment::for_test(); // meta_client() == None\n// after\nlet env = StreamEnvironment::new(config, Some(meta_client));","handlingStrategy":"validation","validationCode":"// before constructing the merger\nif params.env.meta_client().is_none() {\n    panic!(\"position-delete merger requires meta client; use a cluster-backed environment\");\n}","typeGuard":"fn meta_client_or_none(env: &StreamEnvironment) -> Option<MetaClientRef> { env.meta_client() }","tryCatchPattern":"let meta_client = env.meta_client().ok_or_else(|| anyhow!(\"meta client is required\"))?;","preventionTips":["Keep test harnesses aligned: any test exercising Iceberg pk sinks must provide a meta client.","Document that position-delete merging is cluster-only functionality.","Validate the environment once at actor-build time rather than per-executor."],"tags":["rust","streaming","iceberg","meta-client"],"backgroundTag":"missing-dependency","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"}