From 4014ce5990bff9b0ecb3d38a633d40eaf6cf07a7 Mon Sep 17 00:00:00 2001 From: Vinayakumar B Date: Thu, 10 Sep 2015 00:08:19 +0530 Subject: [PATCH] HDFS-8581. ContentSummary on / skips further counts on yielding lock (contributed by J.Andreina) --- hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt | 3 ++ .../hdfs/server/namenode/INodeDirectory.java | 2 +- .../org/apache/hadoop/hdfs/TestQuota.java | 32 +++++++++++++++++++ 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index 8edc3895ec..bbb6066e17 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -1326,6 +1326,9 @@ Release 2.8.0 - UNRELEASED HDFS-8939. Test(S)WebHdfsFileContextMainOperations failing on branch-2. (Chris Nauroth via jghoman) + HDFS-8581. ContentSummary on / skips further counts on yielding lock + (J.Andreina via vinayakumarb) + Release 2.7.2 - UNRELEASED INCOMPATIBLE CHANGES diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/INodeDirectory.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/INodeDirectory.java index 5c33c02a61..21fe313ca9 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/INodeDirectory.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/INodeDirectory.java @@ -660,7 +660,7 @@ protected ContentSummaryComputationContext computeDirectoryContentSummary( continue; } // The locks were released and reacquired. Check parent first. - if (getParent() == null) { + if (!isRoot() && getParent() == null) { // Stop further counting and return whatever we have so far. break; } diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestQuota.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestQuota.java index e339049d10..00ff07f15d 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestQuota.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestQuota.java @@ -24,12 +24,14 @@ import static org.junit.Assert.fail; import java.io.ByteArrayOutputStream; +import java.io.IOException; import java.io.OutputStream; import java.io.PrintStream; import java.security.PrivilegedExceptionAction; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.ContentSummary; +import org.apache.hadoop.fs.FSDataOutputStream; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.StorageType; @@ -1007,4 +1009,34 @@ public void testSetSpaceQuotaWhenStorageTypeIsWrong() throws Exception { assertTrue(errOutput.contains(StorageType.getTypesSupportingQuota() .toString())); } + + /** + * File count on root , should return total value of files in Filesystem + * when one folder contains files more than "dfs.content-summary.limit". + */ + @Test + public void testHugeFileCount() throws IOException { + MiniDFSCluster cluster = null; + Configuration conf = new Configuration(); + conf.setInt("dfs.content-summary.limit", 4); + try { + cluster = new MiniDFSCluster.Builder(conf).numDataNodes(0).build(); + DistributedFileSystem dfs = cluster.getFileSystem(); + for (int i = 1; i <= 5; i++) { + FSDataOutputStream out = + dfs.create(new Path("/Folder1/" + "file" + i),(short)1); + out.close(); + } + FSDataOutputStream out = dfs.create(new Path("/Folder2/file6"),(short)1); + out.close(); + ContentSummary contentSummary = dfs.getContentSummary(new Path("/")); + assertEquals(6, contentSummary.getFileCount()); + } finally { + if (cluster != null) { + cluster.shutdown(); + cluster = null; + } + } + } + }