You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by mb...@apache.org on 2013/03/05 22:03:56 UTC
svn commit: r1452996 -
/hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.java
Author: mbertozzi
Date: Tue Mar 5 21:03:56 2013
New Revision: 1452996
URL: http://svn.apache.org/r1452996
Log:
HBASE-7686 TestSplitTransactionOnCluster fails occasionally in trunk builds -- MORE DEBUG
Modified:
hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.java
Modified: hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.java?rev=1452996&r1=1452995&r2=1452996&view=diff
==============================================================================
--- hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.java (original)
+++ hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.java Tue Mar 5 21:03:56 2013
@@ -69,6 +69,7 @@ import org.apache.zookeeper.KeeperExcept
import org.apache.zookeeper.KeeperException.NodeExistsException;
import org.apache.zookeeper.data.Stat;
import org.junit.AfterClass;
+import org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
@@ -115,6 +116,11 @@ public class TestSplitTransactionOnClust
this.cluster = TESTING_UTIL.getMiniHBaseCluster();
}
+ @After
+ public void tearDown() throws Exception {
+ this.admin.close();
+ }
+
private HRegionInfo getAndCheckSingleTableRegion(final List<HRegion> regions) {
assertEquals(1, regions.size());
return regions.get(0).getRegionInfo();
@@ -124,7 +130,6 @@ public class TestSplitTransactionOnClust
public void testShouldFailSplitIfZNodeDoesNotExistDueToPrevRollBack() throws Exception {
final byte[] tableName = Bytes
.toBytes("testShouldFailSplitIfZNodeDoesNotExistDueToPrevRollBack");
- HBaseAdmin admin = new HBaseAdmin(TESTING_UTIL.getConfiguration());
try {
// Create table then get the single region for our new table.
HTable t = createTableAndWait(tableName, Bytes.toBytes("cf"));
@@ -133,15 +138,21 @@ public class TestSplitTransactionOnClust
int regionServerIndex = cluster.getServerWith(regions.get(0).getRegionName());
final HRegionServer regionServer = cluster.getRegionServer(regionServerIndex);
insertData(tableName, admin, t);
+ t.close();
+
// Turn off balancer so it doesn't cut in and mess up our placements.
- this.admin.setBalancerRunning(false, false);
+ this.admin.setBalancerRunning(false, true);
// Turn off the meta scanner so it don't remove parent on us.
cluster.getMaster().setCatalogJanitorEnabled(false);
+ // find a splittable region
+ final HRegion region = findSplittableRegion(regions);
+ assertTrue("not able to find a splittable region", region != null);
+
new Thread() {
public void run() {
SplitTransaction st = null;
- st = new MockedSplitTransaction(regions.get(0), Bytes.toBytes("row2"));
+ st = new MockedSplitTransaction(region, Bytes.toBytes("row2"));
try {
st.prepare();
st.execute(regionServer, regionServer);
@@ -154,8 +165,7 @@ public class TestSplitTransactionOnClust
Thread.sleep(100);
}
assertTrue("Waited too long for rollback", callRollBack);
- SplitTransaction st = null;
- st = new MockedSplitTransaction(regions.get(0), Bytes.toBytes("row2"));
+ SplitTransaction st = new MockedSplitTransaction(region, Bytes.toBytes("row3"));
try {
secondSplit = true;
st.prepare();
@@ -191,11 +201,7 @@ public class TestSplitTransactionOnClust
firstSplitCompleted = false;
callRollBack = false;
cluster.getMaster().setCatalogJanitorEnabled(true);
- if (admin.isTableAvailable(tableName) && admin.isTableEnabled(tableName)) {
- admin.disableTable(tableName);
- admin.deleteTable(tableName);
- admin.close();
- }
+ TESTING_UTIL.deleteTable(tableName);
}
}
@@ -638,24 +644,23 @@ public class TestSplitTransactionOnClust
public void testTableExistsIfTheSpecifiedTableRegionIsSplitParent() throws Exception {
final byte[] tableName =
Bytes.toBytes("testTableExistsIfTheSpecifiedTableRegionIsSplitParent");
- HRegionServer regionServer = null;
- List<HRegion> regions = null;
- HBaseAdmin admin = new HBaseAdmin(TESTING_UTIL.getConfiguration());
+ // Create table then get the single region for our new table.
+ HTable t = createTableAndWait(tableName, Bytes.toBytes("cf"));
try {
- // Create table then get the single region for our new table.
- HTable t = createTableAndWait(tableName, Bytes.toBytes("cf"));
- regions = cluster.getRegions(tableName);
+ List<HRegion> regions = cluster.getRegions(tableName);
int regionServerIndex = cluster.getServerWith(regions.get(0).getRegionName());
- regionServer = cluster.getRegionServer(regionServerIndex);
+ HRegionServer regionServer = cluster.getRegionServer(regionServerIndex);
insertData(tableName, admin, t);
// Turn off balancer so it doesn't cut in and mess up our placements.
- admin.setBalancerRunning(false, false);
+ admin.setBalancerRunning(false, true);
// Turn off the meta scanner so it don't remove parent on us.
cluster.getMaster().setCatalogJanitorEnabled(false);
boolean tableExists = MetaReader.tableExists(regionServer.getCatalogTracker(),
Bytes.toString(tableName));
assertEquals("The specified table should present.", true, tableExists);
- SplitTransaction st = new SplitTransaction(regions.get(0), Bytes.toBytes("row2"));
+ final HRegion region = findSplittableRegion(regions);
+ assertTrue("not able to find a splittable region", region != null);
+ SplitTransaction st = new SplitTransaction(region, Bytes.toBytes("row2"));
try {
st.prepare();
st.createDaughters(regionServer, regionServer);
@@ -668,7 +673,7 @@ public class TestSplitTransactionOnClust
} finally {
admin.setBalancerRunning(true, false);
cluster.getMaster().setCatalogJanitorEnabled(true);
- admin.close();
+ t.close();
}
}
@@ -701,23 +706,28 @@ public class TestSplitTransactionOnClust
int regionServerIndex = cluster.getServerWith(regions.get(0).getRegionName());
HRegionServer regionServer = cluster.getRegionServer(regionServerIndex);
// Turn off balancer so it doesn't cut in and mess up our placements.
- this.admin.setBalancerRunning(false, false);
+ this.admin.setBalancerRunning(false, true);
// Turn off the meta scanner so it don't remove parent on us.
cluster.getMaster().setCatalogJanitorEnabled(false);
try {
HRegionServer server = cluster.getRegionServer(tableRegionIndex);
printOutRegions(server, "Initial regions: ");
+
+ // find a splittable region
+ final HRegion region = findSplittableRegion(regions);
+ assertTrue("not able to find a splittable region", region != null);
+
// Now split.
- SplitTransaction st = null;
- st = new MockedSplitTransaction(regions.get(0), null);
+ SplitTransaction st = new MockedSplitTransaction(region, Bytes.toBytes("row2"));
try {
+ st.prepare();
st.execute(regionServer, regionServer);
} catch (IOException e) {
List<HRegion> daughters = cluster.getRegions(tableName);
assertTrue(daughters.size() == 1);
- String node = ZKAssign.getNodeName(regionServer.getZooKeeper(), regions.get(0)
- .getRegionInfo().getEncodedName());
+ String node = ZKAssign.getNodeName(regionServer.getZooKeeper(),
+ region.getRegionInfo().getEncodedName());
assertFalse(ZKUtil.checkExists(regionServer.getZooKeeper(), node) == -1);
assertTrue(st.rollback(regionServer, regionServer));
assertTrue(ZKUtil.checkExists(regionServer.getZooKeeper(), node) == -1);
@@ -731,37 +741,26 @@ public class TestSplitTransactionOnClust
private void testSplitBeforeSettingSplittingInZKInternals() throws Exception {
final byte[] tableName = Bytes.toBytes("testSplitBeforeSettingSplittingInZK");
- HBaseAdmin admin = TESTING_UTIL.getHBaseAdmin();
try {
// Create table then get the single region for our new table.
- HTableDescriptor htd = new HTableDescriptor(tableName);
- htd.addFamily(new HColumnDescriptor("cf"));
- admin.createTable(htd);
- for (int i = 0; cluster.getRegions(tableName).size() == 0 && i < 100; i++) {
- Thread.sleep(100);
- }
+ HTable t = createTableAndWait(tableName, Bytes.toBytes("cf"));
+
+ List<HRegion> regions = awaitTableRegions(tableName);
assertTrue("Table not online", cluster.getRegions(tableName).size() != 0);
- List<HRegion> regions = null;
- for (int i=0; i<100; i++) {
- regions = cluster.getRegions(tableName);
- if (regions.size() > 0) break;
- Thread.sleep(100);
- }
int regionServerIndex = cluster.getServerWith(regions.get(0).getRegionName());
HRegionServer regionServer = cluster.getRegionServer(regionServerIndex);
- SplitTransaction st = null;
- {
- st = new MockedSplitTransaction(regions.get(0), null) {
- @Override
- int createNodeSplitting(ZooKeeperWatcher zkw, HRegionInfo region, ServerName serverName)
- throws KeeperException, IOException {
- throw new SplittingNodeCreationFailedException ();
- }
- };
- }
- String node = ZKAssign.getNodeName(regionServer.getZooKeeper(), regions.get(0)
- .getRegionInfo().getEncodedName());
+ final HRegion region = findSplittableRegion(regions);
+ assertTrue("not able to find a splittable region", region != null);
+ SplitTransaction st = new MockedSplitTransaction(region, Bytes.toBytes("row2")) {
+ @Override
+ int createNodeSplitting(ZooKeeperWatcher zkw, HRegionInfo region, ServerName serverName)
+ throws KeeperException, IOException {
+ throw new SplittingNodeCreationFailedException ();
+ }
+ };
+ String node = ZKAssign.getNodeName(regionServer.getZooKeeper(),
+ region.getRegionInfo().getEncodedName());
regionServer.getZooKeeper().sync(node);
for (int i = 0; i < 100; i++) {
// We expect the znode to be deleted by this time. Here the
@@ -772,6 +771,7 @@ public class TestSplitTransactionOnClust
}
}
try {
+ st.prepare();
st.execute(regionServer, regionServer);
} catch (IOException e) {
// check for the specific instance in case the Split failed due to the
@@ -779,8 +779,8 @@ public class TestSplitTransactionOnClust
// This will at least make the test to fail;
assertTrue("Should be instance of CreateSplittingNodeFailedException",
e instanceof SplittingNodeCreationFailedException );
- node = ZKAssign.getNodeName(regionServer.getZooKeeper(), regions.get(0).getRegionInfo()
- .getEncodedName());
+ node = ZKAssign.getNodeName(regionServer.getZooKeeper(),
+ region.getRegionInfo().getEncodedName());
{
assertTrue(ZKUtil.checkExists(regionServer.getZooKeeper(), node) == -1);
}
@@ -788,10 +788,7 @@ public class TestSplitTransactionOnClust
assertTrue(ZKUtil.checkExists(regionServer.getZooKeeper(), node) == -1);
}
} finally {
- if (admin.isTableAvailable(tableName) && admin.isTableEnabled(tableName)) {
- admin.disableTable(tableName);
- admin.deleteTable(tableName);
- }
+ TESTING_UTIL.deleteTable(tableName);
}
}
@@ -838,6 +835,19 @@ public class TestSplitTransactionOnClust
}
+ private HRegion findSplittableRegion(final List<HRegion> regions) throws InterruptedException {
+ HRegion region = null;
+ for (int i = 0; i < 5; ++i) {
+ for (HRegion r: regions) {
+ if (r.isSplittable()) {
+ return(r);
+ }
+ }
+ Thread.sleep(100);
+ }
+ return(null);
+ }
+
private List<HRegion> checkAndGetDaughters(byte[] tableName)
throws InterruptedException {
List<HRegion> daughters = null;
@@ -863,14 +873,14 @@ public class TestSplitTransactionOnClust
return master;
}
- private void split(final HRegionInfo hri, final HRegionServer server,
- final int regionCount)
- throws IOException, InterruptedException {
+ private void split(final HRegionInfo hri, final HRegionServer server, final int regionCount)
+ throws IOException, InterruptedException {
this.admin.split(hri.getRegionNameAsString());
for (int i = 0; ProtobufUtil.getOnlineRegions(server).size() <= regionCount && i < 100; i++) {
LOG.debug("Waiting on region to split");
Thread.sleep(100);
}
+
assertFalse("Waited too long for split",
ProtobufUtil.getOnlineRegions(server).size() <= regionCount);
}
@@ -901,7 +911,6 @@ public class TestSplitTransactionOnClust
final HRegionInfo hri)
throws UnknownRegionException, MasterNotRunningException,
ZooKeeperConnectionException, InterruptedException {
- MiniHBaseCluster cluster = TESTING_UTIL.getMiniHBaseCluster();
// Now make sure that the table region is not on same server as that hosting
// .META. We don't want .META. replay polluting our test when we later crash
// the table region serving server.
@@ -987,14 +996,22 @@ public class TestSplitTransactionOnClust
}
}
+ private List<HRegion> awaitTableRegions(final byte[] tableName) throws InterruptedException {
+ List<HRegion> regions = null;
+ for (int i = 0; i < 100; i++) {
+ regions = cluster.getRegions(tableName);
+ if (regions.size() > 0) break;
+ Thread.sleep(100);
+ }
+ return regions;
+ }
+
private HTable createTableAndWait(byte[] tableName, byte[] cf) throws IOException,
InterruptedException {
HTable t = TESTING_UTIL.createTable(tableName, cf);
- for (int i = 0; cluster.getRegions(tableName).size() == 0 && i < 100; i++) {
- Thread.sleep(100);
- }
- assertTrue("Table not online: " + Bytes.toString(tableName), cluster.getRegions(tableName)
- .size() != 0);
+ awaitTableRegions(tableName);
+ assertTrue("Table not online: " + Bytes.toString(tableName),
+ cluster.getRegions(tableName).size() != 0);
return t;
}