{"record":{"id":"01b5113a35e70e0b","repo":"apache/seatunnel","slug":"tables-configs-d-start-mode-offsets-must-not-01b511","errorCode":null,"errorMessage":"tables_configs[%d]: 'start.mode.offsets' must not be empty when start.mode=CONSUME_FROM_SPECIFIC_OFFSETS","messagePattern":"tables_configs\\[(.+?)\\]: 'start\\.mode\\.offsets' must not be empty when start\\.mode=CONSUME_FROM_SPECIFIC_OFFSETS","errorType":"error_code","errorClass":"OptionValidationException","httpStatus":null,"severity":"error","filePath":"seatunnel-connectors-v2/connector-rocketmq/src/main/java/org/apache/seatunnel/connectors/seatunnel/rocketmq/source/RocketMqSourceFactory.java","lineNumber":159,"sourceCode":"                                    .orElse(null);\n                    if (ts == null) {\n                        throw new OptionValidationException(\n                                \"tables_configs[%d]: 'start.mode.timestamp' required \"\n                                        + \"when start.mode=CONSUME_FROM_TIMESTAMP\",\n                                i);\n                    }\n                    if (ts < 0) {\n                        throw new OptionValidationException(\n                                \"tables_configs[%d]: 'start.mode.timestamp' must be >= 0, got: %d\",\n                                i, ts);\n                    }\n                } else if (startMode == StartMode.CONSUME_FROM_SPECIFIC_OFFSETS) {\n                    Map<String, Long> offsets =\n                            tableConfig\n                                    .getOptional(RocketMqSourceOptions.START_MODE_OFFSETS)\n                                    .orElse(null);\n                    if (offsets == null || offsets.isEmpty()) {\n                        throw new OptionValidationException(\n                                \"tables_configs[%d]: 'start.mode.offsets' must not be empty \"\n                                        + \"when start.mode=CONSUME_FROM_SPECIFIC_OFFSETS\",\n                                i);\n                    }\n                }\n            }\n            return true;\n        }\n    }\n}\n","sourceCodeStart":141,"sourceCodeEnd":170,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-rocketmq/src/main/java/org/apache/seatunnel/connectors/seatunnel/rocketmq/source/RocketMqSourceFactory.java#L141-L170","documentation":"When a tables_configs entry sets start.mode = CONSUME_FROM_SPECIFIC_OFFSETS, a non-empty `start.mode.offsets` map (topic/partition -> offset) must be provided. evaluate() throws OptionValidationException when the map is missing or empty.","triggerScenarios":"A table entry with start.mode=CONSUME_FROM_SPECIFIC_OFFSETS but no `start.mode.offsets` key, or an explicitly empty map, found during factory option validation.","commonSituations":"Nesting the offsets map at the wrong YAML level so it is not picked up, deleting offsets after a copy-paste, or forgetting that every entry in tables_configs needs its own offsets.","solutions":["Add `start.mode.offsets` as a map of queue/broker offsets for the entry","Verify the map is nested inside the same tables_configs entry as the start.mode","Use a different start mode (e.g. CONSUME_FROM_LATEST) if specific offsets are not actually needed"],"exampleFix":"// before\nstart.mode = \"CONSUME_FROM_SPECIFIC_OFFSETS\"\n// after\nstart.mode = \"CONSUME_FROM_SPECIFIC_OFFSETS\"\nstart.mode.offsets = { \"topicA:0\" = 100, \"topicA:1\" = 200 }","handlingStrategy":"validation","validationCode":"if (\"CONSUME_FROM_SPECIFIC_OFFSETS\".equals(cfg.get(\"start.mode\"))) {\n    Map<String, Long> offsets = (Map<String, Long>) cfg.get(\"start.mode.offsets\");\n    if (offsets == null || offsets.isEmpty())\n        throw new IllegalArgumentException(\"start.mode.offsets must be a non-empty map\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Nest start.mode.offsets inside the same table entry as start.mode","Validate HOCON/YAML nesting with a schema checker before submit","List every queue you need an offset for; verify with broker tooling"],"tags":["config","validation","rocketmq"],"backgroundTag":"missing-required-config-field","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}