HDFS-7677. DistributedFileSystem#truncate should resolve symlinks. (yliu)
Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/dad98fb5 Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/dad98fb5 Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/dad98fb5 Branch: refs/heads/HDFS-EC Commit: dad98fb5332cc8290711bcd0bd16d4f896e5264c Parents: c690f6a Author: yliu <y...@apache.org> Authored: Tue Jan 27 23:50:11 2015 +0800 Committer: Zhe Zhang <z...@apache.org> Committed: Thu Jan 29 10:05:25 2015 -0800 ---------------------------------------------------------------------- hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt | 2 ++ .../hadoop/hdfs/DistributedFileSystem.java | 14 ++++++++- .../hdfs/server/namenode/TestFileTruncate.java | 30 ++++++++++++++++++++ 3 files changed, 45 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/dad98fb5/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index beea13b..1f036b8 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -801,6 +801,8 @@ Release 2.7.0 - UNRELEASED HDFS-7566. Remove obsolete entries from hdfs-default.xml (Ray Chiang via aw) + HDFS-7677. DistributedFileSystem#truncate should resolve symlinks. (yliu) + Release 2.6.1 - UNRELEASED INCOMPATIBLE CHANGES http://git-wip-us.apache.org/repos/asf/hadoop/blob/dad98fb5/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DistributedFileSystem.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DistributedFileSystem.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DistributedFileSystem.java index 710ab18..6d5684e 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DistributedFileSystem.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DistributedFileSystem.java @@ -636,7 +636,19 @@ public class DistributedFileSystem extends FileSystem { @Override public boolean truncate(Path f, final long newLength) throws IOException { statistics.incrementWriteOps(1); - return dfs.truncate(getPathName(f), newLength); + Path absF = fixRelativePart(f); + return new FileSystemLinkResolver<Boolean>() { + @Override + public Boolean doCall(final Path p) + throws IOException, UnresolvedLinkException { + return dfs.truncate(getPathName(p), newLength); + } + @Override + public Boolean next(final FileSystem fs, final Path p) + throws IOException { + return fs.truncate(p, newLength); + } + }.resolve(this, absF); } @Override http://git-wip-us.apache.org/repos/asf/hadoop/blob/dad98fb5/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFileTruncate.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFileTruncate.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFileTruncate.java index e8250a2..579e718 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFileTruncate.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFileTruncate.java @@ -759,6 +759,36 @@ public class TestFileTruncate { } } + @Test + public void testTruncate4Symlink() throws IOException { + final int fileLength = 3 * BLOCK_SIZE; + + final Path parent = new Path("/test"); + fs.mkdirs(parent); + final byte[] contents = AppendTestUtil.initBuffer(fileLength); + final Path file = new Path(parent, "testTruncate4Symlink"); + writeContents(contents, fileLength, file); + + final Path link = new Path(parent, "link"); + fs.createSymlink(file, link, false); + + final int newLength = fileLength/3; + boolean isReady = fs.truncate(link, newLength); + + assertTrue("Recovery is not expected.", isReady); + + FileStatus fileStatus = fs.getFileStatus(file); + assertThat(fileStatus.getLen(), is((long) newLength)); + + ContentSummary cs = fs.getContentSummary(parent); + assertEquals("Bad disk space usage", + cs.getSpaceConsumed(), newLength * REPLICATION); + // validate the file content + checkFullFile(file, newLength, contents); + + fs.delete(parent, true); + } + static void writeContents(byte[] contents, int fileLength, Path p) throws IOException { FSDataOutputStream out = fs.create(p, true, BLOCK_SIZE, REPLICATION,