{"record":{"id":"d69ae17444472191","repo":"apache/seatunnel","slug":"sourceoptions-startup-specific-offset-file-key-d69ae1","errorCode":null,"errorMessage":"'${SourceOptions.STARTUP_SPECIFIC_OFFSET_FILE.key()}' must not be blank.","messagePattern":"'(.+?)' must not be blank\\.","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"seatunnel-connectors-v2/connector-cdc/connector-cdc-mysql/src/main/java/org/apache/seatunnel/connectors/seatunnel/cdc/mysql/source/MySqlIncrementalSource.java","lineNumber":135,"sourceCode":"            throw new IllegalArgumentException(\n                    String.format(\n                            \"'%s' requires '%s' with '%s' when the mode is 'specific'.\",\n                            SourceOptions.STARTUP_MODE_KEY,\n                            SourceOptions.STARTUP_SPECIFIC_OFFSET_FILE.key(),\n                            SourceOptions.STARTUP_SPECIFIC_OFFSET_POS.key()));\n        }\n\n        long skipEvents =\n                getNonNegativeSkipValue(\n                        config, MySqlIncrementalSourceOptions.STARTUP_SPECIFIC_OFFSET_SKIP_EVENTS);\n        long skipRows =\n                getNonNegativeSkipValue(\n                        config, MySqlIncrementalSourceOptions.STARTUP_SPECIFIC_OFFSET_SKIP_ROWS);\n\n        Map<String, String> offset = new LinkedHashMap<>();\n        String file = config.get(SourceOptions.STARTUP_SPECIFIC_OFFSET_FILE);\n        if (StringUtils.isBlank(file)) {\n            throw new IllegalArgumentException(\n                    String.format(\n                            \"'%s' must not be blank.\",\n                            SourceOptions.STARTUP_SPECIFIC_OFFSET_FILE.key()));\n        }\n        offset.put(BinlogOffset.BINLOG_FILENAME_OFFSET_KEY, file);\n        offset.put(\n                BinlogOffset.BINLOG_POSITION_OFFSET_KEY,\n                String.valueOf(config.get(SourceOptions.STARTUP_SPECIFIC_OFFSET_POS)));\n        if (gtidSet.isPresent()) {\n            offset.put(BinlogOffset.GTID_SET_KEY, gtidSet.get());\n        }\n        offset.put(BinlogOffset.EVENTS_TO_SKIP_OFFSET_KEY, String.valueOf(skipEvents));\n        offset.put(BinlogOffset.ROWS_TO_SKIP_OFFSET_KEY, String.valueOf(skipRows));\n        return offset;\n    }\n\n    /* Validate the configured GTID set before adding it to Debezium's offset map. */\n    private static Optional<String> getValidatedGtidSet(ReadonlyConfig config) {","sourceCodeStart":117,"sourceCodeEnd":153,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-cdc/connector-cdc-mysql/src/main/java/org/apache/seatunnel/connectors/seatunnel/cdc/mysql/source/MySqlIncrementalSource.java#L117-L153","documentation":"The configured startup.specific-offset.file value is present but blank (empty or whitespace-only). A binlog filename is required to build the BinlogOffset, so createSpecificStartupOffset rejects it with an IllegalArgumentException.","triggerScenarios":"createSpecificStartupOffset with startup.mode='specific' where config.get(STARTUP_SPECIFIC_OFFSET_FILE) returns \"\" or \"   \" (StringUtils.isBlank).","commonSituations":"Config placeholder like specific-offset.file = \"\" left unfilled; env variable substitution produced an empty string; user pasted only a position and an empty file value.","solutions":["Set startup.specific-offset.file to a real binlog filename, e.g. \"mysql-bin.000003\"","Run SHOW BINARY LOG STATUS (or SHOW MASTER STATUS) on MySQL to obtain the current filename","Remove the empty key and use startup.mode='latest' if no fixed offset is wanted"],"exampleFix":"// before\nspecific-offset.file = \"\"\nspecific-offset.pos = 4\n// after\nspecific-offset.file = \"mysql-bin.000003\"\nspecific-offset.pos = 4","handlingStrategy":"validation","validationCode":"String file = config.getString(\"startup.specific-offset.file\");\nif (file == null || file.trim().isEmpty()) {\n    throw new IllegalArgumentException(\"startup.specific-offset.file must be a non-blank binlog filename\");\n}","typeGuard":"boolean validFile(String f) { return f != null && !f.trim().isEmpty(); }","tryCatchPattern":"try { createSource(config); } catch (IllegalArgumentException e) { LOG.error(\"Blank binlog file: {}\", e.getMessage()); throw new ConfigException(e); }","preventionTips":["Never leave placeholder empty strings in configs; delete unused keys","Substitute env vars before submission and assert non-empty","Copy filenames directly from SHOW BINARY LOG STATUS output"],"tags":["cdc","mysql","config-validation"],"backgroundTag":"empty-required-field","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}