diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt
index 95da136e525..e68aec2f79d 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt
+++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt
@@ -474,6 +474,8 @@ Release 2.7.0 - UNRELEASED
HDFS-7543. Avoid path resolution when getting FileStatus for audit logs.
(wheat9)
+ HDFS-7530. Allow renaming of encryption zone roots. (Charles Lamb via wang)
+
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/namenode/EncryptionZoneManager.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/EncryptionZoneManager.java
index 5c4f39d1233..3fe748d0eb9 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/EncryptionZoneManager.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/EncryptionZoneManager.java
@@ -249,6 +249,10 @@ void checkMoveValidity(INodesInPath srcIIP, INodesInPath dstIIP, String src)
final boolean dstInEZ = (dstEZI != null);
if (srcInEZ) {
if (!dstInEZ) {
+ if (srcEZI.getINodeId() == srcIIP.getLastINode().getId()) {
+ // src is ez root and dest is not in an ez. Allow the rename.
+ return;
+ }
throw new IOException(
src + " can't be moved from an encryption zone.");
}
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestEncryptionZones.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestEncryptionZones.java
index cc00055c34a..13eb4cf97e0 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestEncryptionZones.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestEncryptionZones.java
@@ -538,6 +538,19 @@ private void doRenameEncryptionZone(FSTestWrapper wrapper) throws Exception {
!wrapper.exists(pathFooBaz) && wrapper.exists(pathFooBar));
assertEquals("Renamed file contents not the same",
contents, DFSTestUtil.readFile(fs, pathFooBarFile));
+
+ // Verify that we can rename an EZ root
+ final Path newFoo = new Path(testRoot, "newfoo");
+ assertTrue("Rename of EZ root", fs.rename(pathFoo, newFoo));
+ assertTrue("Rename of EZ root failed",
+ !wrapper.exists(pathFoo) && wrapper.exists(newFoo));
+
+ // Verify that we can't rename an EZ root onto itself
+ try {
+ wrapper.rename(newFoo, newFoo);
+ } catch (IOException e) {
+ assertExceptionContains("are the same", e);
+ }
}
@Test(timeout = 60000)
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/resources/testCryptoConf.xml b/hadoop-hdfs-project/hadoop-hdfs/src/test/resources/testCryptoConf.xml
index ebbf773b133..89c93e26b1c 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/test/resources/testCryptoConf.xml
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/resources/testCryptoConf.xml
@@ -238,13 +238,35 @@
- Test failure of renaming a non-EZ file from an EZ
+ Test failure of renaming an EZ file into a non-EZ
+
+ -fs NAMENODE -mkdir /src
+ -fs NAMENODE -mkdir /dst
+ -fs NAMENODE -ls /-
+ -createZone -path /src -keyName myKey
+ -fs NAMENODE -touchz /src/foo
+ -fs NAMENODE -mv /src/foo /dst-
+
+
+ -fs NAMENODE -rm /src/foo
+ -fs NAMENODE -rmdir /src
+ -fs NAMENODE -rmdir /dst
+
+
+
+ SubstringComparator
+ /src/foo can't be moved from an encryption zone.
+
+
+
+
+
+ Test success of renaming an EZ root
-fs NAMENODE -mkdir /src
- -fs NAMENODE -mkdir /dst
- -fs NAMENODE -ls /-
-createZone -path /src -keyName myKey
-fs NAMENODE -mv /src /dst-
+ -fs NAMENODE -ls /-
-fs NAMENODE -rmdir /src
@@ -253,7 +275,7 @@
SubstringComparator
- /src can't be moved from an encryption zone
+ /dst