Преглед изворни кода

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

(cherry picked from commit 1b525a9c32fabd8919c80717a58afbfa7fdce27e)
(cherry picked from commit faf1c608990408e2aa59a5e676f86d0c82dbd7f3)
(cherry picked from commit 339714baa0124d44c10d375a99fec7e1968445b1)
cnauroth пре 9 година
родитељ
комит
3971f255e3

+ 3 - 0
hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt

@@ -12,6 +12,9 @@ Release 2.6.4 - UNRELEASED
 
   BUG FIXES
 
+    HDFS-9273. ACLs on root directory may be lost after NN restart.
+    (Xiao Chen via cnauroth)
+
 Release 2.6.3 - UNRELEASED
 
   INCOMPATIBLE CHANGES

+ 4 - 0
hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSImageFormatPBINode.java

@@ -338,6 +338,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) {

+ 29 - 0
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.
    *