diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index e09714f8cb4..54b4057369e 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -679,6 +679,9 @@ Release 2.7.0 - UNRELEASED HDFS-7832. Show 'Last Modified' in Namenode's 'Browse Filesystem' (vinayakumarb) + HDFS-7819. Log WARN message for the blocks which are not in Block ID based + layout (Rakesh R via Colin P. McCabe) + OPTIMIZATIONS HDFS-7454. Reduce memory footprint for AclEntries in NameNode. diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DirectoryScanner.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DirectoryScanner.java index 71f976b05fa..09c2914d363 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DirectoryScanner.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DirectoryScanner.java @@ -597,14 +597,15 @@ public class DirectoryScanner implements Runnable { for (String bpid : bpList) { LinkedList report = new LinkedList(); File bpFinalizedDir = volume.getFinalizedDir(bpid); - result.put(bpid, compileReport(volume, bpFinalizedDir, report)); + result.put(bpid, + compileReport(volume, bpFinalizedDir, bpFinalizedDir, report)); } return result; } /** Compile list {@link ScanInfo} for the blocks in the directory */ - private LinkedList compileReport(FsVolumeSpi vol, File dir, - LinkedList report) { + private LinkedList compileReport(FsVolumeSpi vol, + File bpFinalizedDir, File dir, LinkedList report) { File[] files; try { files = FileUtil.listFiles(dir); @@ -622,12 +623,14 @@ public class DirectoryScanner implements Runnable { */ for (int i = 0; i < files.length; i++) { if (files[i].isDirectory()) { - compileReport(vol, files[i], report); + compileReport(vol, bpFinalizedDir, files[i], report); continue; } if (!Block.isBlockFilename(files[i])) { if (isBlockMetaFile("blk_", files[i].getName())) { long blockId = Block.getBlockId(files[i].getName()); + verifyFileLocation(files[i].getParentFile(), bpFinalizedDir, + blockId); report.add(new ScanInfo(blockId, null, files[i], vol)); } continue; @@ -646,9 +649,24 @@ public class DirectoryScanner implements Runnable { break; } } + verifyFileLocation(blockFile.getParentFile(), bpFinalizedDir, + blockId); report.add(new ScanInfo(blockId, blockFile, metaFile, vol)); } return report; } + + /** + * Verify whether the actual directory location of block file has the + * expected directory path computed using its block ID. + */ + private void verifyFileLocation(File actualBlockDir, + File bpFinalizedDir, long blockId) { + File blockDir = DatanodeUtil.idToBlockDir(bpFinalizedDir, blockId); + if (actualBlockDir.compareTo(blockDir) != 0) { + LOG.warn("Block: " + blockId + + " has to be upgraded to block ID-based layout"); + } + } } }