From 6646b16450648f6129bdd07757dec736da2c3513 Mon Sep 17 00:00:00 2001 From: Rushabh Shah Date: Mon, 4 Jun 2018 09:19:03 -0500 Subject: [PATCH] HDFS-13281 Namenode#createFile should be /.reserved/raw/ aware.. Contributed by Rushabh S Shah (cherry picked from commit e2289c8d1496a5eff88e6bcb8776a11d45371ffc) --- .../hdfs/server/namenode/FSNamesystem.java | 2 +- .../hadoop/hdfs/TestEncryptionZones.java | 29 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java index c02eb84d5f4..19ff08d4165 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java @@ -2416,7 +2416,7 @@ public class FSNamesystem implements Namesystem, FSNamesystemMBean, } FileEncryptionInfo feInfo = null; - if (provider != null) { + if (!iip.isRaw() && provider != null) { EncryptionKeyInfo ezInfo = FSDirEncryptionZoneOp.getEncryptionKeyInfo( this, iip, supportedVersions); // if the path has an encryption zone, the lock was released while 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 6f9ef290a76..d8524aeea01 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 @@ -21,6 +21,7 @@ import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.io.OutputStream; import java.io.PrintStream; import java.io.RandomAccessFile; import java.io.StringReader; @@ -77,6 +78,7 @@ import org.apache.hadoop.hdfs.protocol.LocatedBlocks; import org.apache.hadoop.hdfs.protocol.HdfsConstants.SafeModeAction; import org.apache.hadoop.hdfs.protocol.SnapshotDiffReport.DiffReportEntry; import org.apache.hadoop.hdfs.protocol.SnapshotDiffReport.DiffType; +import org.apache.hadoop.hdfs.server.common.HdfsServerConstants; import org.apache.hadoop.hdfs.server.namenode.EncryptionFaultInjector; import org.apache.hadoop.hdfs.server.namenode.EncryptionZoneManager; import org.apache.hadoop.hdfs.server.namenode.FSImageTestUtil; @@ -2302,4 +2304,31 @@ public class TestEncryptionZones { Assert.assertEquals((data[i] & 0XFF), in.read()); } } + + /** + * Tests that namenode doesn't generate edek if we are writing to + * /.reserved/raw directory. + * @throws Exception + */ + @Test + public void testWriteToEZReservedRaw() throws Exception { + String unEncryptedBytes = "hello world"; + // Create an Encryption Zone. + final Path zonePath = new Path("/zone"); + fsWrapper.mkdir(zonePath, FsPermission.getDirDefault(), false); + dfsAdmin.createEncryptionZone(zonePath, TEST_KEY, NO_TRASH); + Path p1 = new Path(zonePath, "p1"); + Path reservedRawPath = new Path("/.reserved/raw/" + p1.toString()); + // Create an empty file with /.reserved/raw/ path. + OutputStream os = fs.create(reservedRawPath); + os.close(); + try { + fs.getXAttr(reservedRawPath, HdfsServerConstants + .CRYPTO_XATTR_FILE_ENCRYPTION_INFO); + fail("getXAttr should have thrown an exception"); + } catch (IOException ioe) { + assertExceptionContains("At least one of the attributes provided was " + + "not found.", ioe); + } + } }