diff --git src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionServerCoprocessorExceptionWithAbort.java src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionServerCoprocessorExceptionWithAbort.java index ae5b9fa..6d2fc33 100644 --- src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionServerCoprocessorExceptionWithAbort.java +++ src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionServerCoprocessorExceptionWithAbort.java @@ -1,5 +1,4 @@ /* - * Copyright 2011 The Apache Software Foundation * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file @@ -20,27 +19,28 @@ package org.apache.hadoop.hbase.coprocessor; +import static org.junit.Assert.fail; + import java.io.IOException; +import junit.framework.Assert; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.conf.Configuration; -import org.apache.hadoop.hbase.*; +import org.apache.hadoop.hbase.HBaseTestingUtility; +import org.apache.hadoop.hbase.HConstants; +import org.apache.hadoop.hbase.MediumTests; import org.apache.hadoop.hbase.client.HTable; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.regionserver.HRegionServer; -import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hbase.regionserver.wal.WALEdit; -import org.apache.hadoop.hbase.zookeeper.ZooKeeperListener; -import org.apache.hadoop.hbase.zookeeper.ZooKeeperNodeTracker; -import org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher; +import org.apache.hadoop.hbase.util.Bytes; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import org.junit.experimental.categories.Category; -import static org.junit.Assert.*; - /** * Tests unhandled exceptions thrown by coprocessors running on a regionserver.. * Expected result is that the regionserver will abort with an informative @@ -49,49 +49,18 @@ import static org.junit.Assert.*; */ @Category(MediumTests.class) public class TestRegionServerCoprocessorExceptionWithAbort { - static final Log LOG = LogFactory.getLog(TestRegionObserverInterface.class); - - private class zkwAbortable implements Abortable { - @Override - public void abort(String why, Throwable e) { - throw new RuntimeException("Fatal ZK rs tracker error, why=", e); - } - @Override - public boolean isAborted() { - return false; - } - }; - - private class RSTracker extends ZooKeeperNodeTracker { - public boolean regionZKNodeWasDeleted = false; - public String rsNode; - private Thread mainThread; - - public RSTracker(ZooKeeperWatcher zkw, String rsNode, Thread mainThread) { - super(zkw, rsNode, new zkwAbortable()); - this.rsNode = rsNode; - this.mainThread = mainThread; - } - - @Override - public synchronized void nodeDeleted(String path) { - if (path.equals(rsNode)) { - regionZKNodeWasDeleted = true; - mainThread.interrupt(); - } - } - } - private static HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility(); - static final int timeout = 30000; + static final Log LOG = LogFactory.getLog(TestRegionServerCoprocessorExceptionWithAbort.class); + private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility(); + private static final String TABLE_NAME = "observed_table"; @BeforeClass public static void setupBeforeClass() throws Exception { // set configure to indicate which cp should be loaded Configuration conf = TEST_UTIL.getConfiguration(); - conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY, - BuggyRegionObserver.class.getName()); + conf.setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, 2); // Let's fail fast. + conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY, BuggyRegionObserver.class.getName()); conf.set("hbase.coprocessor.abortonerror", "true"); - TEST_UTIL.startMiniCluster(2); + TEST_UTIL.startMiniCluster(3); } @AfterClass @@ -101,11 +70,11 @@ public class TestRegionServerCoprocessorExceptionWithAbort { @Test public void testExceptionFromCoprocessorDuringPut() - throws IOException { + throws IOException, InterruptedException { // When we try to write to TEST_TABLE, the buggy coprocessor will // cause a NullPointerException, which will cause the regionserver (which // hosts the region we attempted to write to) to abort. - byte[] TEST_TABLE = Bytes.toBytes("observed_table"); + byte[] TEST_TABLE = Bytes.toBytes(TABLE_NAME); byte[] TEST_FAMILY = Bytes.toBytes("aaa"); HTable table = TEST_UTIL.createTable(TEST_TABLE, TEST_FAMILY); @@ -113,47 +82,20 @@ public class TestRegionServerCoprocessorExceptionWithAbort { TEST_UTIL.waitUntilAllRegionsAssigned(TEST_TABLE); // Note which regionServer will abort (after put is attempted). - final HRegionServer regionServer = - TEST_UTIL.getRSForFirstRegionInTable(TEST_TABLE); - - // add watch so we can know when this regionserver aborted. - ZooKeeperWatcher zkw = new ZooKeeperWatcher(TEST_UTIL.getConfiguration(), - "unittest", new zkwAbortable()); + final HRegionServer regionServer = TEST_UTIL.getRSForFirstRegionInTable(TEST_TABLE); - RSTracker rsTracker = new RSTracker(zkw, - "/hbase/rs/"+regionServer.getServerName(), Thread.currentThread()); - rsTracker.start(); - zkw.registerListener(rsTracker); + final byte[] ROW = Bytes.toBytes("aaa"); + Put put = new Put(ROW); + put.add(TEST_FAMILY, ROW, ROW); - boolean caughtInterruption = false; + Assert.assertFalse("The region server should be available", regionServer.isAborted()); try { - final byte[] ROW = Bytes.toBytes("aaa"); - Put put = new Put(ROW); - put.add(TEST_FAMILY, ROW, ROW); table.put(put); - } catch (IOException e) { - // Depending on exact timing of the threads involved, zkw's interruption - // might be caught here ... - if (e.getCause().getClass().equals(InterruptedException.class)) { - LOG.debug("caught interruption here (during put())."); - caughtInterruption = true; - } else { - fail("put() failed: " + e); - } - } - if (caughtInterruption == false) { - try { - Thread.sleep(timeout); - fail("RegionServer did not abort within 30 seconds."); - } catch (InterruptedException e) { - // .. or it might be caught here. - LOG.debug("caught interruption here (during sleep())."); - caughtInterruption = true; - } + fail("The put should have failed, as the coprocessor is buggy"); + } catch (IOException ignored) { + // Expected. } - assertTrue("Main thread caught interruption.",caughtInterruption); - assertTrue("RegionServer aborted on coprocessor exception, as expected.", - rsTracker.regionZKNodeWasDeleted); + Assert.assertTrue("The region server should have aborted", regionServer.isAborted()); table.close(); } @@ -162,11 +104,9 @@ public class TestRegionServerCoprocessorExceptionWithAbort { public void prePut(final ObserverContext c, final Put put, final WALEdit edit, final boolean writeToWAL) { - String tableName = - c.getEnvironment().getRegion().getRegionInfo().getTableNameAsString(); - if (tableName.equals("observed_table")) { - Integer i = null; - i = i + 1; + String tableName = c.getEnvironment().getRegion().getRegionInfo().getTableNameAsString(); + if (TABLE_NAME.equals(tableName)) { + throw new NullPointerException("Buggy coprocessor"); } } }