{"record":{"id":"4d0cbf2290d75c89","repo":"apache/hadoop","slug":"not-allow-to-add-an-inner-node-4d0cbf","errorCode":null,"errorMessage":"Not allow to add an inner node: {}","messagePattern":"Not allow to add an inner node: (.+?)","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/net/NetworkTopologyWithNodeGroup.java","lineNumber":180,"sourceCode":"  /**\n   * Check if network topology is aware of NodeGroup\n   */\n  @Override\n  public boolean isNodeGroupAware() {\n    return true;\n  }\n\n  /** Add a leaf node\n   * Update node counter &amp; rack counter if necessary\n   * @param node node to be added; can be null\n   * @exception IllegalArgumentException if add a node to a leave \n   *                                     or node to be added is not a leaf\n   */\n  @Override\n  public void add(Node node) {\n    if (node==null) return;\n    if( node instanceof InnerNode ) {\n      throw new IllegalArgumentException(\n        \"Not allow to add an inner node: \"+NodeBase.getPath(node));\n    }\n    netlock.writeLock().lock();\n    try {\n      Node rack = null;\n\n      // if node only with default rack info, here we need to add default \n      // nodegroup info\n      if (NetworkTopology.DEFAULT_RACK.equals(node.getNetworkLocation())) {\n        node.setNetworkLocation(node.getNetworkLocation() + \n            NetworkTopologyWithNodeGroup.DEFAULT_NODEGROUP);\n      }\n      Node nodeGroup = getNode(node.getNetworkLocation());\n      if (nodeGroup == null) {\n        nodeGroup = new InnerNodeWithNodeGroup(node.getNetworkLocation());\n      }\n      rack = getNode(nodeGroup.getNetworkLocation());\n","sourceCodeStart":162,"sourceCodeEnd":198,"githubUrl":"https://github.com/apache/hadoop/blob/2add9630210752f88ceb1bb74eb65e37bf41da8e/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/net/NetworkTopologyWithNodeGroup.java#L162-L198","documentation":"NetworkTopologyWithNodeGroup models a three-level /rack/nodegroup/host topology. Its add(Node) override keeps the base class rule — only leaf nodes may be added — and throws IllegalArgumentException for any InnerNode (including InnerNodeWithNodeGroup) before taking the write lock.","triggerScenarios":"Calling add() on a node-group-aware topology with an InnerNode instance, e.g. a nodegroup created via factory.newInnerNode() or a node fetched with getNode() that is actually inner.","commonSituations":"Custom topology tooling for node-group clusters (Hadoop compute deployments using nodegroup-aware placement); re-adding nodes returned by lookups; mocks extending InnerNodeWithNodeGroup.","solutions":["Pass only leaf nodes (DatanodeDescriptor / NodeBase not extending InnerNode) to add()","Filter lookup results with !(node instanceof InnerNode) first","Never construct InnerNodeWithNodeGroup for registration; the topology creates nodegroups internally"],"exampleFix":"// before\ntopology.add(factory.newInnerNode(\"/rack1/ng1\")); // throws\n\n// after\nNode leaf = new NodeBase(\"host1:50010\", \"/rack1/ng1\");\ntopology.add(leaf);","handlingStrategy":"validation","validationCode":"if (node instanceof InnerNode) {\n  throw new IllegalArgumentException(\n      \"Refusing to add inner node \" + NodeBase.getPath(node));\n}\ntopologyWithNodeGroup.add(node);","typeGuard":"static boolean isAddableLeaf(Node n) {\n  return n != null && !(n instanceof InnerNode);\n}","tryCatchPattern":null,"preventionTips":["Reuse the leaf guard across base and node-group topologies","Do not register factory.newInnerNode() objects; add leaves only"],"tags":["hadoop-common","network-topology","nodegroup","invalid-argument"],"backgroundTag":"inner-node-rejected","analyzedSha":"2add9630210752f88ceb1bb74eb65e37bf41da8e","analyzedAt":"2026-08-22T19:55:07.957Z","schemaVersion":2},"datasetVersion":"2026-08-22T20:17:22.307Z"}