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
- Fix the GTID set to canonical form 'uuid:1-5,uuid2:1-3' (comma-separated, each uuid:range)
- Validate with SELECT @@GLOBAL.gtid_executed on the MySQL server and copy it verbatim
- 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
- Copy GTID sets verbatim from SELECT @@GLOBAL.gtid_executed
- Use uuid:range pairs; validate format before submission
- Test GTID parsing in unit tests with representative values
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
- MySQL-CDC diagnostic: GTID set is not available on server…
- MySQL-CDC diagnostic: master status file=
- ' ' must not be blank.
- Need to add support for executed GTIDs for versions prior…
- Unexpected error while connecting to MySQL and looking at…
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)