{"record":{"id":"5a0877bedfb77e78","repo":"risingwavelabs/risingwave","slug":"compaction-write-parquet-max-row-group-rows-must-5a0877","errorCode":null,"errorMessage":"`compaction.write_parquet_max_row_group_rows` must be greater than 0","messagePattern":"`compaction\\.write_parquet_max_row_group_rows` must be greater than 0","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/connector/src/sink/iceberg/mod.rs","lineNumber":344,"sourceCode":"        {\n            bail!(\n                \"`compaction.max_snapshots_num` must be greater than 0, got: {}\",\n                max_snapshots\n            );\n        }\n\n        // Validate target file size\n        if let Some(target_file_size_mb) = iceberg_config.target_file_size_mb\n            && target_file_size_mb == 0\n        {\n            bail!(\"`compaction.target_file_size_mb` must be greater than 0\");\n        }\n\n        // Validate parquet max row group rows\n        if let Some(max_row_group_rows) = iceberg_config.write_parquet_max_row_group_rows\n            && max_row_group_rows == 0\n        {\n            bail!(\"`compaction.write_parquet_max_row_group_rows` must be greater than 0\");\n        }\n\n        // Validate parquet max row group bytes\n        if let Some(max_row_group_bytes) = iceberg_config.write_parquet_max_row_group_bytes\n            && max_row_group_bytes == 0\n        {\n            bail!(\"`compaction.write_parquet_max_row_group_bytes` must be greater than 0\");\n        }\n\n        // Validate parquet compression codec\n        if let Some(ref compression) = iceberg_config.write_parquet_compression {\n            let valid_codecs = [\n                \"uncompressed\",\n                \"snappy\",\n                \"gzip\",\n                \"lzo\",\n                \"brotli\",\n                \"lz4\",","sourceCodeStart":326,"sourceCodeEnd":362,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/connector/src/sink/iceberg/mod.rs#L326-L362","documentation":"The altered Iceberg sink config requires `compaction.write_parquet_max_row_group_rows` to be positive. Zero rows per Parquet row group is invalid (no rows could ever be written per group), so validation rejects it.","triggerScenarios":"`ALTER SINK ... SET` with `compaction.write_parquet_max_row_group_rows = '0'`.","commonSituations":"Copy-pasted defaults that were zeroed; confusion with parquet writer tuning knobs; templating that substitutes 0 when a variable is unset.","solutions":["Set the property to a positive integer, e.g. `1000000` (1M rows per row group).","Remove the property to use the sink's default row group size.","If tuning memory, lower bytes (`compaction.write_parquet_max_row_group_bytes`) instead of zeroing rows."],"exampleFix":"-- before\nALTER SINK s SET ('compaction.write_parquet_max_row_group_rows'='0');\n-- after\nALTER SINK s SET ('compaction.write_parquet_max_row_group_rows'='1000000');","handlingStrategy":"validation","validationCode":"fn valid_row_group_rows(cfg: &std::collections::BTreeMap<String, String>) -> Result<(), String> {\n    if let Some(s) = cfg.get(\"compaction.write_parquet_max_row_group_rows\") {\n        if s.parse::<u64>().unwrap_or(0) == 0 {\n            return Err(\"compaction.write_parquet_max_row_group_rows must be > 0\".into());\n        }\n    }\n    Ok(())\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Never zero any row-group knob; lower values only if memory constrained.","Set rows and bytes knobs together consistently."],"tags":["iceberg","sink","config","parquet"],"backgroundTag":"value-out-of-range","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"}