[partial-ns] Implement SetPermission().

Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo
Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/5fe5b9a5
Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/5fe5b9a5
Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/5fe5b9a5

Branch: refs/heads/feature-HDFS-8286
Commit: 5fe5b9a5058bc160cc2b7c0c0b979e3fd997451b
Parents: ba10017
Author: Haohui Mai <whe...@apache.org>
Authored: Fri May 22 15:17:05 2015 -0700
Committer: Haohui Mai <whe...@apache.org>
Committed: Fri Jun 12 13:56:58 2015 -0700

----------------------------------------------------------------------
 .../hdfs/server/namenode/FSDirAttrOp.java       | 50 ++++++++++----------
 .../hdfs/server/namenode/FSDirectory.java       |  5 ++
 .../hdfs/server/namenode/FSEditLogLoader.java   |  9 +++-
 .../hdfs/server/namenode/RWTransaction.java     |  5 ++
 4 files changed, 43 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hadoop/blob/5fe5b9a5/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirAttrOp.java
----------------------------------------------------------------------
diff --git 
a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirAttrOp.java
 
b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirAttrOp.java
index ef62e05..f16183f 100644
--- 
a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirAttrOp.java
+++ 
b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirAttrOp.java
@@ -17,7 +17,9 @@
  */
 package org.apache.hadoop.hdfs.server.namenode;
 
+import com.google.protobuf.ByteString;
 import org.apache.hadoop.HadoopIllegalArgumentException;
+import org.apache.hadoop.fs.InvalidPathException;
 import org.apache.hadoop.fs.PathIsNotDirectoryException;
 import org.apache.hadoop.fs.StorageType;
 import org.apache.hadoop.fs.UnresolvedLinkException;
