{"record":{"id":"7ae5347eb2eefb26","repo":"risingwavelabs/risingwave","slug":"meta-client-is-required-for-iceberg-writer","errorCode":null,"errorMessage":"meta client is required for Iceberg writer","messagePattern":"meta client is required for Iceberg writer","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/stream/src/from_proto/iceberg_with_pk_index/writer.rs","lineNumber":89,"sourceCode":"\n        let table = create_and_validate_table_impl(&config, &sink_param)\n            .await\n            .map_err(|e| StreamExecutorError::sink_error(e, sink_id))?;\n\n        let pk_index_state_table = StateTableBuilder::new(\n            node.get_pk_index_table()?,\n            store,\n            params.vnode_bitmap.clone().map(Arc::new),\n        )\n        .enable_preload_all_rows_by_config(&params.config)\n        .with_op_consistency_level(StateTableOpConsistencyLevel::Inconsistent)\n        .build()\n        .await;\n\n        let meta_client = params\n            .env\n            .meta_client()\n            .ok_or_else(|| anyhow!(\"meta client is required for Iceberg writer\"))?;\n        let meta_client = SinkMetaClient::MetaClient(meta_client);\n\n        let writer_param = SinkWriterParam {\n            executor_id: params.executor_id,\n            vnode_bitmap: params.vnode_bitmap.clone(),\n            meta_client: Some(meta_client),\n            extra_partition_col_idx: sink_desc.extra_partition_col_idx.map(|v| v as usize),\n            actor_id: params.actor_context.id,\n            sink_id,\n            sink_name,\n            connector: ICEBERG_SINK.to_owned(),\n            streaming_config: params.config.as_ref().clone(),\n            time_zone: params.actor_context.time_zone,\n        };\n        let writer = IcebergWriterImpl::build(&config, table, &writer_param)?;\n\n        let exec = WriterExecutor::new(\n            params.actor_context,","sourceCodeStart":71,"sourceCodeEnd":107,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/stream/src/from_proto/iceberg_with_pk_index/writer.rs#L71-L107","documentation":"The Iceberg pk-index writer requires a meta client so its `SinkWriterParam` can carry `SinkMetaClient::MetaClient` for committing/committing metadata through the meta service. `new_boxed_executor` fails with this anyhow error when `params.env.meta_client()` is `None`. This is a build-time fail-fast because the writer's commit protocol depends on meta coordination.","triggerScenarios":"Building the `IcebergWithPkIndexWriterExecutor` when the stream environment has no meta client — test/embedded environments, simulation runs, or compute nodes started without meta client wiring.","commonSituations":"Unit/integration tests constructing the executor with a test environment lacking a meta client; embedded runtime usage; a misconfigured compute node that skipped meta client initialization.","solutions":["Run the streaming job in a real cluster so `env.meta_client()` returns a client.","Provide a mock meta client when building the environment in tests.","Ensure the compute node startup path initializes the meta client for the executor environment.","Alternatively use a sink path that does not require meta coordination if running standalone."],"exampleFix":"// before\nlet writer_param = SinkWriterParam { meta_client: None, ... };\n// after\nlet meta_client = params.env.meta_client().ok_or_else(|| anyhow!(\"meta client is required for Iceberg writer\"))?;\nlet writer_param = SinkWriterParam { meta_client: Some(SinkMetaClient::MetaClient(meta_client)), ... };","handlingStrategy":"validation","validationCode":"// before building the writer param\nassert!(params.env.meta_client().is_some(), \"Iceberg writer needs meta client\");","typeGuard":"fn require_meta_client(env: &StreamEnvironment) -> Result<MetaClientRef, anyhow::Error> {\n    env.meta_client().ok_or_else(|| anyhow!(\"meta client is required for Iceberg writer\"))\n}","tryCatchPattern":"let meta_client = params.env.meta_client().ok_or_else(|| anyhow!(\"meta client is required for Iceberg writer\"))?;","preventionTips":["Never construct SinkWriterParam with `meta_client: None` for Iceberg pk sinks.","Use cluster-backed environments for any integration test touching Iceberg sinks.","Fail at graph-scheduling time if the environment lacks a meta client."],"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"}