Repository: hadoop
Updated Branches:
  refs/heads/HDFS-8966 b645d67a9 -> 1ecc33005 (forced update)


HDFS-9273. ACLs on root directory may be lost after NN restart. Contributed by 
Xiao Chen.


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

Branch: refs/heads/HDFS-8966
Commit: 1b525a9c32fabd8919c80717a58afbfa7fdce27e
Parents: d1cdce7
Author: cnauroth <cnaur...@apache.org>
Authored: Wed Oct 21 16:39:02 2015 -0700
Committer: cnauroth <cnaur...@apache.org>
Committed: Wed Oct 21 16:39:02 2015 -0700

----------------------------------------------------------------------
 hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt     |  3 ++
 .../server/namenode/FSImageFormatPBINode.java   |  4 +++
 .../server/namenode/TestFSImageWithAcl.java     | 29 ++++++++++++++++++++
 3 files changed, 36 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hadoop/blob/1b525a9c/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt 
b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt
index 4565f8a..949dc80 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt
+++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt
@@ -2107,6 +2107,9 @@ Release 2.8.0 - UNRELEASED
     HDFS-9274. Default value of 
dfs.datanode.directoryscan.throttle.limit.ms.per.sec
     should be consistent. (Yi Liu via zhz)
 
+    HDFS-9273. ACLs on root directory may be lost after NN restart.
+    (Xiao Chen via cnauroth)
+
 Release 2.7.2 - UNRELEASED
 
   INCOMPATIBLE CHANGES

http://git-wip-us.apache.org/repos/asf/hadoop/blob/1b525a9c/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSImageFormatPBINode.java
----------------------------------------------------------------------
diff --git 
a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSImageFormatPBINode.java
 
b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSImageFormatPBINode.java
index 34b28e4..cf7895b 100644
--- 
a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSImageFormatPBINode.java
+++ 
b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSImageFormatPBINode.java
@@ -418,6 +418,10 @@ public final class FSImageFormatPBINode {
       }
       dir.rootDir.cloneModificationTime(root);
       dir.rootDir.clonePermissionStatus(root);
+      final AclFeature af = root.getFeature(AclFeature.class);
+      if (af != null) {
+        dir.rootDir.addAclFeature(af);
+      }
       // root dir supports having extended attributes according to POSIX
       final XAttrFeature f = root.getXAttrFeature();
       if (f != null) {

http://git-wip-us.apache.org/repos/asf/hadoop/blob/1b525a9c/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFSImageWithAcl.java
----------------------------------------------------------------------
diff --git 
a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFSImageWithAcl.java
 
b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFSImageWithAcl.java
index bd88478..690fec6 100644
--- 
a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFSImageWithAcl.java
+++ 
b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFSImageWithAcl.java
@@ -206,6 +206,35 @@ public class TestFSImageWithAcl {
     doTestDefaultAclNewChildren(false);
   }
 
+  @Test
+  public void testRootACLAfterLoadingFsImage() throws IOException {
+    DistributedFileSystem fs = cluster.getFileSystem();
+    Path rootdir = new Path("/");
+    AclEntry e1 = new AclEntry.Builder().setName("foo")
+        .setPermission(ALL).setScope(ACCESS).setType(GROUP).build();
+    AclEntry e2 = new AclEntry.Builder().setName("bar")
+        .setPermission(READ).setScope(ACCESS).setType(GROUP).build();
+    fs.modifyAclEntries(rootdir, Lists.newArrayList(e1, e2));
+
+    AclStatus s = cluster.getNamesystem().getAclStatus(rootdir.toString());
+    AclEntry[] returned =
+        Lists.newArrayList(s.getEntries()).toArray(new AclEntry[0]);
+    Assert.assertArrayEquals(
+        new AclEntry[] { aclEntry(ACCESS, GROUP, READ_EXECUTE),
+            aclEntry(ACCESS, GROUP, "bar", READ),
+            aclEntry(ACCESS, GROUP, "foo", ALL) }, returned);
+
+    // restart - hence save and load from fsimage
+    restart(fs, true);
+
+    s = cluster.getNamesystem().getAclStatus(rootdir.toString());
+    returned = Lists.newArrayList(s.getEntries()).toArray(new AclEntry[0]);
+    Assert.assertArrayEquals(
+        new AclEntry[] { aclEntry(ACCESS, GROUP, READ_EXECUTE),
+            aclEntry(ACCESS, GROUP, "bar", READ),
+            aclEntry(ACCESS, GROUP, "foo", ALL) }, returned);
+  }
+
   /**
    * Restart the NameNode, optionally saving a new checkpoint.
    *

Reply via email to