diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index 76bab6cc4e7..021126adde2 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -157,6 +157,8 @@ Release 2.0.1-alpha - UNRELEASED HDFS-3537. Move libhdfs and fuse-dfs source to native subdirectories. (Colin Patrick McCabe via eli) + HDFS-3665. Add a test for renaming across file systems via a symlink. (eli) + OPTIMIZATIONS HDFS-2982. Startup performance suffers when there are many edit log diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/fs/TestFcHdfsSymlink.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/fs/TestFcHdfsSymlink.java index 91cc225252a..9dad391cfc9 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/fs/TestFcHdfsSymlink.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/fs/TestFcHdfsSymlink.java @@ -97,7 +97,7 @@ public class TestFcHdfsSymlink extends FileContextSymlinkBaseTest { } @Test - /** Link from Hdfs to LocalFs */ + /** Access a file using a link that spans Hdfs to LocalFs */ public void testLinkAcrossFileSystems() throws IOException { Path localDir = new Path("file://"+getAbsoluteTestRootDir(fc)+"/test"); Path localFile = new Path("file://"+getAbsoluteTestRootDir(fc)+"/test/file"); @@ -112,7 +112,42 @@ public class TestFcHdfsSymlink extends FileContextSymlinkBaseTest { readFile(link); assertEquals(fileSize, fc.getFileStatus(link).getLen()); } - + + @Test + /** Test renaming a file across two file systems using a link */ + public void testRenameAcrossFileSystemsViaLink() throws IOException { + Path localDir = new Path("file://"+getAbsoluteTestRootDir(fc)+"/test"); + Path hdfsFile = new Path(testBaseDir1(), "file"); + Path link = new Path(testBaseDir1(), "link"); + Path hdfsFileNew = new Path(testBaseDir1(), "fileNew"); + Path hdfsFileNewViaLink = new Path(link, "fileNew"); + FileContext localFc = FileContext.getLocalFSFileContext(); + localFc.delete(localDir, true); + localFc.mkdir(localDir, FileContext.DEFAULT_PERM, true); + localFc.setWorkingDirectory(localDir); + createAndWriteFile(fc, hdfsFile); + fc.createSymlink(localDir, link, false); + // Rename hdfs://test1/file to hdfs://test1/link/fileNew + // which renames to file://TEST_ROOT/test/fileNew which + // spans AbstractFileSystems and therefore fails. + try { + fc.rename(hdfsFile, hdfsFileNewViaLink); + fail("Renamed across file systems"); + } catch (InvalidPathException ipe) { + // Expected + } + // Now rename hdfs://test1/link/fileNew to hdfs://test1/fileNew + // which renames file://TEST_ROOT/test/fileNew to hdfs://test1/fileNew + // which spans AbstractFileSystems and therefore fails. + createAndWriteFile(fc, hdfsFileNewViaLink); + try { + fc.rename(hdfsFileNewViaLink, hdfsFileNew); + fail("Renamed across file systems"); + } catch (InvalidPathException ipe) { + // Expected + } + } + @Test /** Test access a symlink using AbstractFileSystem */ public void testAccessLinkFromAbstractFileSystem() throws IOException {