Repository: hbase Updated Branches: refs/heads/branch-1 d0af30ea3 -> bee9fb8e7
HBASE-13176 Flakey TestZooKeeper test. Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/bee9fb8e Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/bee9fb8e Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/bee9fb8e Branch: refs/heads/branch-1 Commit: bee9fb8e7e3a0c3dcdc631908a09fbd4bc11efb0 Parents: d0af30e Author: Andrey Stepachev <oct...@gmail.com> Authored: Tue Mar 17 15:00:10 2015 +0000 Committer: Andrey Stepachev <oct...@gmail.com> Committed: Tue Mar 17 15:00:10 2015 +0000 ---------------------------------------------------------------------- .../org/apache/hadoop/hbase/TestZooKeeper.java | 58 ++++++++++++++------ 1 file changed, 42 insertions(+), 16 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/bee9fb8e/hbase-server/src/test/java/org/apache/hadoop/hbase/TestZooKeeper.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/TestZooKeeper.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/TestZooKeeper.java index 3065812..6e233f7 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/TestZooKeeper.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/TestZooKeeper.java @@ -36,7 +36,6 @@ import org.apache.commons.logging.LogFactory; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.client.Admin; import org.apache.hadoop.hbase.client.Get; -import org.apache.hadoop.hbase.client.HBaseAdmin; import org.apache.hadoop.hbase.client.HConnection; import org.apache.hadoop.hbase.client.HConnectionManager; import org.apache.hadoop.hbase.client.HTable; @@ -45,6 +44,7 @@ import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.client.ResultScanner; import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.client.Table; +import org.apache.hadoop.hbase.coordination.ZkSplitLogWorkerCoordination; import org.apache.hadoop.hbase.master.HMaster; import org.apache.hadoop.hbase.master.LoadBalancer; import org.apache.hadoop.hbase.master.balancer.SimpleLoadBalancer; @@ -238,7 +238,7 @@ public class TestZooKeeper { MiniHBaseCluster cluster = TEST_UTIL.getHBaseCluster(); HMaster m = cluster.getMaster(); m.abort("Test recovery from zk session expired", - new KeeperException.SessionExpiredException()); + new KeeperException.SessionExpiredException()); assertTrue(m.isStopped()); // Master doesn't recover any more testSanity("testMasterZKSessionRecoveryFailure"); } @@ -253,7 +253,7 @@ public class TestZooKeeper { HColumnDescriptor family = new HColumnDescriptor("fam"); desc.addFamily(family); LOG.info("Creating table " + tableName); - Admin admin = new HBaseAdmin(TEST_UTIL.getConfiguration()); + Admin admin = TEST_UTIL.getHBaseAdmin(); try { admin.createTable(desc); } finally { @@ -529,24 +529,22 @@ public class TestZooKeeper { cluster.startRegionServer(); cluster.waitForActiveAndReadyMaster(10000); HMaster m = cluster.getMaster(); - ZooKeeperWatcher zkw = m.getZooKeeper(); - int expectedNumOfListeners = zkw.getNumberOfListeners(); + final ZooKeeperWatcher zkw = m.getZooKeeper(); // now the cluster is up. So assign some regions. - Admin admin = new HBaseAdmin(TEST_UTIL.getConfiguration()); - try { + try (Admin admin = TEST_UTIL.getHBaseAdmin()) { byte[][] SPLIT_KEYS = new byte[][] { Bytes.toBytes("a"), Bytes.toBytes("b"), - Bytes.toBytes("c"), Bytes.toBytes("d"), Bytes.toBytes("e"), Bytes.toBytes("f"), - Bytes.toBytes("g"), Bytes.toBytes("h"), Bytes.toBytes("i"), Bytes.toBytes("j") }; + Bytes.toBytes("c"), Bytes.toBytes("d"), Bytes.toBytes("e"), Bytes.toBytes("f"), + Bytes.toBytes("g"), Bytes.toBytes("h"), Bytes.toBytes("i"), Bytes.toBytes("j") }; String tableName = "testRegionAssignmentAfterMasterRecoveryDueToZKExpiry"; HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(tableName)); htd.addFamily(new HColumnDescriptor(HConstants.CATALOG_FAMILY)); admin.createTable(htd, SPLIT_KEYS); - ZooKeeperWatcher zooKeeperWatcher = HBaseTestingUtility.getZooKeeperWatcher(TEST_UTIL); - ZKAssign.blockUntilNoRIT(zooKeeperWatcher); + TEST_UTIL.waitUntilNoRegionsInTransition(60000); m.getZooKeeper().close(); MockLoadBalancer.retainAssignCalled = false; + final int expectedNumOfListeners = countPermanentListeners(zkw); m.abort("Test recovery from zk session expired", - new KeeperException.SessionExpiredException()); + new KeeperException.SessionExpiredException()); assertTrue(m.isStopped()); // Master doesn't recover any more // The recovered master should not call retainAssignment, as it is not a // clean startup. @@ -554,12 +552,40 @@ public class TestZooKeeper { // number of listeners should be same as the value before master aborted // wait for new master is initialized cluster.waitForActiveAndReadyMaster(120000); - assertEquals(expectedNumOfListeners, zkw.getNumberOfListeners()); - } finally { - admin.close(); + final HMaster newMaster = cluster.getMasterThread().getMaster(); + assertEquals(expectedNumOfListeners, countPermanentListeners(newMaster.getZooKeeper())); + } + } + + /** + * Count listeners in zkw excluding listeners, that belongs to workers or other + * temporary processes. + */ + private int countPermanentListeners(ZooKeeperWatcher watcher) { + return countListeners(watcher, ZkSplitLogWorkerCoordination.class); + } + + /** + * Count listeners in zkw excluding provided classes + */ + private int countListeners(ZooKeeperWatcher watcher, Class<?>... exclude) { + int cnt = 0; + for (Object o : watcher.getListeners()) { + boolean skip = false; + for (Class<?> aClass : exclude) { + if (aClass.isAssignableFrom(o.getClass())) { + skip = true; + break; + } + } + if (!skip) { + cnt += 1; + } } + return cnt; } + /** * Tests whether the logs are split when master recovers from a expired zookeeper session and an * RS goes down. @@ -571,7 +597,7 @@ public class TestZooKeeper { cluster.startRegionServer(); HMaster m = cluster.getMaster(); // now the cluster is up. So assign some regions. - Admin admin = new HBaseAdmin(TEST_UTIL.getConfiguration()); + Admin admin = TEST_UTIL.getHBaseAdmin(); Table table = null; try { byte[][] SPLIT_KEYS = new byte[][] { Bytes.toBytes("1"), Bytes.toBytes("2"),