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

  1. Set the option to a non-empty comma-separated list of host:port, e.g. frontends = "fe1:8030,fe2:8030"
  2. Check the rendered config after any templating/env substitution — the value may be interpolated to empty
  3. 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

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


AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10). Data as JSON: /api/errors/66be1192db5da416. Report an issue: GitHub.