Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -1872,4 +1872,20 @@ public static FileContext write(final FileContext fileContext,
final Path path, final CharSequence charseq) throws IOException {
return write(fileContext, path, charseq, StandardCharsets.UTF_8);
}

@InterfaceAudience.LimitedPrivate({"ViewDistributedFileSystem"})
@InterfaceStability.Unstable
/**
* Used in ViewDistributedFileSystem rename API to get access to the protected
* API of FileSystem interface. Even though Rename with options API
* deprecated, we are still using as part of trash. If any filesystem provided
* implementation to this protected FileSystem API, we can't invoke it with
* out casting to the specific filesystem. This util method is proposed to get
* the access to FileSystem#rename with options.
*/
@SuppressWarnings("deprecation")
public static void rename(FileSystem srcFs, Path src, Path dst,
final Options.Rename... options) throws IOException {
srcFs.rename(src, dst, options);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
import org.apache.hadoop.fs.FileEncryptionInfo;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FileUtil;
import org.apache.hadoop.fs.FsServerDefaults;
import org.apache.hadoop.fs.FsStatus;
import org.apache.hadoop.fs.LocatedFileStatus;
Expand Down Expand Up @@ -537,14 +538,11 @@ public void rename(Path src, Path dst, final Options.Rename... options)
return;
}

// TODO: revisit
ViewFileSystemOverloadScheme.MountPathInfo<FileSystem> mountSrcPathInfo =
this.vfs.getMountPathInfo(src, getConf());
checkDFS(mountSrcPathInfo.getTargetFs(), "rename");

ViewFileSystemOverloadScheme.MountPathInfo<FileSystem> mountDstPathInfo =
this.vfs.getMountPathInfo(src, getConf());
checkDFS(mountDstPathInfo.getTargetFs(), "rename");
this.vfs.getMountPathInfo(dst, getConf());

//Check both in same cluster.
if (!mountSrcPathInfo.getTargetFs().getUri()
Expand All @@ -553,9 +551,9 @@ public void rename(Path src, Path dst, final Options.Rename... options)
"Can't rename across file systems.");
}

((DistributedFileSystem) mountSrcPathInfo.getTargetFs())
.rename(mountSrcPathInfo.getPathOnTarget(),
mountDstPathInfo.getPathOnTarget(), options);
FileUtil.rename(mountSrcPathInfo.getTargetFs(),
mountSrcPathInfo.getPathOnTarget(), mountDstPathInfo.getPathOnTarget(),
options);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,13 @@
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.CommonConfigurationKeys;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Options;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.PathHandle;
import org.apache.hadoop.fs.viewfs.ConfigUtil;
import org.apache.hadoop.hdfs.protocol.HdfsConstants;
import org.apache.hadoop.test.Whitebox;
import org.junit.Assert;
import org.junit.Test;

import java.io.IOException;
Expand Down Expand Up @@ -89,4 +91,31 @@ public void testEmptyDelegationToken() throws IOException {
}
}
}

@Test
public void testRenameWithOptions() throws IOException {
Configuration conf = getTestConfiguration();
MiniDFSCluster cluster = null;
try {
cluster = new MiniDFSCluster.Builder(conf).numDataNodes(0).build();
URI defaultUri =
URI.create(conf.get(CommonConfigurationKeys.FS_DEFAULT_NAME_KEY));
conf.set("fs.viewfs.mounttable." + defaultUri.getHost() + ".linkFallback",
defaultUri.toString());
conf.setLong(CommonConfigurationKeys.FS_TRASH_INTERVAL_KEY, 30000);
try (ViewDistributedFileSystem fileSystem =
(ViewDistributedFileSystem) FileSystem.get(conf)) {
final Path testDir = new Path("/test");
final Path renameDir = new Path("/testRename");
fileSystem.mkdirs(testDir);
fileSystem.rename(testDir, renameDir, Options.Rename.TO_TRASH);
Assert.assertTrue(fileSystem.exists(renameDir));
Assert.assertFalse(fileSystem.exists(testDir));
}
} finally {
if (cluster != null) {
cluster.shutdown();
}
}
}
}