{"record":{"id":"183c823d9ef9f682","repo":"MyCATApache/Mycat-Server","slug":"datanode-name-duplicated","errorCode":null,"errorMessage":"dataNode ${name} duplicated!","messagePattern":"dataNode (.+?) duplicated!","errorType":"exception","errorClass":"ConfigException","httpStatus":null,"severity":"error","filePath":"src/main/java/io/mycat/config/loader/xml/XMLSchemaLoader.java","lineNumber":681,"sourceCode":"        List<String[]> mhdList = new ArrayList<>();\n        for (int i = 0; i < hostStrings.length; i++) {\n            String hostString = hostStrings[i];\n            for (int i1 = 0; i1 < databases.length; i1++) {\n                String database = databases[i1];\n                String[] hd = new String[2];\n                hd[0] = hostString;\n                hd[1] = database;\n                mhdList.add(hd);\n            }\n        }\n        return mhdList;\n    }\n\n    private void createDataNode(String dnName, String database, String host) {\n\n        DataNodeConfig conf = new DataNodeConfig(dnName, database, host);\n        if (dataNodes.containsKey(conf.getName())) {\n            throw new ConfigException(\"dataNode \" + conf.getName() + \" duplicated!\");\n        }\n\n        if (!dataHosts.containsKey(host)) {\n            throw new ConfigException(\"dataNode \" + dnName + \" reference dataHost:\" + host + \" not exists!\");\n        }\n\n        dataHosts.get(host).addDataNode(conf.getName());\n        dataNodes.put(conf.getName(), conf);\n    }\n\n    private boolean empty(String dnName) {\n        return dnName == null || dnName.length() == 0;\n    }\n\n    private DBHostConfig createDBHostConf(String dataHost, Element node,\n                                          String dbType, String dbDriver, int maxCon, int minCon, String filters, long logTime) {\n\n        String nodeHost = node.getAttribute(\"host\");","sourceCodeStart":663,"sourceCodeEnd":699,"githubUrl":"https://github.com/MyCATApache/Mycat-Server/blob/65f8d8beb752f935752f2a0eec0ab017facab9ef/src/main/java/io/mycat/config/loader/xml/XMLSchemaLoader.java#L663-L699","documentation":"Thrown by XMLSchemaLoader.createDataNode when two <dataNode> definitions expand to the same name. The dataNodes map is keyed by name; a duplicate would silently overwrite host/database bindings, so schema loading fails.","triggerScenarios":"Two <dataNode> elements with the same name attribute; overlapping range expansions like dn1$0-5 in one element and dn1$3-7 in another; the same dataNode declared in multiple schema files.","commonSituations":"Copy-pasting dataNode blocks; range expansions that overlap; merging configs from different environments that both define dn1..dn10.","solutions":["Remove or rename the duplicate <dataNode> definition in schema.xml","Make range expansions non-overlapping (e.g. dn1$0-5 and dn1$6-9)","Search schema.xml for the reported name to find all conflicting declarations"],"exampleFix":"// before (schema.xml)\n<dataNode name=\"dn1$0-5\" dataHost=\"h1\" database=\"db1\" />\n<dataNode name=\"dn1$3-7\" dataHost=\"h1\" database=\"db1\" /> <!-- overlaps 3-5 -->\n// after\n<dataNode name=\"dn1$0-5\" dataHost=\"h1\" database=\"db1\" />\n<dataNode name=\"dn1$6-9\" dataHost=\"h1\" database=\"db1\" />","handlingStrategy":"validation","validationCode":"// detect overlapping dataNode names (including ranges) before load\nSet<String> seen = new HashSet<>();\nfor (Element dn : dataNodeElements(\"schema.xml\")) {\n    for (String n : expand(dn.getAttribute(\"name\"))) { // expand $x-y ranges\n        if (!seen.add(n))\n            throw new IllegalStateException(\"Duplicate dataNode: \" + n);\n    }\n}","typeGuard":null,"tryCatchPattern":"try {\n    configLoader.load();\n} catch (ConfigException e) {\n    if (e.getMessage().contains(\"dataNode\") && e.getMessage().contains(\"duplicated!\")) {\n        String name = extractBetween(e.getMessage(), \"dataNode \", \" duplicated!\");\n        log.error(\"dataNode '\" + name + \"' declared more than once\", e);\n    }\n    throw e;\n}","preventionTips":["After editing range expressions, expand them mentally/on paper and check for overlaps","Keep each dataNode name defined in exactly one place","Add a CI lint that expands ranges and reports duplicates"],"tags":["config","xml","duplicate-key","datanode"],"backgroundTag":"conflicting-config-options","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"}