HDFS-15430. create should work when parent dir is internalDir and fallback configured. Contributed by Uma Maheswara Rao G.
(cherry picked from commit 1f2a80b5e5
)
This commit is contained in:
parent
737bbab90a
commit
655b39cc30
|
@ -40,6 +40,7 @@ import java.util.Map.Entry;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
import com.google.common.base.Preconditions;
|
||||||
import org.apache.hadoop.classification.InterfaceAudience;
|
import org.apache.hadoop.classification.InterfaceAudience;
|
||||||
import org.apache.hadoop.classification.InterfaceStability;
|
import org.apache.hadoop.classification.InterfaceStability;
|
||||||
import org.apache.hadoop.conf.Configuration;
|
import org.apache.hadoop.conf.Configuration;
|
||||||
|
@ -1141,7 +1142,41 @@ public class ViewFileSystem extends FileSystem {
|
||||||
public FSDataOutputStream create(final Path f,
|
public FSDataOutputStream create(final Path f,
|
||||||
final FsPermission permission, final boolean overwrite,
|
final FsPermission permission, final boolean overwrite,
|
||||||
final int bufferSize, final short replication, final long blockSize,
|
final int bufferSize, final short replication, final long blockSize,
|
||||||
final Progressable progress) throws AccessControlException {
|
final Progressable progress) throws IOException {
|
||||||
|
Preconditions.checkNotNull(f, "File cannot be null.");
|
||||||
|
if (InodeTree.SlashPath.equals(f)) {
|
||||||
|
throw new FileAlreadyExistsException(
|
||||||
|
"/ is not a file. The directory / already exist at: "
|
||||||
|
+ theInternalDir.fullPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.fsState.getRootFallbackLink() != null) {
|
||||||
|
|
||||||
|
if (theInternalDir.getChildren().containsKey(f.getName())) {
|
||||||
|
throw new FileAlreadyExistsException(
|
||||||
|
"A mount path(file/dir) already exist with the requested path: "
|
||||||
|
+ theInternalDir.getChildren().get(f.getName()).fullPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
FileSystem linkedFallbackFs =
|
||||||
|
this.fsState.getRootFallbackLink().getTargetFileSystem();
|
||||||
|
Path parent = Path.getPathWithoutSchemeAndAuthority(
|
||||||
|
new Path(theInternalDir.fullPath));
|
||||||
|
String leaf = f.getName();
|
||||||
|
Path fileToCreate = new Path(parent, leaf);
|
||||||
|
|
||||||
|
try {
|
||||||
|
return linkedFallbackFs
|
||||||
|
.create(fileToCreate, permission, overwrite, bufferSize,
|
||||||
|
replication, blockSize, progress);
|
||||||
|
} catch (IOException e) {
|
||||||
|
StringBuilder msg =
|
||||||
|
new StringBuilder("Failed to create file:").append(fileToCreate)
|
||||||
|
.append(" at fallback : ").append(linkedFallbackFs.getUri());
|
||||||
|
LOG.error(msg.toString(), e);
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
throw readOnlyMountTable("create", f);
|
throw readOnlyMountTable("create", f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -33,6 +33,8 @@ import java.util.Map;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
import com.google.common.base.Preconditions;
|
||||||
import org.apache.hadoop.classification.InterfaceAudience;
|
import org.apache.hadoop.classification.InterfaceAudience;
|
||||||
import org.apache.hadoop.classification.InterfaceStability;
|
import org.apache.hadoop.classification.InterfaceStability;
|
||||||
import org.apache.hadoop.conf.Configuration;
|
import org.apache.hadoop.conf.Configuration;
|
||||||
|
@ -912,6 +914,41 @@ public class ViewFs extends AbstractFileSystem {
|
||||||
FileAlreadyExistsException, FileNotFoundException,
|
FileAlreadyExistsException, FileNotFoundException,
|
||||||
ParentNotDirectoryException, UnsupportedFileSystemException,
|
ParentNotDirectoryException, UnsupportedFileSystemException,
|
||||||
UnresolvedLinkException, IOException {
|
UnresolvedLinkException, IOException {
|
||||||
|
Preconditions.checkNotNull(f, "File cannot be null.");
|
||||||
|
if (InodeTree.SlashPath.equals(f)) {
|
||||||
|
throw new FileAlreadyExistsException(
|
||||||
|
"/ is not a file. The directory / already exist at: "
|
||||||
|
+ theInternalDir.fullPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.fsState.getRootFallbackLink() != null) {
|
||||||
|
if (theInternalDir.getChildren().containsKey(f.getName())) {
|
||||||
|
throw new FileAlreadyExistsException(
|
||||||
|
"A mount path(file/dir) already exist with the requested path: "
|
||||||
|
+ theInternalDir.getChildren().get(f.getName()).fullPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
AbstractFileSystem linkedFallbackFs =
|
||||||
|
this.fsState.getRootFallbackLink().getTargetFileSystem();
|
||||||
|
Path parent = Path.getPathWithoutSchemeAndAuthority(
|
||||||
|
new Path(theInternalDir.fullPath));
|
||||||
|
String leaf = f.getName();
|
||||||
|
Path fileToCreate = new Path(parent, leaf);
|
||||||
|
|
||||||
|
try {
|
||||||
|
return linkedFallbackFs
|
||||||
|
.createInternal(fileToCreate, flag, absolutePermission,
|
||||||
|
bufferSize, replication, blockSize, progress, checksumOpt,
|
||||||
|
true);
|
||||||
|
} catch (IOException e) {
|
||||||
|
StringBuilder msg =
|
||||||
|
new StringBuilder("Failed to create file:").append(fileToCreate)
|
||||||
|
.append(" at fallback : ").append(linkedFallbackFs.getUri());
|
||||||
|
LOG.error(msg.toString(), e);
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
throw readOnlyMountTable("create", f);
|
throw readOnlyMountTable("create", f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -33,6 +33,7 @@ import javax.security.auth.login.LoginException;
|
||||||
|
|
||||||
import org.apache.hadoop.conf.Configuration;
|
import org.apache.hadoop.conf.Configuration;
|
||||||
import org.apache.hadoop.fs.FSDataOutputStream;
|
import org.apache.hadoop.fs.FSDataOutputStream;
|
||||||
|
import org.apache.hadoop.fs.FileAlreadyExistsException;
|
||||||
import org.apache.hadoop.fs.FileStatus;
|
import org.apache.hadoop.fs.FileStatus;
|
||||||
import org.apache.hadoop.fs.FileSystem;
|
import org.apache.hadoop.fs.FileSystem;
|
||||||
import org.apache.hadoop.fs.FileSystemTestHelper;
|
import org.apache.hadoop.fs.FileSystemTestHelper;
|
||||||
|
@ -765,4 +766,151 @@ public class TestViewFileSystemLinkFallback extends ViewFileSystemBaseTest {
|
||||||
assertTrue(fsTarget.exists(test));
|
assertTrue(fsTarget.exists(test));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests that the create file should be successful when the parent directory
|
||||||
|
* is same as the existent fallback directory. The new file should be created
|
||||||
|
* in fallback.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testCreateFileOnInternalMountDirWithSameDirTreeExistInFallback()
|
||||||
|
throws Exception {
|
||||||
|
Configuration conf = new Configuration();
|
||||||
|
ConfigUtil.addLink(conf, "/user1/hive/warehouse/partition-0",
|
||||||
|
new Path(targetTestRoot.toString()).toUri());
|
||||||
|
Path fallbackTarget = new Path(targetTestRoot, "fallbackDir");
|
||||||
|
Path dir1 = new Path(fallbackTarget, "user1/hive/warehouse/partition-0");
|
||||||
|
fsTarget.mkdirs(dir1);
|
||||||
|
ConfigUtil.addLinkFallback(conf, fallbackTarget.toUri());
|
||||||
|
|
||||||
|
try (FileSystem vfs = FileSystem.get(viewFsDefaultClusterUri, conf)) {
|
||||||
|
Path vfsTestFile = new Path("/user1/hive/warehouse/test.file");
|
||||||
|
Path testFileInFallback = Path.mergePaths(fallbackTarget, vfsTestFile);
|
||||||
|
assertFalse(fsTarget.exists(testFileInFallback));
|
||||||
|
assertTrue(fsTarget.exists(testFileInFallback.getParent()));
|
||||||
|
vfs.create(vfsTestFile).close();
|
||||||
|
assertTrue(fsTarget.exists(testFileInFallback));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests the making of a new directory which is not matching to any of
|
||||||
|
* internal directory.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testCreateNewFileWithOutMatchingToMountDirOrFallbackDirPath()
|
||||||
|
throws Exception {
|
||||||
|
Configuration conf = new Configuration();
|
||||||
|
ConfigUtil.addLink(conf, "/user1/hive/warehouse/partition-0",
|
||||||
|
new Path(targetTestRoot.toString()).toUri());
|
||||||
|
Path fallbackTarget = new Path(targetTestRoot, "fallbackDir");
|
||||||
|
fsTarget.mkdirs(fallbackTarget);
|
||||||
|
ConfigUtil.addLinkFallback(conf, fallbackTarget.toUri());
|
||||||
|
try (FileSystem vfs = FileSystem.get(viewFsDefaultClusterUri, conf)) {
|
||||||
|
Path vfsTestFile = new Path("/user2/test.file");
|
||||||
|
Path testFileInFallback = Path.mergePaths(fallbackTarget, vfsTestFile);
|
||||||
|
assertFalse(fsTarget.exists(testFileInFallback));
|
||||||
|
// user2 does not exist in fallback
|
||||||
|
assertFalse(fsTarget.exists(testFileInFallback.getParent()));
|
||||||
|
vfs.create(vfsTestFile).close();
|
||||||
|
// /user2/test.file should be created in fallback
|
||||||
|
assertTrue(fsTarget.exists(testFileInFallback));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests the making of a new file on root which is not matching to any of
|
||||||
|
* fallback files on root.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testCreateFileOnRootWithFallbackEnabled() throws Exception {
|
||||||
|
Configuration conf = new Configuration();
|
||||||
|
Path fallbackTarget = new Path(targetTestRoot, "fallbackDir");
|
||||||
|
fsTarget.mkdirs(fallbackTarget);
|
||||||
|
|
||||||
|
ConfigUtil.addLink(conf, "/user1/hive/",
|
||||||
|
new Path(targetTestRoot.toString()).toUri());
|
||||||
|
ConfigUtil.addLinkFallback(conf, fallbackTarget.toUri());
|
||||||
|
|
||||||
|
try (FileSystem vfs = FileSystem.get(viewFsDefaultClusterUri, conf)) {
|
||||||
|
Path vfsTestFile = new Path("/test.file");
|
||||||
|
Path testFileInFallback = Path.mergePaths(fallbackTarget, vfsTestFile);
|
||||||
|
assertFalse(fsTarget.exists(testFileInFallback));
|
||||||
|
vfs.create(vfsTestFile).close();
|
||||||
|
// /test.file should be created in fallback
|
||||||
|
assertTrue(fsTarget.exists(testFileInFallback));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests the create of a file on root where the path is matching to an
|
||||||
|
* existing file on fallback's file on root.
|
||||||
|
*/
|
||||||
|
@Test (expected = FileAlreadyExistsException.class)
|
||||||
|
public void testCreateFileOnRootWithFallbackWithFileAlreadyExist()
|
||||||
|
throws Exception {
|
||||||
|
Configuration conf = new Configuration();
|
||||||
|
Path fallbackTarget = new Path(targetTestRoot, "fallbackDir");
|
||||||
|
Path testFile = new Path(fallbackTarget, "test.file");
|
||||||
|
// pre-creating test file in fallback.
|
||||||
|
fsTarget.create(testFile).close();
|
||||||
|
|
||||||
|
ConfigUtil.addLink(conf, "/user1/hive/",
|
||||||
|
new Path(targetTestRoot.toString()).toUri());
|
||||||
|
ConfigUtil.addLinkFallback(conf, fallbackTarget.toUri());
|
||||||
|
|
||||||
|
try (FileSystem vfs = FileSystem.get(viewFsDefaultClusterUri, conf)) {
|
||||||
|
Path vfsTestFile = new Path("/test.file");
|
||||||
|
assertTrue(fsTarget.exists(testFile));
|
||||||
|
vfs.create(vfsTestFile, false).close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests the creating of a file where the path is same as mount link path.
|
||||||
|
*/
|
||||||
|
@Test(expected= FileAlreadyExistsException.class)
|
||||||
|
public void testCreateFileWhereThePathIsSameAsItsMountLinkPath()
|
||||||
|
throws Exception {
|
||||||
|
Configuration conf = new Configuration();
|
||||||
|
Path fallbackTarget = new Path(targetTestRoot, "fallbackDir");
|
||||||
|
fsTarget.mkdirs(fallbackTarget);
|
||||||
|
|
||||||
|
ConfigUtil.addLink(conf, "/user1/hive/",
|
||||||
|
new Path(targetTestRoot.toString()).toUri());
|
||||||
|
ConfigUtil.addLinkFallback(conf, fallbackTarget.toUri());
|
||||||
|
|
||||||
|
try (FileSystem vfs = FileSystem.get(viewFsDefaultClusterUri, conf)) {
|
||||||
|
Path vfsTestDir = new Path("/user1/hive");
|
||||||
|
assertFalse(fsTarget.exists(Path.mergePaths(fallbackTarget, vfsTestDir)));
|
||||||
|
vfs.create(vfsTestDir).close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests the create of a file where the path is same as one of of the internal
|
||||||
|
* dir path should fail.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testCreateFileSameAsInternalDirPath() throws Exception {
|
||||||
|
Configuration conf = new Configuration();
|
||||||
|
Path fallbackTarget = new Path(targetTestRoot, "fallbackDir");
|
||||||
|
fsTarget.mkdirs(fallbackTarget);
|
||||||
|
ConfigUtil.addLink(conf, "/user1/hive/",
|
||||||
|
new Path(targetTestRoot.toString()).toUri());
|
||||||
|
ConfigUtil.addLinkFallback(conf, fallbackTarget.toUri());
|
||||||
|
|
||||||
|
try (FileSystem vfs = FileSystem.get(viewFsDefaultClusterUri, conf)) {
|
||||||
|
Path vfsTestDir = new Path("/user1");
|
||||||
|
assertFalse(fsTarget.exists(Path.mergePaths(fallbackTarget, vfsTestDir)));
|
||||||
|
try {
|
||||||
|
vfs.create(vfsTestDir);
|
||||||
|
Assert.fail("Should fail to create file as this is an internal dir.");
|
||||||
|
} catch (NotInMountpointException e){
|
||||||
|
// This tree is part of internal tree. The above exception will be
|
||||||
|
// thrown from getDefaultReplication, getDefaultBlockSize APIs which was
|
||||||
|
// called in create API.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,7 +39,6 @@ import org.apache.hadoop.fs.UnsupportedFileSystemException;
|
||||||
import org.apache.hadoop.hdfs.DFSConfigKeys;
|
import org.apache.hadoop.hdfs.DFSConfigKeys;
|
||||||
import org.apache.hadoop.hdfs.DistributedFileSystem;
|
import org.apache.hadoop.hdfs.DistributedFileSystem;
|
||||||
import org.apache.hadoop.hdfs.MiniDFSCluster;
|
import org.apache.hadoop.hdfs.MiniDFSCluster;
|
||||||
import org.apache.hadoop.security.AccessControlException;
|
|
||||||
import org.apache.hadoop.test.PathUtils;
|
import org.apache.hadoop.test.PathUtils;
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
|
@ -346,33 +345,6 @@ public class TestViewFileSystemOverloadSchemeWithHdfsScheme {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Create mount links as follows
|
|
||||||
* hdfs://localhost:xxx/HDFSUser --> hdfs://localhost:xxx/HDFSUser/
|
|
||||||
* hdfs://localhost:xxx/local --> file://TEST_ROOT_DIR/root/
|
|
||||||
* fallback --> hdfs://localhost:xxx/HDFSUser/
|
|
||||||
*
|
|
||||||
* It will find fallback link, but root is not accessible and read only.
|
|
||||||
*/
|
|
||||||
@Test(expected = AccessControlException.class, timeout = 30000)
|
|
||||||
public void testCreateOnRootShouldFailEvenFallBackMountLinkConfigured()
|
|
||||||
throws Exception {
|
|
||||||
final Path hdfsTargetPath = new Path(defaultFSURI + HDFS_USER_FOLDER);
|
|
||||||
addMountLinks(defaultFSURI.getAuthority(),
|
|
||||||
new String[] {HDFS_USER_FOLDER, LOCAL_FOLDER,
|
|
||||||
Constants.CONFIG_VIEWFS_LINK_FALLBACK },
|
|
||||||
new String[] {hdfsTargetPath.toUri().toString(),
|
|
||||||
localTargetDir.toURI().toString(),
|
|
||||||
hdfsTargetPath.toUri().toString() },
|
|
||||||
conf);
|
|
||||||
try (FileSystem fs = FileSystem.get(conf)) {
|
|
||||||
fs.createNewFile(new Path("/onRootWhenFallBack"));
|
|
||||||
Assert.fail(
|
|
||||||
"It should fail as root is read only in viewFS, even when configured"
|
|
||||||
+ " with fallback.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create mount links as follows
|
* Create mount links as follows
|
||||||
* hdfs://localhost:xxx/HDFSUser --> hdfs://localhost:xxx/HDFSUser/
|
* hdfs://localhost:xxx/HDFSUser --> hdfs://localhost:xxx/HDFSUser/
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
*/
|
*/
|
||||||
package org.apache.hadoop.fs.viewfs;
|
package org.apache.hadoop.fs.viewfs;
|
||||||
|
|
||||||
|
import static org.apache.hadoop.fs.CreateFlag.CREATE;
|
||||||
import static org.junit.Assert.assertFalse;
|
import static org.junit.Assert.assertFalse;
|
||||||
import static org.junit.Assert.assertNotNull;
|
import static org.junit.Assert.assertNotNull;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
|
@ -24,12 +25,15 @@ import static org.junit.Assert.assertTrue;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.net.URISyntaxException;
|
import java.net.URISyntaxException;
|
||||||
|
import java.util.EnumSet;
|
||||||
|
|
||||||
import org.apache.hadoop.conf.Configuration;
|
import org.apache.hadoop.conf.Configuration;
|
||||||
import org.apache.hadoop.fs.AbstractFileSystem;
|
import org.apache.hadoop.fs.AbstractFileSystem;
|
||||||
|
import org.apache.hadoop.fs.FileAlreadyExistsException;
|
||||||
import org.apache.hadoop.fs.FileStatus;
|
import org.apache.hadoop.fs.FileStatus;
|
||||||
import org.apache.hadoop.fs.FileSystem;
|
import org.apache.hadoop.fs.FileSystem;
|
||||||
import org.apache.hadoop.fs.FsConstants;
|
import org.apache.hadoop.fs.FsConstants;
|
||||||
|
import org.apache.hadoop.fs.Options;
|
||||||
import org.apache.hadoop.fs.Path;
|
import org.apache.hadoop.fs.Path;
|
||||||
import org.apache.hadoop.fs.permission.FsPermission;
|
import org.apache.hadoop.fs.permission.FsPermission;
|
||||||
import org.apache.hadoop.hdfs.DFSConfigKeys;
|
import org.apache.hadoop.hdfs.DFSConfigKeys;
|
||||||
|
@ -294,4 +298,154 @@ public class TestViewFsLinkFallback {
|
||||||
assertTrue(fsTarget.exists(test));
|
assertTrue(fsTarget.exists(test));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests that the create file should be successful when the parent directory
|
||||||
|
* is same as the existent fallback directory. The new file should be created
|
||||||
|
* in fallback.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testCreateFileOnInternalMountDirWithSameDirTreeExistInFallback()
|
||||||
|
throws Exception {
|
||||||
|
Configuration conf = new Configuration();
|
||||||
|
ConfigUtil.addLink(conf, "/user1/hive/warehouse/partition-0",
|
||||||
|
new Path(targetTestRoot.toString()).toUri());
|
||||||
|
Path fallbackTarget = new Path(targetTestRoot, "fallbackDir");
|
||||||
|
Path dir1 = new Path(fallbackTarget, "user1/hive/warehouse/partition-0");
|
||||||
|
fsTarget.mkdirs(dir1);
|
||||||
|
ConfigUtil.addLinkFallback(conf, fallbackTarget.toUri());
|
||||||
|
|
||||||
|
AbstractFileSystem vfs =
|
||||||
|
AbstractFileSystem.get(viewFsDefaultClusterUri, conf);
|
||||||
|
Path vfsTestFile = new Path("/user1/hive/warehouse/test.file");
|
||||||
|
Path testFileInFallback = Path.mergePaths(fallbackTarget, vfsTestFile);
|
||||||
|
assertFalse(fsTarget.exists(testFileInFallback));
|
||||||
|
assertTrue(fsTarget.exists(testFileInFallback.getParent()));
|
||||||
|
vfs.create(vfsTestFile, EnumSet.of(CREATE),
|
||||||
|
Options.CreateOpts.perms(FsPermission.getDefault())).close();
|
||||||
|
assertTrue(fsTarget.exists(testFileInFallback));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests the making of a new directory which is not matching to any of
|
||||||
|
* internal directory.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testCreateNewFileWithOutMatchingToMountDirOrFallbackDirPath()
|
||||||
|
throws Exception {
|
||||||
|
Configuration conf = new Configuration();
|
||||||
|
ConfigUtil.addLink(conf, "/user1/hive/warehouse/partition-0",
|
||||||
|
new Path(targetTestRoot.toString()).toUri());
|
||||||
|
Path fallbackTarget = new Path(targetTestRoot, "fallbackDir");
|
||||||
|
fsTarget.mkdirs(fallbackTarget);
|
||||||
|
ConfigUtil.addLinkFallback(conf, fallbackTarget.toUri());
|
||||||
|
AbstractFileSystem vfs =
|
||||||
|
AbstractFileSystem.get(viewFsDefaultClusterUri, conf);
|
||||||
|
Path vfsTestFile = new Path("/user2/test.file");
|
||||||
|
Path testFileInFallback = Path.mergePaths(fallbackTarget, vfsTestFile);
|
||||||
|
assertFalse(fsTarget.exists(testFileInFallback));
|
||||||
|
// user2 does not exist in fallback
|
||||||
|
assertFalse(fsTarget.exists(testFileInFallback.getParent()));
|
||||||
|
vfs.create(vfsTestFile, EnumSet.of(CREATE),
|
||||||
|
Options.CreateOpts.perms(FsPermission.getDefault()),
|
||||||
|
Options.CreateOpts.createParent()).close();
|
||||||
|
// /user2/test.file should be created in fallback
|
||||||
|
assertTrue(fsTarget.exists(testFileInFallback));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests the making of a new file on root which is not matching to any of
|
||||||
|
* fallback files on root.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testCreateFileOnRootWithFallbackEnabled()
|
||||||
|
throws Exception {
|
||||||
|
Configuration conf = new Configuration();
|
||||||
|
Path fallbackTarget = new Path(targetTestRoot, "fallbackDir");
|
||||||
|
fsTarget.mkdirs(fallbackTarget);
|
||||||
|
|
||||||
|
ConfigUtil.addLink(conf, "/user1/hive/",
|
||||||
|
new Path(targetTestRoot.toString()).toUri());
|
||||||
|
ConfigUtil.addLinkFallback(conf, fallbackTarget.toUri());
|
||||||
|
|
||||||
|
AbstractFileSystem vfs =
|
||||||
|
AbstractFileSystem.get(viewFsDefaultClusterUri, conf);
|
||||||
|
Path vfsTestFile = new Path("/test.file");
|
||||||
|
Path testFileInFallback = Path.mergePaths(fallbackTarget, vfsTestFile);
|
||||||
|
assertFalse(fsTarget.exists(testFileInFallback));
|
||||||
|
vfs.create(vfsTestFile, EnumSet.of(CREATE),
|
||||||
|
Options.CreateOpts.perms(FsPermission.getDefault())).close();
|
||||||
|
// /test.file should be created in fallback
|
||||||
|
assertTrue(fsTarget.exists(testFileInFallback));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests the create of a file on root where the path is matching to an
|
||||||
|
* existing file on fallback's file on root.
|
||||||
|
*/
|
||||||
|
@Test (expected = FileAlreadyExistsException.class)
|
||||||
|
public void testCreateFileOnRootWithFallbackWithFileAlreadyExist()
|
||||||
|
throws Exception {
|
||||||
|
Configuration conf = new Configuration();
|
||||||
|
Path fallbackTarget = new Path(targetTestRoot, "fallbackDir");
|
||||||
|
Path testFile = new Path(fallbackTarget, "test.file");
|
||||||
|
// pre-creating test file in fallback.
|
||||||
|
fsTarget.create(testFile).close();
|
||||||
|
|
||||||
|
ConfigUtil.addLink(conf, "/user1/hive/",
|
||||||
|
new Path(targetTestRoot.toString()).toUri());
|
||||||
|
ConfigUtil.addLinkFallback(conf, fallbackTarget.toUri());
|
||||||
|
|
||||||
|
AbstractFileSystem vfs =
|
||||||
|
AbstractFileSystem.get(viewFsDefaultClusterUri, conf);
|
||||||
|
Path vfsTestFile = new Path("/test.file");
|
||||||
|
assertTrue(fsTarget.exists(testFile));
|
||||||
|
vfs.create(vfsTestFile, EnumSet.of(CREATE),
|
||||||
|
Options.CreateOpts.perms(FsPermission.getDefault())).close();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests the creating of a file where the path is same as mount link path.
|
||||||
|
*/
|
||||||
|
@Test(expected= FileAlreadyExistsException.class)
|
||||||
|
public void testCreateFileWhereThePathIsSameAsItsMountLinkPath()
|
||||||
|
throws Exception {
|
||||||
|
Configuration conf = new Configuration();
|
||||||
|
Path fallbackTarget = new Path(targetTestRoot, "fallbackDir");
|
||||||
|
fsTarget.mkdirs(fallbackTarget);
|
||||||
|
|
||||||
|
ConfigUtil.addLink(conf, "/user1/hive/",
|
||||||
|
new Path(targetTestRoot.toString()).toUri());
|
||||||
|
ConfigUtil.addLinkFallback(conf, fallbackTarget.toUri());
|
||||||
|
|
||||||
|
AbstractFileSystem vfs =
|
||||||
|
AbstractFileSystem.get(viewFsDefaultClusterUri, conf);
|
||||||
|
Path vfsTestDir = new Path("/user1/hive");
|
||||||
|
assertFalse(fsTarget.exists(Path.mergePaths(fallbackTarget, vfsTestDir)));
|
||||||
|
vfs.create(vfsTestDir, EnumSet.of(CREATE),
|
||||||
|
Options.CreateOpts.perms(FsPermission.getDefault())).close();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests the create of a file where the path is same as one of of the internal
|
||||||
|
* dir path should fail.
|
||||||
|
*/
|
||||||
|
@Test(expected = FileAlreadyExistsException.class)
|
||||||
|
public void testCreateFileSameAsInternalDirPath()
|
||||||
|
throws Exception {
|
||||||
|
Configuration conf = new Configuration();
|
||||||
|
Path fallbackTarget = new Path(targetTestRoot, "fallbackDir");
|
||||||
|
fsTarget.mkdirs(fallbackTarget);
|
||||||
|
ConfigUtil.addLink(conf, "/user1/hive/",
|
||||||
|
new Path(targetTestRoot.toString()).toUri());
|
||||||
|
ConfigUtil.addLinkFallback(conf, fallbackTarget.toUri());
|
||||||
|
|
||||||
|
AbstractFileSystem vfs =
|
||||||
|
AbstractFileSystem.get(viewFsDefaultClusterUri, conf);
|
||||||
|
Path vfsTestDir = new Path("/user1");
|
||||||
|
assertFalse(fsTarget.exists(Path.mergePaths(fallbackTarget, vfsTestDir)));
|
||||||
|
vfs.create(vfsTestDir, EnumSet.of(CREATE),
|
||||||
|
Options.CreateOpts.perms(FsPermission.getDefault())).close();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue