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

(cherry picked from commit 1b525a9c32)
(cherry picked from commit faf1c60899)
This commit is contained in:
cnauroth 2015-10-21 16:39:02 -07:00 committed by Vinod Kumar Vavilapalli
parent 0460b8a8a3
commit e23ab9d02b
3 changed files with 36 additions and 0 deletions

View File

@ -33,6 +33,9 @@ Release 2.7.3 - UNRELEASED
HDFS-9314. Improve BlockPlacementPolicyDefault's picking of excess
replicas. (Xiao Chen 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

View File

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

View File

@ -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.
*