apache/seatunnel · error · FileConnectorException

CONFIG_VALIDATION_FAILED

CONFIG_VALIDATION_FAILED

Error message

Continuous enumerator can only be used when discovery_mode=continuous.

What it means

ContinuousMultipleTableFileSourceSplitEnumerator.validateContinuousDiscoveryConfig ensures the continuous split enumerator is only instantiated when discovery_mode=continuous. Any other discovery mode makes continuous enumeration semantics invalid, so CONFIG_VALIDATION_FAILED is thrown.

Source

Thrown at seatunnel-connectors-v2/connector-file/connector-file-base/src/main/java/org/apache/seatunnel/connectors/seatunnel/file/source/split/ContinuousMultipleTableFileSourceSplitEnumerator.java:1382

            return null;
        }
        try {
            return metricsContext.counter(name);
        } catch (Exception e) {
            return null;
        }
    }

    private static void incCounter(Counter counter) {
        if (counter != null) {
            counter.inc();
        }
    }

    private static void validateContinuousDiscoveryConfig(List<BaseFileSourceConfig> configs) {
        FileDiscoveryMode mode = resolveGlobalOption(configs, FileBaseSourceOptions.DISCOVERY_MODE);
        if (mode != FileDiscoveryMode.CONTINUOUS) {
            throw new FileConnectorException(
                    SeaTunnelAPIErrorCode.CONFIG_VALIDATION_FAILED,
                    "Continuous enumerator can only be used when discovery_mode=continuous.");
        }
        for (BaseFileSourceConfig cfg : configs) {
            ReadonlyConfig c = cfg.getBaseFileSourceConfig();
            FileSyncMode syncMode = c.get(FileBaseSourceOptions.SYNC_MODE);
            if (syncMode != FileSyncMode.UPDATE) {
                throw new FileConnectorException(
                        SeaTunnelAPIErrorCode.CONFIG_VALIDATION_FAILED,
                        "discovery_mode=continuous currently requires sync_mode=update.");
            }
            FileFormat fileFormat = c.get(FileBaseSourceOptions.FILE_FORMAT_TYPE);
            if (fileFormat != FileFormat.BINARY) {
                throw new FileConnectorException(
                        SeaTunnelAPIErrorCode.CONFIG_VALIDATION_FAILED,
                        "discovery_mode=continuous currently only supports file_format_type=binary.");
            }
            Duration interval = c.get(FileBaseSourceOptions.SCAN_INTERVAL);

View on GitHub (pinned to cf67b549a7)

Solutions

  1. Set discovery_mode = "continuous" in the source config.
  2. Disable continuous-specific options if periodic/batch discovery is actually desired.
  3. Align config with a documented continuous file-source example.

Example fix

// before
discovery_mode = "interval"
sync_mode = "update"
// after
discovery_mode = "continuous"
sync_mode = "update"
Defensive patterns

Strategy: validation

Validate before calling

if (!"continuous".equals(config.getString("discovery_mode"))) {
  throw new IllegalArgumentException("Continuous enumerator requires discovery_mode=continuous");
}

Try / catch

try {
  enumerator = new ContinuousMultipleTableFileSourceSplitEnumerator(...);
} catch (FileConnectorException e) {
  if (e.getMessage().contains("Continuous enumerator can only be used")) {
    throw new ConfigException("Set discovery_mode=continuous", e);
  }
  throw e;
}

Prevention

When it happens

Trigger: The source creates a continuous enumerator (e.g. because a continuous-specific option like scan interval/incremental sync is enabled) while discovery_mode is interval/once.

Common situations: Enabling streaming/incremental file watching but forgetting discovery_mode = "continuous"; mixing options from examples targeting different modes.

Understand the failure class

Background: Conflicting config options: "cannot be used together" — configuration validation errors across open-source libraries — this error's family across 162 libraries.

Related errors


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