apache/hadoop · warning · UnregisteredNodeException

Data node {nodeID} is attempting to report storage ID {datan

Error message

Data node {nodeID} is attempting to report storage ID {datanodeUuid}. Node {storedNode} is expected to serve this storage.

What it means

Message produced by UnregisteredNodeException(DatanodeID, null) thrown in BlockManager.checkBlockReportLease when a datanode sends a full block report whose BlockReportContext carries a lease id, but the NameNode cannot resolve nodeID to a DatanodeDescriptor (getDatanode returns null). Since HDFS-14377 full block reports are lease-coordinated; reporting with an unknown identity means the node is not registered (or was dropped), so the report is rejected with 'Data node X is attempting to report storage ID ... Node null is expected to serve this storage.'

Source

Thrown at hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/BlockManager.java:2899

    BlockInfoToAdd(BlockInfo stored, Block reported) {
      this.stored = stored;
      this.reported = reported;
    }
  }

  /**
   * Check block report lease.
   * @return true if lease exist and not expire
   */
  public boolean checkBlockReportLease(BlockReportContext context,
      final DatanodeID nodeID) throws UnregisteredNodeException {
    if (context == null) {
      return true;
    }
    DatanodeDescriptor node = datanodeManager.getDatanode(nodeID);
    if (node == null) {
      throw new UnregisteredNodeException(nodeID, null);
    }
    final long startTime = Time.monotonicNow();
    return blockReportLeaseManager.checkLease(node, startTime,
        context.getLeaseId());
  }

  /**
   * The given storage is reporting all its blocks.
   * Update the (storage{@literal -->}block list) and
   * (block{@literal -->}storage list) maps.
   *
   * @return true if all known storages of the given DN have finished reporting.
   * @throws IOException
   */
  public boolean processReport(final DatanodeID nodeID,
      final DatanodeStorage storage,
      final BlockListAsLongs newReport,
      BlockReportContext context) throws IOException {

View on GitHub (pinned to 2add963021)

Solutions

  1. Verify the datanode is registered with the active NN: `hdfs dfsadmin -report`; restart the datanode if not
  2. After NN restart/failover, wait for datanodes to re-register and re-run block reports; the rejected report is retried on the next BR cycle
  3. Check NN logs for why the node was dropped (denied by include-list, decommission) and fix accordingly
  4. Ensure only one active NN (split-brain check) so DNs are not reporting to a stale active

Example fix

# before: BR lease check fails post-failover
# NN log: ProcessReport ... UnregisteredNodeException: Data node 10.0.0.5 is attempting to report storage ID ...

# after: force re-registration with active NN, then next block report succeeds
hdfs haadmin -getAllServiceState | grep active   # identify active NN
hdfs --daemon restart datanode
Defensive patterns

Strategy: retry

Try / catch

// Datanode-side BP service actor pattern:
try {
  nn.blockReport(...context with leaseId...);
} catch (UnregisteredNodeException e) {
  // re-register with the active NN, then retry the report next cycle
  register(); scheduleNextBlockReportImmediately();
}

Prevention

When it happens

Trigger: Datanode sends a full block report (with non-null BlockReportContext) after the NN restarted/failed over and its registration was lost, or the node was decommissioned/removed; delayed/raced BR RPCs from a previous NN incarnation arriving at a new active NN.

Common situations: NameNode restart or HA failover while datanodes are mid block-report cycle; NN evicted the node (decommission, registration timeout); standby-to-active transition where the DN has not yet re-registered with the new active.

Related errors


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