From 572823c82c769fb46b6a32c4ea5a6a2ca34b3c78 Mon Sep 17 00:00:00 2001 From: Eli Collins Date: Mon, 16 Jul 2012 18:29:25 +0000 Subject: [PATCH] HDFS-3665. Add a test for renaming across file systems via a symlink. Contributed by Eli Collins git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1362177 13f79535-47bb-0310-9956-ffa450edef68 --- hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt | 2 + .../apache/hadoop/fs/TestFcHdfsSymlink.java | 39 ++++++++++++++++++- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index 823b66d926..2a66129a6c 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -336,6 +336,8 @@ Branch-2 ( Unreleased changes ) 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 91cc225252..9dad391cfc 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 static void testTearDown() throws Exception { } @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 void testLinkAcrossFileSystems() throws IOException { 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 {