apache/seatunnel · error · IllegalArgumentException

Invalid ' ' value ' '.

Error message

Invalid '${MySqlIncrementalSourceOptions.STARTUP_SPECIFIC_OFFSET_GTID_SET.key()}' value '${gtidSet}'.

What it means

The configured GTID set string failed parsing by Debezium's GtidSet constructor. The connector wraps the parse exception in an IllegalArgumentException naming the option and the offending value, so bad GTID syntax is rejected before the job starts.

Solutions

  1. Fix the GTID set to canonical form 'uuid:1-5,uuid2:1-3' (comma-separated, each uuid:range)
  2. Validate with SELECT @@GLOBAL.gtid_executed on the MySQL server and copy it verbatim
  3. Remove the option to fall back to file/position-based specific offsets

Example fix

// before
specific-offset.gtid-set = "3E11FA47-71CA-11E1-9E33-C80AA9429562"
// after
specific-offset.gtid-set = "3E11FA47-71CA-11E1-9E33-C80AA9429562:1-5"
Defensive patterns

Strategy: validation

Validate before calling

try {
    new io.debezium.connector.mysql.GtidSet(gtid.trim());
} catch (Exception e) {
    throw new IllegalArgumentException("Invalid gtid-set: " + gtid, e);
}

Type guard

boolean looksLikeGtidSet(String s) { return s != null && s.matches("[0-9a-fA-F-]{36}(:[0-9]+(-[0-9]+)?)(,[0-9a-fA-F-]{36}(:[0-9]+(-[0-9]+)?)*)*"); }

Try / catch

try { createSource(config); } catch (IllegalArgumentException e) { LOG.error("Unparseable gtid-set: {}", e.getMessage()); throw new ConfigException(e); }

Prevention

When it happens

Trigger: getValidatedGtidSet with specific-offset.gtid-set whose value cannot be parsed by new GtidSet(...) — e.g. malformed UUID, missing ':' interval, invalid characters.

Common situations: Typos in UUID (wrong length/hex chars); using comma-separated single UUIDs without :n-m ranges incorrectly; pasting output from a different MySQL tooling format; extra spaces or semicolons.

Understand the failure class

Background: "Invalid ... format", "must be in format X", "does not look like a ..." — invalid argument format errors across CLI tools and libraries — this error's family across 17 libraries.

Related errors


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

Appendix: source

Thrown at seatunnel-connectors-v2/connector-cdc/connector-cdc-mysql/src/main/java/org/apache/seatunnel/connectors/seatunnel/cdc/mysql/source/MySqlIncrementalSource.java:171

    private static Optional<String> getValidatedGtidSet(ReadonlyConfig config) {
        Optional<String> configuredGtidSet =
                config.getOptional(MySqlIncrementalSourceOptions.STARTUP_SPECIFIC_OFFSET_GTID_SET);
        if (!configuredGtidSet.isPresent()) {
            return Optional.empty();
        }

        String gtidSet = configuredGtidSet.get().trim();
        if (StringUtils.isBlank(gtidSet)) {
            throw new IllegalArgumentException(
                    String.format(
                            "'%s' must not be blank.",
                            MySqlIncrementalSourceOptions.STARTUP_SPECIFIC_OFFSET_GTID_SET.key()));
        }

        try {
            new GtidSet(gtidSet);
        } catch (Exception e) {
            throw new IllegalArgumentException(
                    String.format(
                            "Invalid '%s' value '%s'.",
                            MySqlIncrementalSourceOptions.STARTUP_SPECIFIC_OFFSET_GTID_SET.key(),
                            gtidSet),
                    e);
        }
        return Optional.of(gtidSet);
    }

    private static long getNonNegativeSkipValue(ReadonlyConfig config, Option<Long> option) {
        long value = config.getOptional(option).orElse(0L);
        if (value < 0) {
            throw new IllegalArgumentException(
                    String.format("'%s' must be greater than or equal to 0.", option.key()));
        }
        return value;
    }

View on GitHub (pinned to cf67b549a7)