HDFS-7503. Namenode restart after large deletions can cause slow processReport (Arpit Agarwal)
Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/390642ac Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/390642ac Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/390642ac Branch: refs/heads/YARN-2139 Commit: 390642acf35f3d599271617d30ba26c2f6406fc1 Parents: d693a25 Author: arp <a...@apache.org> Authored: Wed Dec 10 23:37:26 2014 -0800 Committer: arp <a...@apache.org> Committed: Wed Dec 10 23:44:28 2014 -0800 ---------------------------------------------------------------------- hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt | 3 +++ .../server/blockmanagement/BlockManager.java | 22 ++++++++++++++------ 2 files changed, 19 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/390642ac/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index fd48605..9049083 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -593,6 +593,9 @@ Release 2.6.1 - UNRELEASED HDFS-7489. Incorrect locking in FsVolumeList#checkDirs can hang datanodes (Noah Lorang via Colin P. McCabe) + HDFS-7503. Namenode restart after large deletions can cause slow + processReport. (Arpit Agarwal) + Release 2.6.0 - 2014-11-18 INCOMPATIBLE CHANGES http://git-wip-us.apache.org/repos/asf/hadoop/blob/390642ac/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/BlockManager.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/BlockManager.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/BlockManager.java index 2676696..5f718e7 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/BlockManager.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/BlockManager.java @@ -1785,6 +1785,8 @@ public class BlockManager { final long startTime = Time.now(); //after acquiring write lock final long endTime; DatanodeDescriptor node; + Collection<Block> invalidatedBlocks = null; + try { node = datanodeManager.getDatanode(nodeID); if (node == null || !node.isAlive) { @@ -1813,7 +1815,7 @@ public class BlockManager { // ordinary block reports. This shortens restart times. processFirstBlockReport(storageInfo, newReport); } else { - processReport(storageInfo, newReport); + invalidatedBlocks = processReport(storageInfo, newReport); } // Now that we have an up-to-date block report, we know that any @@ -1832,6 +1834,14 @@ public class BlockManager { namesystem.writeUnlock(); } + if (invalidatedBlocks != null) { + for (Block b : invalidatedBlocks) { + blockLog.info("BLOCK* processReport: " + b + " on " + node + + " size " + b.getNumBytes() + + " does not belong to any file"); + } + } + // Log the block report processing stats from Namenode perspective final NameNodeMetrics metrics = NameNode.getNameNodeMetrics(); if (metrics != null) { @@ -1875,8 +1885,9 @@ public class BlockManager { } } - private void processReport(final DatanodeStorageInfo storageInfo, - final BlockListAsLongs report) throws IOException { + private Collection<Block> processReport( + final DatanodeStorageInfo storageInfo, + final BlockListAsLongs report) throws IOException { // Normal case: // Modify the (block-->datanode) map, according to the difference // between the old and new block report. @@ -1907,14 +1918,13 @@ public class BlockManager { + " of " + numBlocksLogged + " reported."); } for (Block b : toInvalidate) { - blockLog.info("BLOCK* processReport: " - + b + " on " + node + " size " + b.getNumBytes() - + " does not belong to any file"); addToInvalidates(b, node); } for (BlockToMarkCorrupt b : toCorrupt) { markBlockAsCorrupt(b, storageInfo, node); } + + return toInvalidate; } /**