HADOOP-17060. Clarify listStatus and getFileStatus behaviors inconsistent in the case of ViewFs implementation for isDirectory. Contributed by Uma Maheswara Rao G.
(cherry picked from commit 93b121a971
)
This commit is contained in:
parent
fc9445abbd
commit
4a9ec4d143
|
@ -486,6 +486,14 @@ public class ViewFileSystem extends FileSystem {
|
|||
: new ViewFsFileStatus(orig, qualified);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* If the given path is a symlink(mount link), the path will be resolved to a
|
||||
* target path and it will get the resolved path's FileStatus object. It will
|
||||
* not be represented as a symlink and isDirectory API returns true if the
|
||||
* resolved path is a directory, false otherwise.
|
||||
*/
|
||||
@Override
|
||||
public FileStatus getFileStatus(final Path f) throws AccessControlException,
|
||||
FileNotFoundException, IOException {
|
||||
|
@ -503,6 +511,25 @@ public class ViewFileSystem extends FileSystem {
|
|||
res.targetFileSystem.access(res.remainingPath, mode);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* Note: listStatus on root("/") considers listing from fallbackLink if
|
||||
* available. If the same directory name is present in configured mount path
|
||||
* as well as in fallback link, then only the configured mount path will be
|
||||
* listed in the returned result.
|
||||
*
|
||||
* If any of the the immediate children of the given path f is a symlink(mount
|
||||
* link), the returned FileStatus object of that children would be represented
|
||||
* as a symlink. It will not be resolved to the target path and will not get
|
||||
* the target path FileStatus object. The target path will be available via
|
||||
* getSymlink on that children's FileStatus object. Since it represents as
|
||||
* symlink, isDirectory on that children's FileStatus will return false.
|
||||
*
|
||||
* If you want to get the FileStatus of target path for that children, you may
|
||||
* want to use GetFileStatus API with that children's symlink path. Please see
|
||||
* {@link ViewFileSystem#getFileStatus(Path f)}
|
||||
*/
|
||||
@Override
|
||||
public FileStatus[] listStatus(final Path f) throws AccessControlException,
|
||||
FileNotFoundException, IOException {
|
||||
|
@ -1135,20 +1162,11 @@ public class ViewFileSystem extends FileSystem {
|
|||
checkPathIsSlash(f);
|
||||
return new FileStatus(0, true, 0, 0, creationTime, creationTime,
|
||||
PERMISSION_555, ugi.getShortUserName(), ugi.getPrimaryGroupName(),
|
||||
|
||||
new Path(theInternalDir.fullPath).makeQualified(
|
||||
myUri, ROOT_PATH));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* Note: listStatus on root("/") considers listing from fallbackLink if
|
||||
* available. If the same directory name is present in configured mount
|
||||
* path as well as in fallback link, then only the configured mount path
|
||||
* will be listed in the returned result.
|
||||
*/
|
||||
@Override
|
||||
public FileStatus[] listStatus(Path f) throws AccessControlException,
|
||||
FileNotFoundException, IOException {
|
||||
|
|
|
@ -351,6 +351,14 @@ public class ViewFs extends AbstractFileSystem {
|
|||
return res.targetFileSystem.getFileChecksum(res.remainingPath);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* If the given path is a symlink(mount link), the path will be resolved to a
|
||||
* target path and it will get the resolved path's FileStatus object. It will
|
||||
* not be represented as a symlink and isDirectory API returns true if the
|
||||
* resolved path is a directory, false otherwise.
|
||||
*/
|
||||
@Override
|
||||
public FileStatus getFileStatus(final Path f) throws AccessControlException,
|
||||
FileNotFoundException, UnresolvedLinkException, IOException {
|
||||
|
@ -436,6 +444,22 @@ public class ViewFs extends AbstractFileSystem {
|
|||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* If any of the the immediate children of the given path f is a symlink(mount
|
||||
* link), the returned FileStatus object of that children would be represented
|
||||
* as a symlink. It will not be resolved to the target path and will not get
|
||||
* the target path FileStatus object. The target path will be available via
|
||||
* getSymlink on that children's FileStatus object. Since it represents as
|
||||
* symlink, isDirectory on that children's FileStatus will return false.
|
||||
*
|
||||
* If you want to get the FileStatus of target path for that children, you may
|
||||
* want to use GetFileStatus API with that children's symlink path. Please see
|
||||
* {@link ViewFs#getFileStatus(Path f)}
|
||||
*
|
||||
* Note: In ViewFs, the mount links are represented as symlinks.
|
||||
*/
|
||||
@Override
|
||||
public FileStatus[] listStatus(final Path f) throws AccessControlException,
|
||||
FileNotFoundException, UnresolvedLinkException, IOException {
|
||||
|
|
|
@ -135,6 +135,14 @@ public class Hdfs extends AbstractFileSystem {
|
|||
return dfs.getFileChecksumWithCombineMode(getUriPath(f), Long.MAX_VALUE);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* If the given path is a symlink, the path will be resolved to a target path
|
||||
* and it will get the resolved path's FileStatus object. It will not be
|
||||
* represented as a symlink and isDirectory API returns true if the resolved
|
||||
* path is a directory, false otherwise.
|
||||
*/
|
||||
@Override
|
||||
public FileStatus getFileStatus(Path f)
|
||||
throws IOException, UnresolvedLinkException {
|
||||
|
@ -269,6 +277,20 @@ public class Hdfs extends AbstractFileSystem {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* If any of the the immediate children of the given path f is a symlink, the
|
||||
* returned FileStatus object of that children would be represented as a
|
||||
* symlink. It will not be resolved to the target path and will not get the
|
||||
* target path FileStatus object. The target path will be available via
|
||||
* getSymlink on that children's FileStatus object. Since it represents as
|
||||
* symlink, isDirectory on that children's FileStatus will return false.
|
||||
*
|
||||
* If you want to get the FileStatus of target path for that children, you may
|
||||
* want to use GetFileStatus API with that children's symlink path. Please see
|
||||
* {@link Hdfs#getFileStatus(Path f)}
|
||||
*/
|
||||
@Override
|
||||
public FileStatus[] listStatus(Path f)
|
||||
throws IOException, UnresolvedLinkException {
|
||||
|
|
|
@ -1103,10 +1103,21 @@ public class DistributedFileSystem extends FileSystem
|
|||
/**
|
||||
* List all the entries of a directory
|
||||
*
|
||||
* Note that this operation is not atomic for a large directory.
|
||||
* The entries of a directory may be fetched from NameNode multiple times.
|
||||
* It only guarantees that each name occurs once if a directory
|
||||
* undergoes changes between the calls.
|
||||
* Note that this operation is not atomic for a large directory. The entries
|
||||
* of a directory may be fetched from NameNode multiple times. It only
|
||||
* guarantees that each name occurs once if a directory undergoes changes
|
||||
* between the calls.
|
||||
*
|
||||
* If any of the the immediate children of the given path f is a symlink, the
|
||||
* returned FileStatus object of that children would be represented as a
|
||||
* symlink. It will not be resolved to the target path and will not get the
|
||||
* target path FileStatus object. The target path will be available via
|
||||
* getSymlink on that children's FileStatus object. Since it represents as
|
||||
* symlink, isDirectory on that children's FileStatus will return false.
|
||||
*
|
||||
* If you want to get the FileStatus of target path for that children, you may
|
||||
* want to use GetFileStatus API with that children's symlink path. Please see
|
||||
* {@link DistributedFileSystem#getFileStatus(Path f)}
|
||||
*/
|
||||
@Override
|
||||
public FileStatus[] listStatus(Path p) throws IOException {
|
||||
|
@ -1568,6 +1579,12 @@ public class DistributedFileSystem extends FileSystem
|
|||
|
||||
/**
|
||||
* Returns the stat information about the file.
|
||||
*
|
||||
* If the given path is a symlink, the path will be resolved to a target path
|
||||
* and it will get the resolved path's FileStatus object. It will not be
|
||||
* represented as a symlink and isDirectory API returns true if the resolved
|
||||
* path is a directory, false otherwise.
|
||||
*
|
||||
* @throws FileNotFoundException if the file does not exist.
|
||||
*/
|
||||
@Override
|
||||
|
|
Loading…
Reference in New Issue