HADOOP-14543. ZKFC should use getAversion() while setting the zkacl. Contributed by Brahma Reddy Battula.
Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/0111711d Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/0111711d Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/0111711d Branch: refs/heads/HADOOP-13345 Commit: 0111711d8b2355a12a3e5f4da7f5a91e89355c1b Parents: c6bd73c Author: Arpit Agarwal <[email protected]> Authored: Fri Jun 23 16:50:47 2017 -0700 Committer: Arpit Agarwal <[email protected]> Committed: Fri Jun 23 16:50:47 2017 -0700 ---------------------------------------------------------------------- .../apache/hadoop/ha/ActiveStandbyElector.java | 2 +- .../ha/TestActiveStandbyElectorRealZK.java | 28 ++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/0111711d/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/ActiveStandbyElector.java ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/ActiveStandbyElector.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/ActiveStandbyElector.java index dec401e..cf95a49 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/ActiveStandbyElector.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/ActiveStandbyElector.java @@ -1080,7 +1080,7 @@ public class ActiveStandbyElector implements StatCallback, StringCallback { List<ACL> acl = zkClient.getACL(path, stat); if (acl == null || !acl.containsAll(zkAcl) || !zkAcl.containsAll(acl)) { - zkClient.setACL(path, zkAcl, stat.getVersion()); + zkClient.setACL(path, zkAcl, stat.getAversion()); } return null; } http://git-wip-us.apache.org/repos/asf/hadoop/blob/0111711d/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ha/TestActiveStandbyElectorRealZK.java ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ha/TestActiveStandbyElectorRealZK.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ha/TestActiveStandbyElectorRealZK.java index fb8c236..59c0886 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ha/TestActiveStandbyElectorRealZK.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ha/TestActiveStandbyElectorRealZK.java @@ -30,7 +30,9 @@ import org.apache.hadoop.ha.ActiveStandbyElector.ActiveStandbyElectorCallback; import org.apache.hadoop.ha.ActiveStandbyElector.State; import org.apache.hadoop.util.ZKUtil.ZKAuthInfo; import org.apache.log4j.Level; +import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.ZooDefs.Ids; +import org.apache.zookeeper.ZooKeeper; import org.apache.zookeeper.server.ZooKeeperServer; import org.junit.Test; import org.mockito.AdditionalMatchers; @@ -256,4 +258,30 @@ public class TestActiveStandbyElectorRealZK extends ClientBaseWithFixes { Mockito.verify(cbs[1], Mockito.never()).becomeActive(); checkFatalsAndReset(); } + + /** + * Test to verify that proper ZooKeeper ACLs can be updated on + * ActiveStandbyElector's parent znode. + */ + @Test(timeout = 15000) + public void testSetZooKeeperACLsOnParentZnodeName() + throws Exception { + ActiveStandbyElectorCallback cb = + Mockito.mock(ActiveStandbyElectorCallback.class); + ActiveStandbyElector elector = + new ActiveStandbyElector(hostPort, 5000, PARENT_DIR, + Ids.READ_ACL_UNSAFE, Collections.<ZKAuthInfo>emptyList(), cb, + CommonConfigurationKeys.HA_FC_ELECTOR_ZK_OP_RETRIES_DEFAULT); + + // Simulate the case by pre-creating znode 'parentZnodeName'. Then updates + // znode's data so that data version will be increased to 1. Here znode's + // aversion is 0. + ZooKeeper otherClient = createClient(); + otherClient.create(PARENT_DIR, "sample1".getBytes(), Ids.OPEN_ACL_UNSAFE, + CreateMode.PERSISTENT); + otherClient.setData(PARENT_DIR, "sample2".getBytes(), -1); + otherClient.close(); + + elector.ensureParentZNode(); + } } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
