HBASE-19248 Move tests that need to look at Connection internals to test of said internals.
Signed-off-by: zhangduo <zhangduo@apache.org> Signed-off-by: Chia-Ping Tsai <chia7712@gmail.com>
This commit is contained in:
parent
7d70487442
commit
df98d6848f
|
@ -44,6 +44,9 @@ import org.apache.hadoop.hbase.RegionLocations;
|
||||||
import org.apache.hadoop.hbase.ServerName;
|
import org.apache.hadoop.hbase.ServerName;
|
||||||
import org.apache.hadoop.hbase.exceptions.DeserializationException;
|
import org.apache.hadoop.hbase.exceptions.DeserializationException;
|
||||||
import org.apache.hadoop.hbase.master.RegionState;
|
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.Pair;
|
||||||
import org.apache.hadoop.hbase.util.Threads;
|
import org.apache.hadoop.hbase.util.Threads;
|
||||||
import org.apache.hadoop.hbase.zookeeper.ZKConfig;
|
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.yetus.audience.InterfaceAudience;
|
||||||
import org.apache.zookeeper.data.Stat;
|
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.
|
* Fetch the registry data from zookeeper.
|
||||||
|
@ -115,6 +116,11 @@ class ZKAsyncRegistry implements AsyncRegistry {
|
||||||
return exec(zk.getData(), znodePaths.clusterIdZNode, ZKAsyncRegistry::getClusterId);
|
return exec(zk.getData(), znodePaths.clusterIdZNode, ZKAsyncRegistry::getClusterId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
CuratorFramework getCuratorFramework() {
|
||||||
|
return zk;
|
||||||
|
}
|
||||||
|
|
||||||
private static ZooKeeperProtos.MetaRegionServer getMetaProto(CuratorEvent event)
|
private static ZooKeeperProtos.MetaRegionServer getMetaProto(CuratorEvent event)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
byte[] data = event.getData();
|
byte[] data = event.getData();
|
||||||
|
|
|
@ -26,8 +26,6 @@ import static org.junit.Assert.assertTrue;
|
||||||
import static org.junit.Assert.fail;
|
import static org.junit.Assert.fail;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.lang.reflect.InvocationTargetException;
|
|
||||||
import java.lang.reflect.Method;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
@ -35,9 +33,6 @@ import org.apache.commons.logging.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
import org.apache.hadoop.conf.Configuration;
|
import org.apache.hadoop.conf.Configuration;
|
||||||
import org.apache.hadoop.hbase.client.Admin;
|
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.Put;
|
||||||
import org.apache.hadoop.hbase.client.RegionInfo;
|
import org.apache.hadoop.hbase.client.RegionInfo;
|
||||||
import org.apache.hadoop.hbase.client.Result;
|
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.KeeperException;
|
||||||
import org.apache.zookeeper.ZooDefs;
|
import org.apache.zookeeper.ZooDefs;
|
||||||
import org.apache.zookeeper.ZooKeeper;
|
import org.apache.zookeeper.ZooKeeper;
|
||||||
import org.apache.zookeeper.ZooKeeper.States;
|
|
||||||
import org.apache.zookeeper.data.ACL;
|
import org.apache.zookeeper.data.ACL;
|
||||||
import org.apache.zookeeper.data.Stat;
|
import org.apache.zookeeper.data.Stat;
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.AfterClass;
|
import org.junit.AfterClass;
|
||||||
import org.junit.Assert;
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.BeforeClass;
|
import org.junit.BeforeClass;
|
||||||
import org.junit.Ignore;
|
|
||||||
import org.junit.Rule;
|
import org.junit.Rule;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.experimental.categories.Category;
|
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)
|
@Test (timeout = 120000)
|
||||||
public void testRegionServerSessionExpired() throws Exception {
|
public void testRegionServerSessionExpired() throws Exception {
|
||||||
LOG.info("Starting " + name.getMethodName());
|
LOG.info("Starting " + name.getMethodName());
|
||||||
|
@ -272,33 +178,6 @@ public class TestZooKeeper {
|
||||||
table.close();
|
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
|
* Create a znode with data
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
|
|
|
@ -19,7 +19,9 @@ package org.apache.hadoop.hbase.client;
|
||||||
|
|
||||||
import static org.apache.hadoop.hbase.HConstants.META_REPLICAS_NUM;
|
import static org.apache.hadoop.hbase.HConstants.META_REPLICAS_NUM;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertNotEquals;
|
||||||
import static org.junit.Assert.assertNotNull;
|
import static org.junit.Assert.assertNotNull;
|
||||||
|
import static org.junit.Assert.assertNotSame;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@ -28,7 +30,10 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
import java.util.stream.IntStream;
|
import java.util.stream.IntStream;
|
||||||
|
|
||||||
import org.apache.commons.io.IOUtils;
|
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.HBaseTestingUtility;
|
||||||
|
import org.apache.hadoop.hbase.HConstants;
|
||||||
import org.apache.hadoop.hbase.HRegionLocation;
|
import org.apache.hadoop.hbase.HRegionLocation;
|
||||||
import org.apache.hadoop.hbase.RegionLocations;
|
import org.apache.hadoop.hbase.RegionLocations;
|
||||||
import org.apache.hadoop.hbase.TableName;
|
import org.apache.hadoop.hbase.TableName;
|
||||||
|
@ -108,4 +113,21 @@ public class TestZKAsyncRegistry {
|
||||||
assertEquals(i, loc.getRegionInfo().getReplicaId());
|
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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue