Author: wheat9 Date: Fri Apr 25 05:56:51 2014 New Revision: 1589934 URL: http://svn.apache.org/r1589934 Log: HDFS-6210. Merge r1589933 from trunk.
Added: hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/tools/offlineImageViewer/TestOfflineImageViewerForAcl.java - copied unchanged from r1589933, hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/tools/offlineImageViewer/TestOfflineImageViewerForAcl.java 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/tools/offlineImageViewer/FSImageHandler.java hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineImageViewer/FSImageLoader.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=1589934&r1=1589933&r2=1589934&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 Fri Apr 25 05:56:51 2014 @@ -74,6 +74,9 @@ Release 2.5.0 - UNRELEASED HDFS-6266. Identify full path for a given INode. (jing9) + HDFS-6210. Support GETACLSTATUS operation in WebImageViewer. + (Akira Ajisaka via wheat9) + OPTIMIZATIONS HDFS-6214. Webhdfs has poor throughput for files >2GB (daryn) Modified: hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineImageViewer/FSImageHandler.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineImageViewer/FSImageHandler.java?rev=1589934&r1=1589933&r2=1589934&view=diff ============================================================================== --- hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineImageViewer/FSImageHandler.java (original) +++ hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineImageViewer/FSImageHandler.java Fri Apr 25 05:56:51 2014 @@ -104,6 +104,8 @@ public class FSImageHandler extends Simp content = loader.getFileStatus(path); } else if (op.equals("LISTSTATUS")) { content = loader.listStatus(path); + } else if (op.equals("GETACLSTATUS")) { + content = loader.getAclStatus(path); } else { response.setStatus(HttpResponseStatus.BAD_REQUEST); } Modified: hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineImageViewer/FSImageLoader.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineImageViewer/FSImageLoader.java?rev=1589934&r1=1589933&r2=1589934&view=diff ============================================================================== --- hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineImageViewer/FSImageLoader.java (original) +++ hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineImageViewer/FSImageLoader.java Fri Apr 25 05:56:51 2014 @@ -31,6 +31,7 @@ import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.fs.permission.AclEntry; import org.apache.hadoop.fs.permission.FsPermission; import org.apache.hadoop.fs.permission.PermissionStatus; import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos; @@ -271,6 +272,81 @@ class FSImageLoader { } /** + * Return the JSON formatted ACL status of the specified file. + * @param path a path specifies a file + * @return JSON formatted AclStatus + * @throws IOException if failed to serialize fileStatus to JSON. + */ + String getAclStatus(String path) throws IOException { + StringBuilder sb = new StringBuilder(); + List<AclEntry> aclEntryList = getAclEntryList(path); + PermissionStatus p = getPermissionStatus(path); + sb.append("{\"AclStatus\":{\"entries\":["); + int i = 0; + for (AclEntry aclEntry : aclEntryList) { + if (i++ != 0) { + sb.append(','); + } + sb.append('"'); + sb.append(aclEntry.toString()); + sb.append('"'); + } + sb.append("],\"group\": \""); + sb.append(p.getGroupName()); + sb.append("\",\"owner\": \""); + sb.append(p.getUserName()); + sb.append("\",\"stickyBit\": "); + sb.append(p.getPermission().getStickyBit()); + sb.append("}}\n"); + return sb.toString(); + } + + private List<AclEntry> getAclEntryList(String path) { + long id = getINodeId(path); + FsImageProto.INodeSection.INode inode = inodes.get(id); + switch (inode.getType()) { + case FILE: { + FsImageProto.INodeSection.INodeFile f = inode.getFile(); + return FSImageFormatPBINode.Loader.loadAclEntries( + f.getAcl(), stringTable); + } + case DIRECTORY: { + FsImageProto.INodeSection.INodeDirectory d = inode.getDirectory(); + return FSImageFormatPBINode.Loader.loadAclEntries( + d.getAcl(), stringTable); + } + default: { + return new ArrayList<AclEntry>(); + } + } + } + + private PermissionStatus getPermissionStatus(String path) { + long id = getINodeId(path); + FsImageProto.INodeSection.INode inode = inodes.get(id); + switch (inode.getType()) { + case FILE: { + FsImageProto.INodeSection.INodeFile f = inode.getFile(); + return FSImageFormatPBINode.Loader.loadPermission( + f.getPermission(), stringTable); + } + case DIRECTORY: { + FsImageProto.INodeSection.INodeDirectory d = inode.getDirectory(); + return FSImageFormatPBINode.Loader.loadPermission( + d.getPermission(), stringTable); + } + case SYMLINK: { + FsImageProto.INodeSection.INodeSymlink s = inode.getSymlink(); + return FSImageFormatPBINode.Loader.loadPermission( + s.getPermission(), stringTable); + } + default: { + return null; + } + } + } + + /** * Return the INodeId of the specified path. */ private long getINodeId(String strPath) {