diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/viewfs/ViewFs.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/viewfs/ViewFs.java index 6d619b1d67..6e35ddf190 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/viewfs/ViewFs.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/viewfs/ViewFs.java @@ -746,6 +746,17 @@ public List> getDelegationTokens(String renewer) throws IOException { result.addAll(tokens); } } + + // Add tokens from fallback FS + if (this.fsState.getRootFallbackLink() != null) { + AbstractFileSystem rootFallbackFs = + this.fsState.getRootFallbackLink().getTargetFileSystem(); + List> tokens = rootFallbackFs.getDelegationTokens(renewer); + if (tokens != null) { + result.addAll(tokens); + } + } + return result; } diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/fs/viewfs/TestViewFsLinkFallback.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/fs/viewfs/TestViewFsLinkFallback.java index 09e02be640..ba4a80ca11 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/fs/viewfs/TestViewFsLinkFallback.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/fs/viewfs/TestViewFsLinkFallback.java @@ -29,6 +29,7 @@ import java.net.URISyntaxException; import java.util.EnumSet; +import java.util.List; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.AbstractFileSystem; import org.apache.hadoop.fs.FileAlreadyExistsException; @@ -45,6 +46,7 @@ import org.apache.hadoop.hdfs.DistributedFileSystem; import org.apache.hadoop.hdfs.MiniDFSCluster; import org.apache.hadoop.hdfs.MiniDFSNNTopology; +import org.apache.hadoop.security.token.Token; import org.apache.hadoop.test.LambdaTestUtils; import org.junit.AfterClass; import org.junit.Assert; @@ -182,6 +184,26 @@ public void testMkdirOfNewDirWithOutMatchingToMountOrFallbackDirTree() assertTrue(fsTarget.exists(test)); } + /** + * Test getDelegationToken when fallback is configured. + */ + @Test + public void testGetDelegationToken() throws IOException { + Configuration conf = new Configuration(); + conf.setBoolean(Constants.CONFIG_VIEWFS_MOUNT_LINKS_AS_SYMLINKS, false); + ConfigUtil.addLink(conf, "/user", + new Path(targetTestRoot.toString(), "user").toUri()); + ConfigUtil.addLink(conf, "/data", + new Path(targetTestRoot.toString(), "data").toUri()); + ConfigUtil.addLinkFallback(conf, targetTestRoot.toUri()); + + FileContext fcView = + FileContext.getFileContext(FsConstants.VIEWFS_URI, conf); + List> tokens = fcView.getDelegationTokens(new Path("/"), "tester"); + // Two tokens from the two mount points and one token from fallback + assertEquals(3, tokens.size()); + } + /** * Tests that when the parent dirs does not exist in fallback but the parent * dir is same as mount internal directory, then we create parent structure