You are viewing a plain text version of this content. The canonical link for it is here.
Posted to hdfs-commits@hadoop.apache.org by cm...@apache.org on 2013/06/18 04:29:04 UTC
svn commit: r1493987 - in
/hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs: CHANGES.txt
src/main/java/org/apache/hadoop/hdfs/server/namenode/NameNodeRpcServer.java
src/test/java/org/apache/hadoop/fs/TestResolveHdfsSymlink.java
Author: cmccabe
Date: Tue Jun 18 02:29:03 2013
New Revision: 1493987
URL: http://svn.apache.org/r1493987
Log:
HDFS-4626. ClientProtocol#getLinkTarget should throw an exception for non-symlink and non-existent paths. (Andrew Wang via cmccabe)
Modified:
hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt
hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NameNodeRpcServer.java
hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/fs/TestResolveHdfsSymlink.java
Modified: hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt?rev=1493987&r1=1493986&r2=1493987&view=diff
==============================================================================
--- hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt (original)
+++ hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt Tue Jun 18 02:29:03 2013
@@ -179,6 +179,9 @@ Release 2.1.0-beta - UNRELEASED
BUG FIXES
+ HDFS-4626. ClientProtocol#getLinkTarget should throw an exception for
+ non-symlink and non-existent paths. (Andrew Wang via cmccabe)
+
HDFS-3934. duplicative dfs_hosts entries handled wrong. (Colin Patrick
McCabe)
Modified: hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NameNodeRpcServer.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NameNodeRpcServer.java?rev=1493987&r1=1493986&r2=1493987&view=diff
==============================================================================
--- hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NameNodeRpcServer.java (original)
+++ hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NameNodeRpcServer.java Tue Jun 18 02:29:03 2013
@@ -880,19 +880,21 @@ class NameNodeRpcServer implements Namen
@Override // ClientProtocol
public String getLinkTarget(String path) throws IOException {
metrics.incrGetLinkTargetOps();
+ HdfsFileStatus stat = null;
try {
- HdfsFileStatus stat = namesystem.getFileInfo(path, false);
- if (stat != null) {
- // NB: getSymlink throws IOException if !stat.isSymlink()
- return stat.getSymlink();
- }
+ stat = namesystem.getFileInfo(path, false);
} catch (UnresolvedPathException e) {
return e.getResolvedPath().toString();
} catch (UnresolvedLinkException e) {
// The NameNode should only throw an UnresolvedPathException
throw new AssertionError("UnresolvedLinkException thrown");
}
- return null;
+ if (stat == null) {
+ throw new FileNotFoundException("File does not exist: " + path);
+ } else if (!stat.isSymlink()) {
+ throw new IOException("Path " + path + " is not a symbolic link");
+ }
+ return stat.getSymlink();
}
Modified: hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/fs/TestResolveHdfsSymlink.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/fs/TestResolveHdfsSymlink.java?rev=1493987&r1=1493986&r2=1493987&view=diff
==============================================================================
--- hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/fs/TestResolveHdfsSymlink.java (original)
+++ hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/fs/TestResolveHdfsSymlink.java Tue Jun 18 02:29:03 2013
@@ -18,11 +18,16 @@
package org.apache.hadoop.fs;
+import static org.junit.Assert.fail;
+
+import java.io.FileNotFoundException;
import java.io.IOException;
+import java.util.EnumSet;
import java.util.List;
import java.util.Set;
import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.hdfs.DFSClient;
import org.apache.hadoop.hdfs.DFSConfigKeys;
import org.apache.hadoop.hdfs.DFSTestUtil;
import org.apache.hadoop.hdfs.HdfsConfiguration;
@@ -31,6 +36,7 @@ import org.apache.hadoop.hdfs.security.t
import org.apache.hadoop.security.UserGroupInformation;
import org.apache.hadoop.security.token.Token;
import org.apache.hadoop.security.token.delegation.AbstractDelegationTokenIdentifier;
+import org.apache.hadoop.test.GenericTestUtils;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
@@ -122,4 +128,48 @@ public class TestResolveHdfsSymlink {
((Hdfs) afs).cancelDelegationToken(
(Token<? extends AbstractDelegationTokenIdentifier>) tokenList.get(0));
}
+
+ /**
+ * Verifies that attempting to resolve a non-symlink results in client
+ * exception
+ */
+ @Test
+ public void testLinkTargetNonSymlink() throws UnsupportedFileSystemException,
+ IOException {
+ FileContext fc = null;
+ Path notSymlink = new Path("/notasymlink");
+ try {
+ fc = FileContext.getFileContext(cluster.getFileSystem().getUri());
+ fc.create(notSymlink, EnumSet.of(CreateFlag.CREATE));
+ DFSClient client = new DFSClient(cluster.getFileSystem().getUri(),
+ cluster.getConfiguration(0));
+ try {
+ client.getLinkTarget(notSymlink.toString());
+ fail("Expected exception for resolving non-symlink");
+ } catch (IOException e) {
+ GenericTestUtils.assertExceptionContains("is not a symbolic link", e);
+ }
+ } finally {
+ if (fc != null) {
+ fc.delete(notSymlink, false);
+ }
+ }
+ }
+
+ /**
+ * Tests that attempting to resolve a non-existent-file
+ */
+ @Test
+ public void testLinkTargetNonExistent() throws IOException {
+ Path doesNotExist = new Path("/filethatdoesnotexist");
+ DFSClient client = new DFSClient(cluster.getFileSystem().getUri(),
+ cluster.getConfiguration(0));
+ try {
+ client.getLinkTarget(doesNotExist.toString());
+ fail("Expected exception for resolving non-existent file");
+ } catch (FileNotFoundException e) {
+ GenericTestUtils.assertExceptionContains("File does not exist: "
+ + doesNotExist.toString(), e);
+ }
+ }
}