Repository: hadoop Updated Branches: refs/heads/branch-2 81f7e8af2 -> 891be3999
HDFS-9360. Storage type usage isn't updated properly after file deletion. Contributed by Ming Ma. (cherry picked from commit ea5bb483269b51a349c358b71f84904c76693a66) Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/891be399 Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/891be399 Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/891be399 Branch: refs/heads/branch-2 Commit: 891be39993ea72964d7266cc6c97ebbb759dda9a Parents: 81f7e8a Author: Xiaoyu Yao <x...@apache.org> Authored: Thu Nov 5 01:30:13 2015 -0800 Committer: Xiaoyu Yao <x...@apache.org> Committed: Thu Nov 5 01:40:05 2015 -0800 ---------------------------------------------------------------------- hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt | 3 ++ .../hadoop/hdfs/server/namenode/INodeFile.java | 4 +- .../java/org/apache/hadoop/hdfs/TestQuota.java | 55 +++++++++++++++++++- 3 files changed, 60 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/891be399/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 6aa9432..a7d742e 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -1390,6 +1390,9 @@ Release 2.8.0 - UNRELEASED HDFS-9357. NN UI renders icons of decommissioned DN incorrectly. (Surendra Singh Lilhore via wheat9) + HDFS-9360. Storage type usage isn't updated properly after file deletion. + (Ming Ma via xyao) + Release 2.7.3 - UNRELEASED INCOMPATIBLE CHANGES http://git-wip-us.apache.org/repos/asf/hadoop/blob/891be399/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/INodeFile.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/INodeFile.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/INodeFile.java index ce4ee9c..99faa19 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/INodeFile.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/INodeFile.java @@ -568,7 +568,9 @@ public class INodeFile extends INodeWithAdditionalFields byte blockStoragePolicyId, boolean useCache, int lastSnapshotId) { final QuotaCounts counts = new QuotaCounts.Builder().nameSpace(1).build(); - final BlockStoragePolicy bsp = bsps.getPolicy(blockStoragePolicyId); + final BlockStoragePolicy bsp = (blockStoragePolicyId == + BLOCK_STORAGE_POLICY_ID_UNSPECIFIED) ? null : + bsps.getPolicy(blockStoragePolicyId); FileWithSnapshotFeature sf = getFileWithSnapshotFeature(); if (sf == null) { counts.add(storagespaceConsumed(bsp)); http://git-wip-us.apache.org/repos/asf/hadoop/blob/891be399/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestQuota.java ---------------------------------------------------------------------- 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 e68e4d6..d402685 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 @@ -38,6 +38,7 @@ import org.apache.hadoop.hdfs.client.HdfsClientConfigKeys; import org.apache.hadoop.hdfs.protocol.DSQuotaExceededException; import org.apache.hadoop.hdfs.protocol.HdfsConstants; import org.apache.hadoop.hdfs.protocol.NSQuotaExceededException; +import org.apache.hadoop.hdfs.protocol.QuotaByStorageTypeExceededException; import org.apache.hadoop.hdfs.protocol.QuotaExceededException; import org.apache.hadoop.hdfs.tools.DFSAdmin; import org.apache.hadoop.hdfs.web.WebHdfsConstants; @@ -573,7 +574,6 @@ public class TestQuota { c = dfs.getContentSummary(quotaDir20); assertEquals(c.getSpaceQuota(), 6 * fileSpace); - // Create /nqdir0/qdir1/qdir21 and set its space quota to 2 * fileSpace final Path quotaDir21 = new Path("/nqdir0/qdir1/qdir21"); assertTrue(dfs.mkdirs(quotaDir21)); @@ -785,6 +785,59 @@ public class TestQuota { } } + /** + * Test quota by storage type. + */ + @Test + public void testQuotaByStorageType() throws Exception { + final Configuration conf = new HdfsConfiguration(); + // set a smaller block size so that we can test with smaller + // diskspace quotas + conf.set(DFSConfigKeys.DFS_BLOCK_SIZE_KEY, "512"); + // Make it relinquish locks. When run serially, the result should + // be identical. + conf.setInt(DFSConfigKeys.DFS_CONTENT_SUMMARY_LIMIT_KEY, 2); + final MiniDFSCluster cluster = + new MiniDFSCluster.Builder(conf).numDataNodes(2).build(); + final FileSystem fs = cluster.getFileSystem(); + assertTrue("Not a HDFS: " + fs.getUri(), + fs instanceof DistributedFileSystem); + final DistributedFileSystem dfs = (DistributedFileSystem) fs; + + try { + int fileLen = 1024; + short replication = 3; + int fileSpace = fileLen * replication; + + final Path quotaDir20 = new Path("/nqdir0/qdir1/qdir20"); + assertTrue(dfs.mkdirs(quotaDir20)); + dfs.setQuota(quotaDir20, HdfsConstants.QUOTA_DONT_SET, 6 * fileSpace); + + // Verify DirectoryWithQuotaFeature's storage type usage + // is updated properly after deletion. + // File creation followed by deletion shouldn't change storage type + // usage regardless whether storage policy is set. + Path file = new Path(quotaDir20, "fileDir/file1"); + DFSTestUtil.createFile(dfs, file, fileLen * 3, replication, 0); + dfs.delete(file, false); + dfs.setStoragePolicy(quotaDir20, HdfsConstants.HOT_STORAGE_POLICY_NAME); + dfs.setQuotaByStorageType(quotaDir20, StorageType.DEFAULT, + 2 * fileSpace); + boolean hasException = false; + try { + DFSTestUtil.createFile(dfs, file, fileLen * 3, replication, 0); + } catch (QuotaByStorageTypeExceededException e) { + hasException = true; + } + assertTrue(hasException); + dfs.delete(file, false); + dfs.setQuotaByStorageType(quotaDir20, StorageType.DEFAULT, + 6 * fileSpace); + } finally { + cluster.shutdown(); + } + } + private static void checkContentSummary(final ContentSummary expected, final ContentSummary computed) { assertEquals(expected.toString(), computed.toString());