From 2821edf6d0ae78a939af86b824f253397e5af024 Mon Sep 17 00:00:00 2001 From: Lei Xu Date: Fri, 15 Dec 2017 10:04:43 -0800 Subject: [PATCH] HDFS-12819. Setting/Unsetting EC policy shows warning if the directory is not empty. (Contributed by Lei (Eddy) Xu) (cherry picked from commit 1c15b1751c0698bd3063d5c25f556d4821b161d2) --- .../org/apache/hadoop/hdfs/tools/ECAdmin.java | 14 +++++++ .../test/resources/testErasureCodingConf.xml | 37 +++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/ECAdmin.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/ECAdmin.java index a28f227c04e..e30b0836c89 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/ECAdmin.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/ECAdmin.java @@ -19,7 +19,9 @@ package org.apache.hadoop.hdfs.tools; import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.conf.Configured; +import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.Path; +import org.apache.hadoop.fs.RemoteIterator; import org.apache.hadoop.hdfs.DistributedFileSystem; import org.apache.hadoop.hdfs.protocol.AddErasureCodingPolicyResponse; import org.apache.hadoop.hdfs.protocol.ErasureCodingPolicy; @@ -362,6 +364,12 @@ public class ECAdmin extends Configured implements Tool { System.out.println("Set erasure coding policy " + ecPolicyName + " on " + path); } + RemoteIterator dirIt = dfs.listStatusIterator(p); + if (dirIt.hasNext()) { + System.out.println("Warning: setting erasure coding policy on a " + + "non-empty directory will not automatically convert existing" + + " files to " + ecPolicyName); + } } catch (Exception e) { System.err.println(AdminHelper.prettifyException(e)); return 3; @@ -412,6 +420,12 @@ public class ECAdmin extends Configured implements Tool { try { dfs.unsetErasureCodingPolicy(p); System.out.println("Unset erasure coding policy from " + path); + RemoteIterator dirIt = dfs.listStatusIterator(p); + if (dirIt.hasNext()) { + System.out.println("Warning: unsetting erasure coding policy on a " + + "non-empty directory will not automatically convert existing" + + " files to replicated data."); + } } catch (Exception e) { System.err.println(AdminHelper.prettifyException(e)); return 2; diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/resources/testErasureCodingConf.xml b/hadoop-hdfs-project/hadoop-hdfs/src/test/resources/testErasureCodingConf.xml index 9988ff33ed0..e6672133d97 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/resources/testErasureCodingConf.xml +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/resources/testErasureCodingConf.xml @@ -298,6 +298,24 @@ + + setPolicy : set policy on non-empty directory + + -fs NAMENODE -mkdir /ecdir + -fs NAMENODE -touchz /ecdir/file1 + -fs NAMENODE -setPolicy -policy RS-6-3-1024k -path /ecdir + + + -fs NAMENODE -rm -R /ecdir + + + + SubstringComparator + Warning: setting erasure coding policy on an non-empty directory will not automatically convert existing data to RS-6-3-1024 + + + + unsetPolicy : unset inherited EC policy, has no effect @@ -321,6 +339,25 @@ + + unsetPolicy : unset policy on non-empty directory + + -fs NAMENODE -mkdir /ecdir + -fs NAMENODE -setPolicy -policy RS-6-3-1024k -path /ecdir + -fs NAMENODE -touchz /ecdir/file1 + -fs NAMENODE -unsetPolicy -path /ecdir + + + -fs NAMENODE -rm -R /ecdir + + + + SubstringComparator + Warning: unsetting erasure coding policy on an non-empty directory will not automatically convert existing data to replicated data + + + + getPolicy : get EC policy information at specified path, which doesn't have an EC policy