From 08006b84f8cb6119bd17f6cfc8da2598e24346ca Mon Sep 17 00:00:00 2001 From: Xiaoyu Yao Date: Tue, 5 May 2015 13:41:14 -0700 Subject: [PATCH] HDFS-8219. setStoragePolicy with folder behavior is different after cluster restart. (surendra singh lilhore via Xiaoyu Yao) (cherry picked from commit 0100b155019496d077f958904de7d385697d65d9) (cherry picked from commit e68e8b3b5cff85bfd8bb5b00b9033f63577856d6) Conflicts: hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestBlockStoragePolicy.java (cherry picked from commit b054cb68fa0fc6d1e9e77ac84575731e7d1ec0c7) --- hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt | 3 ++ .../hdfs/server/namenode/FSEditLog.java | 2 +- .../hadoop/hdfs/TestBlockStoragePolicy.java | 43 +++++++++++++++++++ 3 files changed, 47 insertions(+), 1 deletion(-) diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index b4adfd1f9e5..4ccbd5dcbf5 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -129,6 +129,9 @@ Release 2.6.1 - UNRELEASED HDFS-8070. Pre-HDFS-7915 DFSClient cannot use short circuit on post-HDFS-7915 DataNode (cmccabe) + HDFS-8219. setStoragePolicy with folder behavior is different after cluster restart. + (surendra singh lilhore via Xiaoyu Yao) + Release 2.6.0 - 2014-11-18 INCOMPATIBLE CHANGES diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSEditLog.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSEditLog.java index 20aaf078ef2..0154ed9d3c9 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSEditLog.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSEditLog.java @@ -721,7 +721,7 @@ public class FSEditLog implements LogsPurgeable { .setClientMachine( newNode.getFileUnderConstructionFeature().getClientMachine()) .setOverwrite(overwrite) - .setStoragePolicyId(newNode.getStoragePolicyID()); + .setStoragePolicyId(newNode.getLocalStoragePolicyID()); AclFeature f = newNode.getAclFeature(); if (f != null) { diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestBlockStoragePolicy.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestBlockStoragePolicy.java index d053a79d750..8ac25db49e9 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestBlockStoragePolicy.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestBlockStoragePolicy.java @@ -26,6 +26,7 @@ import java.util.*; import com.google.common.collect.Lists; import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.fs.FSDataOutputStream; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.hdfs.protocol.*; @@ -1173,4 +1174,46 @@ public class TestBlockStoragePolicy { cluster.shutdown(); } } + + @Test + public void testGetFileStoragePolicyAfterRestartNN() throws Exception { + //HDFS8219 + final MiniDFSCluster cluster = new MiniDFSCluster.Builder(conf) + .numDataNodes(REPLICATION) + .storageTypes( + new StorageType[] {StorageType.DISK, StorageType.ARCHIVE}) + .build(); + cluster.waitActive(); + final DistributedFileSystem fs = cluster.getFileSystem(); + try { + final String file = "/testScheduleWithinSameNode/file"; + Path dir = new Path("/testScheduleWithinSameNode"); + fs.mkdirs(dir); + // 2. Set Dir policy + fs.setStoragePolicy(dir, "COLD"); + // 3. Create file + final FSDataOutputStream out = fs.create(new Path(file)); + out.writeChars("testScheduleWithinSameNode"); + out.close(); + // 4. Set Dir policy + fs.setStoragePolicy(dir, "HOT"); + HdfsFileStatus status = fs.getClient().getFileInfo(file); + // 5. get file policy, it should be parent policy. + Assert + .assertTrue( + "File storage policy should be HOT", + status.getStoragePolicy() == HOT); + // 6. restart NameNode for reloading edits logs. + cluster.restartNameNode(true); + // 7. get file policy, it should be parent policy. + status = fs.getClient().getFileInfo(file); + Assert + .assertTrue( + "File storage policy should be HOT", + status.getStoragePolicy() == HOT); + + } finally { + cluster.shutdown(); + } + } }