HBASE-7686 TestSplitTransactionOnCluster fails occasionally in trunk builds -- MORE DEBUG
git-svn-id: https://svn.apache.org/repos/asf/hbase/trunk@1452996 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
95969df094
commit
879d5917c9
|
@ -69,6 +69,7 @@ import org.apache.zookeeper.KeeperException;
|
|||
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 TestSplitTransactionOnCluster {
|
|||
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 TestSplitTransactionOnCluster {
|
|||
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 TestSplitTransactionOnCluster {
|
|||
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 TestSplitTransactionOnCluster {
|
|||
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 TestSplitTransactionOnCluster {
|
|||
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 TestSplitTransactionOnCluster {
|
|||
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 TestSplitTransactionOnCluster {
|
|||
} finally {
|
||||
admin.setBalancerRunning(true, false);
|
||||
cluster.getMaster().setCatalogJanitorEnabled(true);
|
||||
admin.close();
|
||||
t.close();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -701,23 +706,28 @@ public class TestSplitTransactionOnCluster {
|
|||
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 TestSplitTransactionOnCluster {
|
|||
|
||||
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 TestSplitTransactionOnCluster {
|
|||
}
|
||||
}
|
||||
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 TestSplitTransactionOnCluster {
|
|||
// 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 TestSplitTransactionOnCluster {
|
|||
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 TestSplitTransactionOnCluster {
|
|||
|
||||
}
|
||||
|
||||
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 TestSplitTransactionOnCluster {
|
|||
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 TestSplitTransactionOnCluster {
|
|||
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 TestSplitTransactionOnCluster {
|
|||
}
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue