HBASE-12694 testTableExistsIfTheSpecifiedTableRegionIsSplitParent in TestSplitTransactionOnCluster class leaves regions in transition (Vandana Ayyalasomayajula)

This commit is contained in:
Virag Kothari 2014-12-18 11:29:02 -08:00
parent 5d34d2d02a
commit f0e27b2f78
2 changed files with 38 additions and 6 deletions

View File

@ -94,7 +94,7 @@ public class SplitTransaction {
private HRegionInfo hri_b; private HRegionInfo hri_b;
private long fileSplitTimeout = 30000; private long fileSplitTimeout = 30000;
public SplitTransactionCoordination.SplitTransactionDetails std; public SplitTransactionCoordination.SplitTransactionDetails std;
boolean useZKForAssignment; boolean useZKForAssignment = true;
/* /*
* Row to split around * Row to split around

View File

@ -47,6 +47,7 @@ import org.apache.hadoop.hbase.HConstants;
import org.apache.hadoop.hbase.HRegionInfo; import org.apache.hadoop.hbase.HRegionInfo;
import org.apache.hadoop.hbase.HTableDescriptor; import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.testclassification.LargeTests; import org.apache.hadoop.hbase.testclassification.LargeTests;
import org.apache.hadoop.hbase.CoprocessorEnvironment;
import org.apache.hadoop.hbase.MasterNotRunningException; import org.apache.hadoop.hbase.MasterNotRunningException;
import org.apache.hadoop.hbase.MiniHBaseCluster; import org.apache.hadoop.hbase.MiniHBaseCluster;
import org.apache.hadoop.hbase.RegionTransition; import org.apache.hadoop.hbase.RegionTransition;
@ -306,7 +307,10 @@ public class TestSplitTransactionOnCluster {
this.admin.split(region.getRegionName(), new byte[] {42}); this.admin.split(region.getRegionName(), new byte[] {42});
// we have to wait until the SPLITTING state is seen by the master // we have to wait until the SPLITTING state is seen by the master
FailingSplitRegionObserver.latch.await(); FailingSplitRegionObserver observer = (FailingSplitRegionObserver) region
.getCoprocessorHost().findCoprocessor(FailingSplitRegionObserver.class.getName());
assertNotNull(observer);
observer.latch.await();
LOG.info("Waiting for region to come out of RIT"); LOG.info("Waiting for region to come out of RIT");
TESTING_UTIL.waitFor(60000, 1000, new Waiter.Predicate<Exception>() { TESTING_UTIL.waitFor(60000, 1000, new Waiter.Predicate<Exception>() {
@ -372,13 +376,26 @@ public class TestSplitTransactionOnCluster {
} }
public static class FailingSplitRegionObserver extends BaseRegionObserver { public static class FailingSplitRegionObserver extends BaseRegionObserver {
static volatile CountDownLatch latch = new CountDownLatch(1); volatile CountDownLatch latch;
volatile CountDownLatch postSplit;
@Override
public void start(CoprocessorEnvironment e) throws IOException {
latch = new CountDownLatch(1);
postSplit = new CountDownLatch(1);
}
@Override @Override
public void preSplitBeforePONR(ObserverContext<RegionCoprocessorEnvironment> ctx, public void preSplitBeforePONR(ObserverContext<RegionCoprocessorEnvironment> ctx,
byte[] splitKey, List<Mutation> metaEntries) throws IOException { byte[] splitKey, List<Mutation> metaEntries) throws IOException {
latch.countDown(); latch.countDown();
LOG.info("Causing rollback of region split");
throw new IOException("Causing rollback of region split"); throw new IOException("Causing rollback of region split");
} }
@Override
public void postCompleteSplit(ObserverContext<RegionCoprocessorEnvironment> ctx)
throws IOException {
postSplit.countDown();
LOG.info("postCompleteSplit called");
}
} }
/** /**
@ -917,10 +934,20 @@ public class TestSplitTransactionOnCluster {
tableExists = MetaTableAccessor.tableExists(regionServer.getConnection(), tableExists = MetaTableAccessor.tableExists(regionServer.getConnection(),
tableName); tableName);
assertEquals("The specified table should present.", true, tableExists); assertEquals("The specified table should present.", true, tableExists);
Map<String, RegionState> rit = cluster.getMaster().getAssignmentManager().getRegionStates()
.getRegionsInTransition();
assertTrue(rit.size() == 3);
cluster.getMaster().getAssignmentManager().regionOffline(st.getFirstDaughter());
cluster.getMaster().getAssignmentManager().regionOffline(st.getSecondDaughter());
cluster.getMaster().getAssignmentManager().regionOffline(region.getRegionInfo());
rit = cluster.getMaster().getAssignmentManager().getRegionStates()
.getRegionsInTransition();
assertTrue(rit.size() == 0);
} finally { } finally {
admin.setBalancerRunning(true, false); admin.setBalancerRunning(true, false);
cluster.getMaster().setCatalogJanitorEnabled(true); cluster.getMaster().setCatalogJanitorEnabled(true);
t.close(); t.close();
TESTING_UTIL.deleteTable(tableName);
} }
} }
@ -1164,7 +1191,7 @@ public class TestSplitTransactionOnCluster {
} }
} }
@Test @Test(timeout = 120000)
public void testFailedSplit() throws Exception { public void testFailedSplit() throws Exception {
TableName tableName = TableName.valueOf("testFailedSplit"); TableName tableName = TableName.valueOf("testFailedSplit");
byte[] colFamily = Bytes.toBytes("info"); byte[] colFamily = Bytes.toBytes("info");
@ -1181,18 +1208,23 @@ public class TestSplitTransactionOnCluster {
// The following split would fail. // The following split would fail.
admin.split(tableName); admin.split(tableName);
FailingSplitRegionObserver.latch.await(); FailingSplitRegionObserver observer = (FailingSplitRegionObserver) actualRegion
.getCoprocessorHost().findCoprocessor(FailingSplitRegionObserver.class.getName());
assertNotNull(observer);
observer.latch.await();
observer.postSplit.await();
LOG.info("Waiting for region to come out of RIT"); LOG.info("Waiting for region to come out of RIT");
TESTING_UTIL.waitFor(60000, 1000, new Waiter.Predicate<Exception>() { TESTING_UTIL.waitFor(60000, 1000, new Waiter.Predicate<Exception>() {
@Override @Override
public boolean evaluate() throws Exception { public boolean evaluate() throws Exception {
RegionStates regionStates = cluster.getMaster().getAssignmentManager().getRegionStates(); RegionStates regionStates = cluster.getMaster().getAssignmentManager().getRegionStates();
Map<String, RegionState> rit = regionStates.getRegionsInTransition(); Map<String, RegionState> rit = regionStates.getRegionsInTransition();
return !rit.containsKey(actualRegion.getRegionInfo().getEncodedName()); return (rit.size() == 0);
} }
}); });
regions = TESTING_UTIL.getHBaseAdmin().getTableRegions(tableName); regions = TESTING_UTIL.getHBaseAdmin().getTableRegions(tableName);
assertTrue(regions.size() == 1); assertTrue(regions.size() == 1);
assertTrue(admin.balancer());
} finally { } finally {
table.close(); table.close();
connection.close(); connection.close();