HBASE-19248 Move tests that need to look at Connection internals to test of said internals.
Signed-off-by: zhangduo <zhang...@apache.org> Signed-off-by: Chia-Ping Tsai <chia7...@gmail.com> Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/9c85d001 Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/9c85d001 Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/9c85d001 Branch: refs/heads/branch-2 Commit: 9c85d0017f1452f266253d64fde8d513eb571f75 Parents: a1d86d9 Author: Sean Busbey <bus...@apache.org> Authored: Mon Nov 13 18:52:33 2017 -0600 Committer: Sean Busbey <bus...@apache.org> Committed: Wed Nov 15 08:40:03 2017 -0600 ---------------------------------------------------------------------- .../hadoop/hbase/client/ZKAsyncRegistry.java | 10 +- .../org/apache/hadoop/hbase/TestZooKeeper.java | 121 ------------------- .../hbase/client/TestZKAsyncRegistry.java | 22 ++++ 3 files changed, 30 insertions(+), 123 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/9c85d001/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ZKAsyncRegistry.java ---------------------------------------------------------------------- diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ZKAsyncRegistry.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ZKAsyncRegistry.java index fedd527..e36de01 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ZKAsyncRegistry.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ZKAsyncRegistry.java @@ -44,6 +44,9 @@ import org.apache.hadoop.hbase.RegionLocations; import org.apache.hadoop.hbase.ServerName; import org.apache.hadoop.hbase.exceptions.DeserializationException; import org.apache.hadoop.hbase.master.RegionState; +import org.apache.hadoop.hbase.shaded.com.google.common.annotations.VisibleForTesting; +import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos; +import org.apache.hadoop.hbase.shaded.protobuf.generated.ZooKeeperProtos; import org.apache.hadoop.hbase.util.Pair; import org.apache.hadoop.hbase.util.Threads; import org.apache.hadoop.hbase.zookeeper.ZKConfig; @@ -51,8 +54,6 @@ import org.apache.hadoop.hbase.zookeeper.ZNodePaths; import org.apache.yetus.audience.InterfaceAudience; import org.apache.zookeeper.data.Stat; -import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos; -import org.apache.hadoop.hbase.shaded.protobuf.generated.ZooKeeperProtos; /** * Fetch the registry data from zookeeper. @@ -115,6 +116,11 @@ class ZKAsyncRegistry implements AsyncRegistry { return exec(zk.getData(), znodePaths.clusterIdZNode, ZKAsyncRegistry::getClusterId); } + @VisibleForTesting + CuratorFramework getCuratorFramework() { + return zk; + } + private static ZooKeeperProtos.MetaRegionServer getMetaProto(CuratorEvent event) throws IOException { byte[] data = event.getData(); http://git-wip-us.apache.org/repos/asf/hbase/blob/9c85d001/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 f75c7a4..d546d5d 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 @@ -26,8 +26,6 @@ import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.IOException; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; import java.util.List; import java.util.Map; @@ -35,9 +33,6 @@ import org.apache.commons.logging.Log; 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.Connection; -import org.apache.hadoop.hbase.client.ConnectionFactory; -import org.apache.hadoop.hbase.client.Get; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.client.RegionInfo; import org.apache.hadoop.hbase.client.Result; @@ -61,15 +56,12 @@ import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.ZooDefs; import org.apache.zookeeper.ZooKeeper; -import org.apache.zookeeper.ZooKeeper.States; import org.apache.zookeeper.data.ACL; import org.apache.zookeeper.data.Stat; import org.junit.After; import org.junit.AfterClass; -import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; -import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.experimental.categories.Category; @@ -131,92 +123,6 @@ public class TestZooKeeper { } } - private ZooKeeperWatcher getZooKeeperWatcher(Connection c) - throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { - Method getterZK = c.getClass().getDeclaredMethod("getKeepAliveZooKeeperWatcher"); - getterZK.setAccessible(true); - return (ZooKeeperWatcher) getterZK.invoke(c); - } - - - /** - * See HBASE-1232 and http://hbase.apache.org/book.html#trouble.zookeeper. - * @throws IOException - * @throws InterruptedException - */ - @Ignore("fails frequently, disabled for now, see HBASE-6406") - @Test - public void testClientSessionExpired() throws Exception { - Configuration c = new Configuration(TEST_UTIL.getConfiguration()); - - // We don't want to share the connection as we will check its state - c.set(HConstants.HBASE_CLIENT_INSTANCE_ID, "1111"); - - Connection connection = ConnectionFactory.createConnection(c); - - ZooKeeperWatcher connectionZK = getZooKeeperWatcher(connection); - LOG.info("ZooKeeperWatcher= 0x"+ Integer.toHexString( - connectionZK.hashCode())); - LOG.info("getRecoverableZooKeeper= 0x"+ Integer.toHexString( - connectionZK.getRecoverableZooKeeper().hashCode())); - LOG.info("session="+Long.toHexString( - connectionZK.getRecoverableZooKeeper().getSessionId())); - - TEST_UTIL.expireSession(connectionZK); - - LOG.info("Before using zkw state=" + - connectionZK.getRecoverableZooKeeper().getState()); - // provoke session expiration by doing something with ZK - try { - connectionZK.getRecoverableZooKeeper().getZooKeeper().exists( - "/1/1", false); - } catch (KeeperException ignored) { - } - - // Check that the old ZK connection is closed, means we did expire - States state = connectionZK.getRecoverableZooKeeper().getState(); - LOG.info("After using zkw state=" + state); - LOG.info("session="+Long.toHexString( - connectionZK.getRecoverableZooKeeper().getSessionId())); - - // It's asynchronous, so we may have to wait a little... - final long limit1 = System.currentTimeMillis() + 3000; - while (System.currentTimeMillis() < limit1 && state != States.CLOSED){ - state = connectionZK.getRecoverableZooKeeper().getState(); - } - LOG.info("After using zkw loop=" + state); - LOG.info("ZooKeeper should have timed out"); - LOG.info("session="+Long.toHexString( - connectionZK.getRecoverableZooKeeper().getSessionId())); - - // It's surprising but sometimes we can still be in connected state. - // As it's known (even if not understood) we don't make the the test fail - // for this reason.) - // Assert.assertTrue("state=" + state, state == States.CLOSED); - - // Check that the client recovered - ZooKeeperWatcher newConnectionZK = getZooKeeperWatcher(connection); - - States state2 = newConnectionZK.getRecoverableZooKeeper().getState(); - LOG.info("After new get state=" +state2); - - // As it's an asynchronous event we may got the same ZKW, if it's not - // yet invalidated. Hence this loop. - final long limit2 = System.currentTimeMillis() + 3000; - while (System.currentTimeMillis() < limit2 && - state2 != States.CONNECTED && state2 != States.CONNECTING) { - - newConnectionZK = getZooKeeperWatcher(connection); - state2 = newConnectionZK.getRecoverableZooKeeper().getState(); - } - LOG.info("After new get state loop=" + state2); - - Assert.assertTrue( - state2 == States.CONNECTED || state2 == States.CONNECTING); - - connection.close(); - } - @Test (timeout = 120000) public void testRegionServerSessionExpired() throws Exception { LOG.info("Starting " + name.getMethodName()); @@ -272,33 +178,6 @@ public class TestZooKeeper { table.close(); } - @Test - public void testMultipleZK() - throws IOException, NoSuchMethodException, InvocationTargetException, IllegalAccessException { - Table localMeta = TEST_UTIL.getConnection().getTable(TableName.META_TABLE_NAME); - Configuration otherConf = new Configuration(TEST_UTIL.getConfiguration()); - otherConf.set(HConstants.ZOOKEEPER_QUORUM, "127.0.0.1"); - Connection connection = ConnectionFactory.createConnection(otherConf); - Table ipMeta = connection.getTable(TableName.META_TABLE_NAME); - - // dummy, just to open the connection - final byte [] row = new byte [] {'r'}; - localMeta.exists(new Get(row)); - ipMeta.exists(new Get(row)); - - // make sure they aren't the same - ZooKeeperWatcher z1 = - getZooKeeperWatcher(ConnectionFactory.createConnection(localMeta.getConfiguration())); - ZooKeeperWatcher z2 = - getZooKeeperWatcher(ConnectionFactory.createConnection(otherConf)); - assertFalse(z1 == z2); - assertFalse(z1.getQuorum().equals(z2.getQuorum())); - - localMeta.close(); - ipMeta.close(); - connection.close(); - } - /** * Create a znode with data * @throws Exception http://git-wip-us.apache.org/repos/asf/hbase/blob/9c85d001/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestZKAsyncRegistry.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestZKAsyncRegistry.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestZKAsyncRegistry.java index b092a25..a8a7de0 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestZKAsyncRegistry.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestZKAsyncRegistry.java @@ -19,7 +19,9 @@ package org.apache.hadoop.hbase.client; import static org.apache.hadoop.hbase.HConstants.META_REPLICAS_NUM; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertTrue; import java.io.IOException; @@ -28,7 +30,10 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.IntStream; import org.apache.commons.io.IOUtils; +import org.apache.curator.CuratorZookeeperClient; +import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseTestingUtility; +import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.HRegionLocation; import org.apache.hadoop.hbase.RegionLocations; import org.apache.hadoop.hbase.TableName; @@ -108,4 +113,21 @@ public class TestZKAsyncRegistry { assertEquals(i, loc.getRegionInfo().getReplicaId()); }); } + + @Test + public void testIndependentZKConnections() throws IOException { + final CuratorZookeeperClient zk1 = REGISTRY.getCuratorFramework().getZookeeperClient(); + + final Configuration otherConf = new Configuration(TEST_UTIL.getConfiguration()); + otherConf.set(HConstants.ZOOKEEPER_QUORUM, "127.0.0.1"); + try (final ZKAsyncRegistry otherRegistry = new ZKAsyncRegistry(otherConf)) { + final CuratorZookeeperClient zk2 = otherRegistry.getCuratorFramework().getZookeeperClient(); + + assertNotSame("Using a different configuration / quorum should result in different backing " + + "zk connection.", zk1, zk2); + assertNotEquals("Using a different configrution / quorum should be reflected in the " + + "zk connection.", zk1.getCurrentConnectionString(), zk2.getCurrentConnectionString()); + } + } + }