apache/hadoop · error · IllegalArgumentException

, which is located at , is not a descendant of

Error message

${name}, which is located at ${networkLocation}, is not a descendant of ${path}

What it means

IllegalArgumentException from InnerNodeImpl.add(Node) when the node being added is not located under this inner node: n's network location does not begin with this node's path, so it cannot become a child. The message includes the node name, its network location, and the path it was expected to descend from. The check keeps the topology tree consistent — you can only add '/dc1/rack1/node1' to '/dc1/rack1' or its ancestors.

Solutions

  1. Before add(), verify isAncestor(n) or use NetworkTopology.add() which locates the correct parent instead of guessing
  2. Normalize all network locations in the topology script: leading '/', no trailing '/', same depth everywhere
  3. Check that getLeaf/getInner lookups use the same location format that was used at Node registration

Example fix

// before
innerNodeRackA.add(nodeInRackB); // nodeInRackB.getNetworkLocation()=/rackB -> IllegalArgumentException

// after
NetworkTopology clusterTopology = new NetworkTopologyImpl();
clusterTopology.add(nodeInRackB); // routes to the correct parent automatically
Defensive patterns

Strategy: validation

Validate before calling

if (!innerNode.isAncestor(n)) {
  // do not guess the parent; let NetworkTopology locate it
  topology.add(n);
  return;
}

Try / catch

catch (IllegalArgumentException e) { /* 'not a descendant of' */ log n's location vs expected path; re-resolve parent via getInner/NetworkTopology; }

Prevention

When it happens

Trigger: Adding a DataNode whose network location is '/rackB' to an InnerNode with path '/rackA'; calling add() on a node obtained by getLeaf while the leaf's location changed; mixing relative ('rack1') and absolute ('/rack1') location strings so the prefix test fails.

Common situations: Topology script returning different racks for the same node over time; DataNodes re-registered with a changed network location; custom Node implementations whose getNetworkLocation() is not normalized.

Related errors


AI-assisted analysis of apache/hadoop@2add963021 (2026-08-22). Data as JSON: /api/errors/2a91c5c842b7a632. Report an issue: GitHub.

Appendix: source

Thrown at hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/net/InnerNodeImpl.java:132

    if (!isAncestor(n)) {
      throw new IllegalArgumentException(
                                         this + "is not an ancestor of " + n);
    }
    String name = n.getNetworkLocation().substring(getPath(this).length());
    if (name.charAt(0) == PATH_SEPARATOR) {
      name = name.substring(1);
    }
    int index=name.indexOf(PATH_SEPARATOR);
    if (index != -1) {
      name = name.substring(0, index);
    }
    return name;
  }

  @Override
  public boolean add(Node n) {
    if (!isAncestor(n)) {
      throw new IllegalArgumentException(n.getName()
          + ", which is located at " + n.getNetworkLocation()
          + ", is not a descendant of " + getPath(this));
    }
    if (isParent(n)) {
      // this node is the parent of n; add n directly
      n.setParent(this);
      n.setLevel(this.level+1);
      Node prev = childrenMap.put(n.getName(), n);
      if (prev != null) {
        for(int i=0; i<children.size(); i++) {
          if (children.get(i).getName().equals(n.getName())) {
            children.set(i, n);
            return false;
          }
        }
      }
      children.add(n);
      numOfLeaves++;

View on GitHub (pinned to 2add963021)