{"record":{"id":"66be1192db5da416","repo":"apache/seatunnel","slug":"config-validation-failed-66be11","errorCode":"CONFIG_VALIDATION_FAILED","errorMessage":"PluginName: Doris, Message: Option '<optionName>' cannot be blank.","messagePattern":"PluginName: Doris, Message: Option '<optionName>' cannot be blank\\.","errorType":"error_code","errorClass":"DorisConnectorException","httpStatus":null,"severity":"error","filePath":"seatunnel-connectors-v2/connector-doris/src/main/java/org/apache/seatunnel/connectors/doris/sink/writer/DorisNodeResolver.java","lineNumber":36,"sourceCode":"package org.apache.seatunnel.connectors.doris.sink.writer;\n\nimport org.apache.seatunnel.shade.org.apache.commons.lang3.StringUtils;\n\nimport org.apache.seatunnel.api.common.SeaTunnelAPIErrorCode;\nimport org.apache.seatunnel.connectors.doris.exception.DorisConnectorException;\n\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.stream.Collectors;\n\n/** Utilities for parsing FE/BE host lists used by Doris stream load. */\npublic final class DorisNodeResolver {\n\n    private DorisNodeResolver() {}\n\n    public static List<String> parseNodes(String rawNodes, String optionName) {\n        if (StringUtils.isBlank(rawNodes)) {\n            throw new DorisConnectorException(\n                    SeaTunnelAPIErrorCode.CONFIG_VALIDATION_FAILED,\n                    String.format(\n                            \"PluginName: Doris, Message: Option '%s' cannot be blank.\",\n                            optionName));\n        }\n\n        return Arrays.stream(rawNodes.split(\",\"))\n                .map(String::trim)\n                .peek(node -> validateNode(node, optionName))\n                .collect(Collectors.toList());\n    }\n\n    private static void validateNode(String node, String optionName) {\n        if (StringUtils.isBlank(node)) {\n            throw new DorisConnectorException(\n                    SeaTunnelAPIErrorCode.CONFIG_VALIDATION_FAILED,\n                    String.format(\n                            \"PluginName: Doris, Message: Option '%s' contains a blank node entry.\",","sourceCodeStart":18,"sourceCodeEnd":54,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-doris/src/main/java/org/apache/seatunnel/connectors/doris/sink/writer/DorisNodeResolver.java#L18-L54","documentation":"DorisNodeResolver.parseNodes validates that the raw node list string (e.g. the frontends or benodes option) is not blank before splitting it into host:port entries. An empty or whitespace-only value yields this CONFIG_VALIDATION_FAILED error naming the offending option. It fails fast at sink initialization instead of producing confusing network errors later.","triggerScenarios":"DorisNodeResolver.parseNodes called with a null/empty/whitespace rawNodes string, e.g. sink.frontends = \"\" or the option omitted entirely from the HOCON config.","commonSituations":"User commented out the frontends option but left it empty; config templating substituted an empty value; using direct_to_be mode without configuring benodes.","solutions":["Set the option to a non-empty comma-separated list of host:port, e.g. frontends = \"fe1:8030,fe2:8030\"","Check the rendered config after any templating/env substitution — the value may be interpolated to empty","If you intend FE defaults instead, configure the option explicitly anyway; the connector requires at least one node"],"exampleFix":"// before\nfrontends = \"\";\n// after\nfrontends = \"doris-fe-1:8030,doris-fe-2:8030\";","handlingStrategy":"validation","validationCode":"final String frontends = config.getString(\"frontends\");\nif (frontends == null || frontends.isBlank()) throw new IllegalArgumentException(\"frontends must be a non-empty host:port list\");","typeGuard":null,"tryCatchPattern":"try { resolver = DorisNodeResolver.parseNodes(cfg.frontends, \"frontends\"); } catch (DorisConnectorException e) { /* prompt user to set frontends before submitting */ }","preventionTips":["Always set frontends/benodes explicitly in the sink config","Check templating output — env-var interpolation can yield empty strings","Add a config linter that rejects empty connector options"],"tags":["doris","config-validation","empty-value"],"backgroundTag":"empty-required-field","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}