use of org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher in project hbase by apache.
the class ServerCrashProcedure method isMetaAssignedQuickTest.
/**
* A quick test that hbase:meta is assigned; blocks for short time only.
* @return True if hbase:meta location is available and verified as good.
* @throws InterruptedException
* @throws IOException
*/
private boolean isMetaAssignedQuickTest(final MasterProcedureEnv env) throws InterruptedException, IOException {
ZooKeeperWatcher zkw = env.getMasterServices().getZooKeeper();
MetaTableLocator mtl = env.getMasterServices().getMetaTableLocator();
boolean metaAssigned = false;
// Is hbase:meta location available yet?
if (mtl.isLocationAvailable(zkw)) {
ClusterConnection connection = env.getMasterServices().getClusterConnection();
// Is hbase:meta location good yet?
long timeout = env.getMasterConfiguration().getLong(KEY_SHORT_WAIT_ON_META, DEFAULT_SHORT_WAIT_ON_META);
if (mtl.verifyMetaRegionLocation(connection, zkw, timeout)) {
metaAssigned = true;
}
}
return metaAssigned;
}
use of org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher in project hbase by apache.
the class TestMasterCoprocessorExceptionWithAbort method testExceptionFromCoprocessorWhenCreatingTable.
@Test(timeout = 30000)
public void testExceptionFromCoprocessorWhenCreatingTable() throws IOException {
MiniHBaseCluster cluster = UTIL.getHBaseCluster();
HMaster master = cluster.getMaster();
MasterCoprocessorHost host = master.getMasterCoprocessorHost();
BuggyMasterObserver cp = (BuggyMasterObserver) host.findCoprocessor(BuggyMasterObserver.class.getName());
assertFalse("No table created yet", cp.wasCreateTableCalled());
// set a watch on the zookeeper /hbase/master node. If the master dies,
// the node will be deleted.
ZooKeeperWatcher zkw = new ZooKeeperWatcher(UTIL.getConfiguration(), "unittest", new Abortable() {
@Override
public void abort(String why, Throwable e) {
throw new RuntimeException("Fatal ZK error: " + why, e);
}
@Override
public boolean isAborted() {
return false;
}
});
MasterTracker masterTracker = new MasterTracker(zkw, "/hbase/master", new Abortable() {
@Override
public void abort(String why, Throwable e) {
throw new RuntimeException("Fatal ZK master tracker error, why=", e);
}
@Override
public boolean isAborted() {
return false;
}
});
masterTracker.start();
zkw.registerListener(masterTracker);
// Test (part of the) output that should have be printed by master when it aborts:
// (namely the part that shows the set of loaded coprocessors).
// In this test, there is only a single coprocessor (BuggyMasterObserver).
assertTrue(HMaster.getLoadedCoprocessors().contains(TestMasterCoprocessorExceptionWithAbort.BuggyMasterObserver.class.getName()));
CreateTableThread createTableThread = new CreateTableThread(UTIL);
// Attempting to create a table (using createTableThread above) triggers an NPE in BuggyMasterObserver.
// Master will then abort and the /hbase/master zk node will be deleted.
createTableThread.start();
// Wait up to 30 seconds for master's /hbase/master zk node to go away after master aborts.
for (int i = 0; i < 30; i++) {
if (masterTracker.masterZKNodeWasDeleted == true) {
break;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
fail("InterruptedException while waiting for master zk node to " + "be deleted.");
}
}
assertTrue("Master aborted on coprocessor exception, as expected.", masterTracker.masterZKNodeWasDeleted);
createTableThread.interrupt();
try {
createTableThread.join(1000);
} catch (InterruptedException e) {
assertTrue("Ignoring InterruptedException while waiting for " + " createTableThread.join().", true);
}
}
use of org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher in project hbase by apache.
the class TestZKPermissionsWatcher method beforeClass.
@BeforeClass
public static void beforeClass() throws Exception {
// setup configuration
Configuration conf = UTIL.getConfiguration();
SecureTestUtil.enableSecurity(conf);
// start minicluster
UTIL.startMiniCluster();
AUTH_A = TableAuthManager.getOrCreate(new ZooKeeperWatcher(conf, "TestZKPermissionsWatcher_1", ABORTABLE), conf);
AUTH_B = TableAuthManager.getOrCreate(new ZooKeeperWatcher(conf, "TestZKPermissionsWatcher_2", ABORTABLE), conf);
}
use of org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher in project hbase by apache.
the class TestZKSecretWatcher method newZK.
private static ZooKeeperWatcher newZK(Configuration conf, String name, Abortable abort) throws Exception {
Configuration copy = HBaseConfiguration.create(conf);
ZooKeeperWatcher zk = new ZooKeeperWatcher(copy, name, abort);
return zk;
}
use of org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher in project hbase by apache.
the class TestZKSecretWatcher method testKeyUpdate.
@Test
public void testKeyUpdate() throws Exception {
// sanity check
assertTrue(KEY_MASTER.isMaster());
assertFalse(KEY_SLAVE.isMaster());
int maxKeyId = 0;
KEY_MASTER.rollCurrentKey();
AuthenticationKey key1 = KEY_MASTER.getCurrentKey();
assertNotNull(key1);
LOG.debug("Master current key: " + key1.getKeyId());
// wait for slave to update
Thread.sleep(1000);
AuthenticationKey slaveCurrent = KEY_SLAVE.getCurrentKey();
assertNotNull(slaveCurrent);
assertEquals(key1, slaveCurrent);
LOG.debug("Slave current key: " + slaveCurrent.getKeyId());
// generate two more keys then expire the original
KEY_MASTER.rollCurrentKey();
AuthenticationKey key2 = KEY_MASTER.getCurrentKey();
LOG.debug("Master new current key: " + key2.getKeyId());
KEY_MASTER.rollCurrentKey();
AuthenticationKey key3 = KEY_MASTER.getCurrentKey();
LOG.debug("Master new current key: " + key3.getKeyId());
// force expire the original key
key1.setExpiration(EnvironmentEdgeManager.currentTime() - 1000);
KEY_MASTER.removeExpiredKeys();
// verify removed from master
assertNull(KEY_MASTER.getKey(key1.getKeyId()));
// wait for slave to catch up
KEY_SLAVE.getLatch().await();
// make sure the slave has both new keys
AuthenticationKey slave2 = KEY_SLAVE.getKey(key2.getKeyId());
assertNotNull(slave2);
assertEquals(key2, slave2);
AuthenticationKey slave3 = KEY_SLAVE.getKey(key3.getKeyId());
assertNotNull(slave3);
assertEquals(key3, slave3);
slaveCurrent = KEY_SLAVE.getCurrentKey();
assertEquals(key3, slaveCurrent);
LOG.debug("Slave current key: " + slaveCurrent.getKeyId());
// verify that the expired key has been removed
assertNull(KEY_SLAVE.getKey(key1.getKeyId()));
// bring up a new slave
Configuration conf = TEST_UTIL.getConfiguration();
ZooKeeperWatcher zk = newZK(conf, "server3", new MockAbortable());
KEY_SLAVE2 = new AuthenticationTokenSecretManager(conf, zk, "server3", 60 * 60 * 1000, 60 * 1000);
KEY_SLAVE2.start();
Thread.sleep(1000);
// verify the new slave has current keys (and not expired)
slave2 = KEY_SLAVE2.getKey(key2.getKeyId());
assertNotNull(slave2);
assertEquals(key2, slave2);
slave3 = KEY_SLAVE2.getKey(key3.getKeyId());
assertNotNull(slave3);
assertEquals(key3, slave3);
slaveCurrent = KEY_SLAVE2.getCurrentKey();
assertEquals(key3, slaveCurrent);
assertNull(KEY_SLAVE2.getKey(key1.getKeyId()));
// test leader failover
KEY_MASTER.stop();
// wait for master to stop
Thread.sleep(1000);
assertFalse(KEY_MASTER.isMaster());
// check for a new master
AuthenticationTokenSecretManager[] mgrs = new AuthenticationTokenSecretManager[] { KEY_SLAVE, KEY_SLAVE2 };
AuthenticationTokenSecretManager newMaster = null;
int tries = 0;
while (newMaster == null && tries++ < 5) {
for (AuthenticationTokenSecretManager mgr : mgrs) {
if (mgr.isMaster()) {
newMaster = mgr;
break;
}
}
if (newMaster == null) {
Thread.sleep(500);
}
}
assertNotNull(newMaster);
AuthenticationKey current = newMaster.getCurrentKey();
// new master will immediately roll the current key, so it's current may be greater
assertTrue(current.getKeyId() >= slaveCurrent.getKeyId());
LOG.debug("New master, current key: " + current.getKeyId());
// roll the current key again on new master and verify the key ID increments
newMaster.rollCurrentKey();
AuthenticationKey newCurrent = newMaster.getCurrentKey();
LOG.debug("New master, rolled new current key: " + newCurrent.getKeyId());
assertTrue(newCurrent.getKeyId() > current.getKeyId());
// add another slave
ZooKeeperWatcher zk3 = newZK(conf, "server4", new MockAbortable());
KEY_SLAVE3 = new AuthenticationTokenSecretManager(conf, zk3, "server4", 60 * 60 * 1000, 60 * 1000);
KEY_SLAVE3.start();
Thread.sleep(5000);
// check master failover again
newMaster.stop();
// wait for master to stop
Thread.sleep(5000);
assertFalse(newMaster.isMaster());
// check for a new master
mgrs = new AuthenticationTokenSecretManager[] { KEY_SLAVE, KEY_SLAVE2, KEY_SLAVE3 };
newMaster = null;
tries = 0;
while (newMaster == null && tries++ < 5) {
for (AuthenticationTokenSecretManager mgr : mgrs) {
if (mgr.isMaster()) {
newMaster = mgr;
break;
}
}
if (newMaster == null) {
Thread.sleep(500);
}
}
assertNotNull(newMaster);
AuthenticationKey current2 = newMaster.getCurrentKey();
// new master will immediately roll the current key, so it's current may be greater
assertTrue(current2.getKeyId() >= newCurrent.getKeyId());
LOG.debug("New master 2, current key: " + current2.getKeyId());
// roll the current key again on new master and verify the key ID increments
newMaster.rollCurrentKey();
AuthenticationKey newCurrent2 = newMaster.getCurrentKey();
LOG.debug("New master 2, rolled new current key: " + newCurrent2.getKeyId());
assertTrue(newCurrent2.getKeyId() > current2.getKeyId());
}
Aggregations