HDFS-13281 Namenode#createFile should be /.reserved/raw/ aware.. Contributed by Rushabh S Shah

(cherry picked from commit e2289c8d14)
(cherry picked from commit 4ecb7aaf77)
This commit is contained in:
Rushabh Shah 2018-06-04 09:19:03 -05:00
parent d00a58ff29
commit 0caf40efe5
2 changed files with 30 additions and 1 deletions

View File

@ -2283,7 +2283,7 @@ public class FSNamesystem implements Namesystem, FSNamesystemMBean,
dir, pc, src, flag, createParent); dir, pc, src, flag, createParent);
FileEncryptionInfo feInfo = null; FileEncryptionInfo feInfo = null;
if (provider != null) { if (!iip.isRaw() && provider != null) {
EncryptionKeyInfo ezInfo = FSDirEncryptionZoneOp.getEncryptionKeyInfo( EncryptionKeyInfo ezInfo = FSDirEncryptionZoneOp.getEncryptionKeyInfo(
this, iip, supportedVersions); this, iip, supportedVersions);
// if the path has an encryption zone, the lock was released while // if the path has an encryption zone, the lock was released while

View File

@ -21,6 +21,7 @@ import java.io.ByteArrayOutputStream;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream; import java.io.PrintStream;
import java.io.RandomAccessFile; import java.io.RandomAccessFile;
import java.io.StringReader; import java.io.StringReader;
@ -77,6 +78,7 @@ import org.apache.hadoop.hdfs.protocol.EncryptionZone;
import org.apache.hadoop.hdfs.protocol.HdfsFileStatus; import org.apache.hadoop.hdfs.protocol.HdfsFileStatus;
import org.apache.hadoop.hdfs.protocol.LocatedBlocks; import org.apache.hadoop.hdfs.protocol.LocatedBlocks;
import org.apache.hadoop.hdfs.protocol.HdfsConstants.SafeModeAction; import org.apache.hadoop.hdfs.protocol.HdfsConstants.SafeModeAction;
import org.apache.hadoop.hdfs.server.common.HdfsServerConstants;
import org.apache.hadoop.hdfs.server.namenode.EncryptionFaultInjector; import org.apache.hadoop.hdfs.server.namenode.EncryptionFaultInjector;
import org.apache.hadoop.hdfs.server.namenode.EncryptionZoneManager; import org.apache.hadoop.hdfs.server.namenode.EncryptionZoneManager;
import org.apache.hadoop.hdfs.server.namenode.FSImageTestUtil; import org.apache.hadoop.hdfs.server.namenode.FSImageTestUtil;
@ -2229,4 +2231,31 @@ public class TestEncryptionZones {
Assert.assertEquals((data[i] & 0XFF), in.read()); 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);
}
}
} }