apache/seatunnel · error · DorisConnectorException
CONFIG_VALIDATION_FAILED
CONFIG_VALIDATION_FAILED
Error message
PluginName: Doris, Message: Option '<optionName>' cannot be blank.
What it means
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.
Source
Thrown at seatunnel-connectors-v2/connector-doris/src/main/java/org/apache/seatunnel/connectors/doris/sink/writer/DorisNodeResolver.java:36
package org.apache.seatunnel.connectors.doris.sink.writer;
import org.apache.seatunnel.shade.org.apache.commons.lang3.StringUtils;
import org.apache.seatunnel.api.common.SeaTunnelAPIErrorCode;
import org.apache.seatunnel.connectors.doris.exception.DorisConnectorException;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/** Utilities for parsing FE/BE host lists used by Doris stream load. */
public final class DorisNodeResolver {
private DorisNodeResolver() {}
public static List<String> parseNodes(String rawNodes, String optionName) {
if (StringUtils.isBlank(rawNodes)) {
throw new DorisConnectorException(
SeaTunnelAPIErrorCode.CONFIG_VALIDATION_FAILED,
String.format(
"PluginName: Doris, Message: Option '%s' cannot be blank.",
optionName));
}
return Arrays.stream(rawNodes.split(","))
.map(String::trim)
.peek(node -> validateNode(node, optionName))
.collect(Collectors.toList());
}
private static void validateNode(String node, String optionName) {
if (StringUtils.isBlank(node)) {
throw new DorisConnectorException(
SeaTunnelAPIErrorCode.CONFIG_VALIDATION_FAILED,
String.format(
"PluginName: Doris, Message: Option '%s' contains a blank node entry.",View on GitHub (pinned to cf67b549a7)
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
Example fix
// before frontends = ""; // after frontends = "doris-fe-1:8030,doris-fe-2:8030";
Defensive patterns
Strategy: validation
Validate before calling
final String frontends = config.getString("frontends");
if (frontends == null || frontends.isBlank()) throw new IllegalArgumentException("frontends must be a non-empty host:port list"); Try / catch
try { resolver = DorisNodeResolver.parseNodes(cfg.frontends, "frontends"); } catch (DorisConnectorException e) { /* prompt user to set frontends before submitting */ } Prevention
- 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
When it happens
Trigger: DorisNodeResolver.parseNodes called with a null/empty/whitespace rawNodes string, e.g. sink.frontends = "" or the option omitted entirely from the HOCON config.
Common situations: User commented out the frontends option but left it empty; config templating substituted an empty value; using direct_to_be mode without configuring benodes.
Understand the failure class
Background: "must not be empty", "cannot be empty" — required-field validation errors across open-source libraries — this error's family across 41 libraries.
Related errors
- CONFIG_VALIDATION_FAILED
- Please configure unique `database`.`table`, not allow null/d
- Please configure `database`, not allow null database in conf
- Please configure `table`, not allow null table in config.
- port must be positive
AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10).
Data as JSON: /api/errors/66be1192db5da416.
Report an issue: GitHub.