{"record":{"id":"af881a51ed993618","repo":"MyCATApache/Mycat-Server","slug":"id-slaveids-range-must-be-2-size","errorCode":null,"errorMessage":"${id}slaveIds range must be 2  size","messagePattern":"(.+?)slaveIds range must be 2  size","errorType":"exception","errorClass":"java.lang.RuntimeException","httpStatus":null,"severity":"error","filePath":"src/main/java/io/mycat/server/handler/MigrateHandler.java","lineNumber":409,"sourceCode":"        } finally {\n            try {\n                slaveIDsLock.release();\n            } catch (Exception e) {\n                LOGGER.error(\"error:\", e);\n            }\n        }\n\n        throw new RuntimeException(\"cannot get the slaveID  for dataHost :\" + dbNode.getDbPool().getHostName());\n    }\n\n    private static List<Integer> parseSlaveIDs(String slaveIDs) {\n        List<Integer> allSlaveList = new ArrayList<>();\n        List<String> stringList = Splitter.on(\",\").omitEmptyStrings().trimResults().splitToList(slaveIDs);\n        for (String id : stringList) {\n            if (id.contains(\"-\")) {\n                List<String> idRangeList = Splitter.on(\"-\").omitEmptyStrings().trimResults().splitToList(id);\n                if (idRangeList.size() != 2)\n                    throw new RuntimeException(id + \"slaveIds range must be 2  size\");\n                for (int i = Integer.parseInt(idRangeList.get(0)); i <= Integer.parseInt(idRangeList.get(1)); i++) {\n                    allSlaveList.add(i);\n                }\n\n            } else {\n                allSlaveList.add(Integer.parseInt(id));\n            }\n        }\n        return allSlaveList;\n    }\n\n\n    private static OkPacket getOkPacket() {\n        OkPacket packet = new OkPacket();\n        packet.packetId = 1;\n        packet.affectedRows = 0;\n        packet.serverStatus = 2;\n        return packet;","sourceCodeStart":391,"sourceCodeEnd":427,"githubUrl":"https://github.com/MyCATApache/Mycat-Server/blob/65f8d8beb752f935752f2a0eec0ab017facab9ef/src/main/java/io/mycat/server/handler/MigrateHandler.java#L391-L427","documentation":"MigrateHandler.parseSlaveIDs parses a comma-separated slave ID list where each element may be a single ID or a range like '1-5'. When a range element does not split into exactly two parts (e.g. '1-5-9' or 'a--b'), it throws this RuntimeException because a range is only meaningful with a start and an end.","triggerScenarios":"Calling migration APIs (allSlaveIDList -> parseSlaveIDs) with a slaveIDs string containing a hyphenated range with more or fewer than two segments, e.g. 'slaveIDs=1-2-3' or 'slaveIDs=-1-' handled by omitEmptyStrings edge cases, or a typo like '1--5'.","commonSituations":"Operators hand-editing migration/switch DDL commands and mistyping ranges; scripts generating ID ranges that concatenate an extra '-'; copy-paste from docs adding trailing dashes.","solutions":["Correct the slaveIDs range to exactly two values, e.g. '1-5' instead of '1-5-9' or '1--5'.","Use plain comma-separated single IDs if no range is needed, e.g. '1,2,3'.","Pre-validate the slaveIDs string in tooling with a regex like '\\d+-\\d+|\\d+' before invoking migration."],"exampleFix":"// before\nslaveIds=\"1-2-3\"\n// after\nslaveIds=\"1-3\"","handlingStrategy":"validation","validationCode":"// java\nif (!slaveIDs.matches(\"(\\\\d+(\\\\s*,\\\\s*\\\\d+-\\\\d+)*\\\\s*)*\")) {\n    throw new IllegalArgumentException(\"bad slaveIDs: \" + slaveIDs);\n}\nfor (String id : slaveIDs.split(\",\")) {\n    if (id.contains(\"-\") && id.split(\"-\").length != 2)\n        throw new IllegalArgumentException(\"range must have 2 parts: \" + id);\n}","typeGuard":null,"tryCatchPattern":"try { List<Integer> ids = MigrateHandler.allSlaveIDList(slaveIDs); } catch (RuntimeException e) { log.error(\"invalid slaveIDs format\", e); }","preventionTips":["Generate slaveIDs programmatically instead of hand-editing.","Unit-test range strings before running migrations.","Prefer explicit comma lists over ranges in scripts."],"tags":["migration","parsing","invalid-input"],"backgroundTag":"invalid-argument-format","analyzedSha":"65f8d8beb752f935752f2a0eec0ab017facab9ef","analyzedAt":"2026-09-11T00:12:21.696Z","contentChangedAt":"2026-09-11T00:12:21.696Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}