@@ -49,23 +51,23 @@ import static 
org.apache.hadoop.hdfs.DFSConfigKeys.DFS_STORAGE_POLICY_ENABLED_KE
 
 public class FSDirAttrOp {
   static HdfsFileStatus setPermission(
-      FSDirectory fsd, final String srcArg, FsPermission permission)
+      FSDirectory fsd, final String src, FsPermission permission)
       throws IOException {
-    String src = srcArg;
     FSPermissionChecker pc = fsd.getPermissionChecker();
-    byte[][] pathComponents = 
FSDirectory.getPathComponentsForReservedPath(src);
-    INodesInPath iip;
-    fsd.writeLock();
-    try {
-      src = fsd.resolvePath(pc, src, pathComponents);
-      iip = fsd.getINodesInPath4Write(src);
+    try (RWTransaction tx = fsd.newRWTransaction().begin()) {
+      Resolver.Result paths = Resolver.resolve(tx, src);
+      if (paths.invalidPath()) {
+        throw new InvalidPathException(src);
+      } else if (paths.notFound()) {
+        throw new FileNotFoundException(src);
+      }
+      FlatINodesInPath iip = paths.inodesInPath();
       fsd.checkOwner(pc, iip);
-      unprotectedSetPermission(fsd, src, permission);
-    } finally {
-      fsd.writeUnlock();
+      unprotectedSetPermission(tx, src, permission);
+      tx.logSetPermissions(src, permission);
+      tx.commit();
+      return fsd.getAuditFileInfo(iip);
     }
-    fsd.getEditLog().logSetPermissions(src, permission);
-    return fsd.getAuditFileInfo(iip);
   }
 
   static HdfsFileStatus setOwner(
@@ -246,18 +248,18 @@ public class FSDirAttrOp {
     }
   }
 
-  static void unprotectedSetPermission(
-      FSDirectory fsd, String src, FsPermission permissions)
-      throws FileNotFoundException, UnresolvedLinkException,
-             QuotaExceededException, SnapshotAccessControlException {
-    assert fsd.hasWriteLock();
-    final INodesInPath inodesInPath = fsd.getINodesInPath4Write(src, true);
-    final INode inode = inodesInPath.getLastINode();
-    if (inode == null) {
-      throw new FileNotFoundException("File does not exist: " + src);
+  static void unprotectedSetPermission(RWTransaction tx, String src,
+      FsPermission permissions) throws IOException {
+    Resolver.Result paths = Resolver.resolve(tx, src);
+    if (paths.invalidPath()) {
+      throw new InvalidPathException(src);
+    } else if (paths.notFound()) {
+      throw new FileNotFoundException(src);
     }
-    int snapshotId = inodesInPath.getLatestSnapshotId();
-    inode.setPermission(permissions, snapshotId);
+    FlatINode inode = paths.inodesInPath().getLastINode();
+    ByteString b = new FlatINode.Builder().mergeFrom(inode).permission
+        (permissions.toShort()).build();
+    tx.putINode(inode.id(), b);
   }
 
   static void unprotectedSetOwner(

http://git-wip-us.apache.org/repos/asf/hadoop/blob/5fe5b9a5/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirectory.java
----------------------------------------------------------------------
diff --git 
a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirectory.java
 
b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirectory.java
index 7cdddaa..8fd988b 100644
--- 
a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirectory.java
+++ 
b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirectory.java
@@ -1563,6 +1563,11 @@ public class FSDirectory implements Closeable {
     checkPermission(pc, iip, true, null, null, null, null);
   }
 
+  void checkOwner(FSPermissionChecker pc, FlatINodesInPath iip)
+      throws AccessControlException {
+    // TODO
+  }
+
   void checkPathAccess(FSPermissionChecker pc, INodesInPath iip,
       FsAction access) throws AccessControlException {
     checkPermission(pc, iip, false, null, null, access, null);

http://git-wip-us.apache.org/repos/asf/hadoop/blob/5fe5b9a5/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSEditLogLoader.java
----------------------------------------------------------------------
diff --git 
a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSEditLogLoader.java
 
b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSEditLogLoader.java
index 5f87f11..4c399cb 100644
--- 
a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSEditLogLoader.java
+++ 
b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSEditLogLoader.java
@@ -581,8 +581,13 @@ public class FSEditLogLoader {
     }
     case OP_SET_PERMISSIONS: {
       SetPermissionsOp setPermissionsOp = (SetPermissionsOp)op;
-      FSDirAttrOp.unprotectedSetPermission(fsDir, renameReservedPathsOnUpgrade(
-          setPermissionsOp.src, logVersion), setPermissionsOp.permissions);
+      try (ReplayTransaction tx = fsDir.newReplayTransaction().begin()) {
+        String src = renameReservedPathsOnUpgrade(
+            setPermissionsOp.src, logVersion);
+        FSDirAttrOp.unprotectedSetPermission(tx, src, setPermissionsOp
+            .permissions);
+        tx.commit();
+      }
       break;
     }
     case OP_SET_OWNER: {

http://git-wip-us.apache.org/repos/asf/hadoop/blob/5fe5b9a5/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/RWTransaction.java
----------------------------------------------------------------------
diff --git 
a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/RWTransaction.java
 
b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/RWTransaction.java
index 5be574b..b0952a8 100644
--- 
a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/RWTransaction.java
+++ 
b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/RWTransaction.java
@@ -19,6 +19,7 @@ package org.apache.hadoop.hdfs.server.namenode;
 
 import com.google.protobuf.ByteString;
 import org.apache.hadoop.fs.Options;
+import org.apache.hadoop.fs.permission.FsPermission;
 
 import java.io.IOException;
 import java.nio.ByteBuffer;
@@ -167,4 +168,8 @@ class RWTransaction extends Transaction {
   public void logCloseFile(String path, FlatINode inode) {
     fsd.getEditLog().logCloseFile(fsd.ugid(), path, inode);
   }
+
+  public void logSetPermissions(String src, FsPermission permission) {
+    fsd.getEditLog().logSetPermissions(src, permission);
+  }
 }

Reply via email to