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 2015/03/23 23:23:27 UTC
[42/44] hbase git commit: HBASE-13308 Fix flaky
TestEndToEndSplitTransaction
HBASE-13308 Fix flaky TestEndToEndSplitTransaction
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/a9b73b60
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/a9b73b60
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/a9b73b60
Branch: refs/heads/hbase-12439
Commit: a9b73b600e551749358a61bab27588e9074132d9
Parents: 8dfed5d
Author: zhangduo <zh...@wandoujia.com>
Authored: Sat Mar 21 18:15:23 2015 +0800
Committer: zhangduo <zh...@wandoujia.com>
Committed: Sat Mar 21 20:43:53 2015 +0800
----------------------------------------------------------------------
.../TestEndToEndSplitTransaction.java | 206 +++++++++----------
1 file changed, 95 insertions(+), 111 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hbase/blob/a9b73b60/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.java
index 30a0e88..523aadc 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.java
@@ -25,10 +25,9 @@ import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
-import java.util.Map;
-import java.util.NavigableMap;
import java.util.Random;
import java.util.Set;
+import java.util.TreeSet;
import org.apache.commons.io.IOUtils;
import org.apache.commons.logging.Log;
@@ -38,17 +37,16 @@ import org.apache.hadoop.hbase.ChoreService;
import org.apache.hadoop.hbase.HBaseTestingUtility;
import org.apache.hadoop.hbase.HConstants;
import org.apache.hadoop.hbase.HRegionInfo;
+import org.apache.hadoop.hbase.HRegionLocation;
import org.apache.hadoop.hbase.MetaTableAccessor;
import org.apache.hadoop.hbase.NotServingRegionException;
import org.apache.hadoop.hbase.ScheduledChore;
-import org.apache.hadoop.hbase.ServerName;
import org.apache.hadoop.hbase.Stoppable;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.Get;
-import org.apache.hadoop.hbase.client.HConnection;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
@@ -60,7 +58,6 @@ import org.apache.hadoop.hbase.protobuf.RequestConverter;
import org.apache.hadoop.hbase.protobuf.generated.ClientProtos;
import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.ScanRequest;
import org.apache.hadoop.hbase.protobuf.generated.RegionServerStatusProtos;
-import org.apache.hadoop.hbase.testclassification.FlakeyTests;
import org.apache.hadoop.hbase.testclassification.LargeTests;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.hbase.util.Pair;
@@ -76,12 +73,11 @@ import com.google.common.collect.Iterators;
import com.google.common.collect.Sets;
import com.google.protobuf.ServiceException;
-@Category({FlakeyTests.class, LargeTests.class})
-@SuppressWarnings("deprecation")
+@Category(LargeTests.class)
public class TestEndToEndSplitTransaction {
private static final Log LOG = LogFactory.getLog(TestEndToEndSplitTransaction.class);
private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();
- private static final Configuration conf = TEST_UTIL.getConfiguration();
+ private static final Configuration CONF = TEST_UTIL.getConfiguration();
@BeforeClass
public static void beforeAllTests() throws Exception {
@@ -96,70 +92,70 @@ public class TestEndToEndSplitTransaction {
@Test
public void testMasterOpsWhileSplitting() throws Exception {
- TableName tableName =
- TableName.valueOf("TestSplit");
+ TableName tableName = TableName.valueOf("TestSplit");
byte[] familyName = Bytes.toBytes("fam");
try (HTable ht = TEST_UTIL.createTable(tableName, familyName)) {
TEST_UTIL.loadTable(ht, familyName, false);
}
HRegionServer server = TEST_UTIL.getHBaseCluster().getRegionServer(0);
- byte []firstRow = Bytes.toBytes("aaa");
- byte []splitRow = Bytes.toBytes("lll");
- byte []lastRow = Bytes.toBytes("zzz");
- HConnection con = (HConnection) ConnectionFactory.createConnection(TEST_UTIL.getConfiguration());
- // this will also cache the region
- byte[] regionName = con.locateRegion(tableName, splitRow).getRegionInfo()
- .getRegionName();
- HRegion region = server.getRegion(regionName);
- SplitTransaction split = new SplitTransaction(region, splitRow);
- split.prepare();
-
- // 1. phase I
- PairOfSameType<HRegion> regions = split.createDaughters(server, server);
- assertFalse(test(con, tableName, firstRow, server));
- assertFalse(test(con, tableName, lastRow, server));
-
- // passing null as services prevents final step
- // 2, most of phase II
- split.openDaughters(server, null, regions.getFirst(), regions.getSecond());
- assertFalse(test(con, tableName, firstRow, server));
- assertFalse(test(con, tableName, lastRow, server));
-
- // 3. finish phase II
- // note that this replicates some code from SplitTransaction
- // 2nd daughter first
- server.reportRegionStateTransition(
- RegionServerStatusProtos.RegionStateTransition.TransitionCode.SPLIT,
- region.getRegionInfo(), regions.getFirst().getRegionInfo(),
- regions.getSecond().getRegionInfo());
-
- // Add to online regions
- server.addToOnlineRegions(regions.getSecond());
- // THIS is the crucial point:
- // the 2nd daughter was added, so querying before the split key should fail.
- assertFalse(test(con, tableName, firstRow, server));
- // past splitkey is ok.
- assertTrue(test(con, tableName, lastRow, server));
-
- // Add to online regions
- server.addToOnlineRegions(regions.getFirst());
- assertTrue(test(con, tableName, firstRow, server));
- assertTrue(test(con, tableName, lastRow, server));
-
- assertTrue(test(con, tableName, firstRow, server));
- assertTrue(test(con, tableName, lastRow, server));
+ byte[] firstRow = Bytes.toBytes("aaa");
+ byte[] splitRow = Bytes.toBytes("lll");
+ byte[] lastRow = Bytes.toBytes("zzz");
+ try (Connection conn = ConnectionFactory.createConnection(TEST_UTIL.getConfiguration())) {
+ // this will also cache the region
+ byte[] regionName = conn.getRegionLocator(tableName).getRegionLocation(splitRow)
+ .getRegionInfo().getRegionName();
+ HRegion region = server.getRegion(regionName);
+ SplitTransaction split = new SplitTransaction(region, splitRow);
+ split.prepare();
+
+ // 1. phase I
+ PairOfSameType<HRegion> regions = split.createDaughters(server, server);
+ assertFalse(test(conn, tableName, firstRow, server));
+ assertFalse(test(conn, tableName, lastRow, server));
+
+ // passing null as services prevents final step
+ // 2, most of phase II
+ split.openDaughters(server, null, regions.getFirst(), regions.getSecond());
+ assertFalse(test(conn, tableName, firstRow, server));
+ assertFalse(test(conn, tableName, lastRow, server));
+
+ // 3. finish phase II
+ // note that this replicates some code from SplitTransaction
+ // 2nd daughter first
+ server.reportRegionStateTransition(
+ RegionServerStatusProtos.RegionStateTransition.TransitionCode.SPLIT,
+ region.getRegionInfo(), regions.getFirst().getRegionInfo(), regions.getSecond()
+ .getRegionInfo());
+
+ // Add to online regions
+ server.addToOnlineRegions(regions.getSecond());
+ // THIS is the crucial point:
+ // the 2nd daughter was added, so querying before the split key should fail.
+ assertFalse(test(conn, tableName, firstRow, server));
+ // past splitkey is ok.
+ assertTrue(test(conn, tableName, lastRow, server));
+
+ // Add to online regions
+ server.addToOnlineRegions(regions.getFirst());
+ assertTrue(test(conn, tableName, firstRow, server));
+ assertTrue(test(conn, tableName, lastRow, server));
+
+ assertTrue(test(conn, tableName, firstRow, server));
+ assertTrue(test(conn, tableName, lastRow, server));
+ }
}
/**
* attempt to locate the region and perform a get and scan
* @return True if successful, False otherwise.
*/
- private boolean test(HConnection con, TableName tableName, byte[] row,
+ private boolean test(Connection conn, TableName tableName, byte[] row,
HRegionServer server) {
// not using HTable to avoid timeouts and retries
try {
- byte[] regionName = con.relocateRegion(tableName, row).getRegionInfo()
- .getRegionName();
+ byte[] regionName = conn.getRegionLocator(tableName).getRegionLocation(row, true)
+ .getRegionInfo().getRegionName();
// get and scan should now succeed without exception
ClientProtos.GetRequest request =
RequestConverter.buildGetRequest(regionName, new Get(row));
@@ -172,7 +168,7 @@ public class TestEndToEndSplitTransaction {
} catch (ServiceException se) {
throw ProtobufUtil.getRemoteException(se);
}
- } catch (IOException x) {
+ } catch (IOException e) {
return false;
} catch (ServiceException e) {
return false;
@@ -196,7 +192,7 @@ public class TestEndToEndSplitTransaction {
Stoppable stopper = new StoppableImplementation();
RegionSplitter regionSplitter = new RegionSplitter(table);
- RegionChecker regionChecker = new RegionChecker(conf, stopper, TABLENAME);
+ RegionChecker regionChecker = new RegionChecker(CONF, stopper, TABLENAME);
final ChoreService choreService = new ChoreService("TEST_SERVER");
choreService.scheduleChore(regionChecker);
@@ -273,7 +269,7 @@ public class TestEndToEndSplitTransaction {
try {
admin.splitRegion(region.getRegionName(), splitPoint);
//wait until the split is complete
- blockUntilRegionSplit(conf, 50000, region.getRegionName(), true);
+ blockUntilRegionSplit(CONF, 50000, region.getRegionName(), true);
} catch (NotServingRegionException ex) {
//ignore
@@ -288,7 +284,7 @@ public class TestEndToEndSplitTransaction {
List<Put> puts = new ArrayList<>();
for (int i=start; i< start + 100; i++) {
Put put = new Put(Bytes.toBytes(i));
- put.add(family, family, Bytes.toBytes(i));
+ put.addColumn(family, family, Bytes.toBytes(i));
puts.add(put);
}
table.put(puts);
@@ -314,12 +310,9 @@ public class TestEndToEndSplitTransaction {
/** verify region boundaries obtained from MetaScanner */
void verifyRegionsUsingMetaTableAccessor() throws Exception {
-
- NavigableMap<HRegionInfo, ServerName> regions = MetaTableAccessor.allTableRegions(connection,
- tableName);
- verifyTableRegions(regions.keySet());
-
- List<HRegionInfo> regionList = MetaTableAccessor.getAllRegions(connection, true);
+ List<HRegionInfo> regionList = MetaTableAccessor.getTableRegions(connection, tableName, true);
+ verifyTableRegions(Sets.newTreeSet(regionList));
+ regionList = MetaTableAccessor.getAllRegions(connection, true);
verifyTableRegions(Sets.newTreeSet(regionList));
}
@@ -329,12 +322,15 @@ public class TestEndToEndSplitTransaction {
try {
//HTable.getStartEndKeys()
table = (HTable) connection.getTable(tableName);
- Pair<byte[][], byte[][]> keys = table.getStartEndKeys();
+ Pair<byte[][], byte[][]> keys = table.getRegionLocator().getStartEndKeys();
verifyStartEndKeys(keys);
//HTable.getRegionsInfo()
- Map<HRegionInfo, ServerName> regions = table.getRegionLocations();
- verifyTableRegions(regions.keySet());
+ Set<HRegionInfo> regions = new TreeSet<HRegionInfo>();
+ for (HRegionLocation loc : table.getRegionLocator().getAllRegionLocations()) {
+ regions.add(loc.getRegionInfo());
+ }
+ verifyTableRegions(regions);
} finally {
IOUtils.closeQuietly(table);
}
@@ -407,7 +403,7 @@ public class TestEndToEndSplitTransaction {
admin.flushRegion(regionName);
log("blocking until flush is complete: " + Bytes.toStringBinary(regionName));
Threads.sleepWithoutInterrupt(500);
- while (rs.cacheFlusher.getFlushQueueSize() > 0) {
+ while (rs.getOnlineRegion(regionName).getMemstoreSize().get() > 0) {
Threads.sleep(50);
}
}
@@ -418,8 +414,14 @@ public class TestEndToEndSplitTransaction {
admin.majorCompactRegion(regionName);
log("blocking until compaction is complete: " + Bytes.toStringBinary(regionName));
Threads.sleepWithoutInterrupt(500);
- while (rs.compactSplitThread.getCompactionQueueSize() > 0) {
- Threads.sleep(50);
+ outer: for (;;) {
+ for (Store store : rs.getOnlineRegion(regionName).getStores().values()) {
+ if (store.getStorefilesCount() > 1) {
+ Threads.sleep(50);
+ continue outer;
+ }
+ }
+ break;
}
}
@@ -430,22 +432,20 @@ public class TestEndToEndSplitTransaction {
long start = System.currentTimeMillis();
log("blocking until region is split:" + Bytes.toStringBinary(regionName));
HRegionInfo daughterA = null, daughterB = null;
- Connection connection = ConnectionFactory.createConnection(conf);
- Table metaTable = connection.getTable(TableName.META_TABLE_NAME);
-
- try {
+ try (Connection conn = ConnectionFactory.createConnection(conf);
+ Table metaTable = conn.getTable(TableName.META_TABLE_NAME)) {
Result result = null;
HRegionInfo region = null;
while ((System.currentTimeMillis() - start) < timeout) {
- result = getRegionRow(metaTable, regionName);
+ result = metaTable.get(new Get(regionName));
if (result == null) {
break;
}
- region = HRegionInfo.getHRegionInfo(result);
+ region = MetaTableAccessor.getHRegionInfo(result);
if (region.isSplitParent()) {
log("found parent region: " + region.toString());
- PairOfSameType<HRegionInfo> pair = HRegionInfo.getDaughterRegions(result);
+ PairOfSameType<HRegionInfo> pair = MetaTableAccessor.getDaughterRegions(result);
daughterA = pair.getFirst();
daughterB = pair.getSecond();
break;
@@ -461,10 +461,10 @@ public class TestEndToEndSplitTransaction {
//if we are here, this means the region split is complete or timed out
if (waitForDaughters) {
long rem = timeout - (System.currentTimeMillis() - start);
- blockUntilRegionIsInMeta(metaTable, rem, daughterA);
+ blockUntilRegionIsInMeta(conn, rem, daughterA);
rem = timeout - (System.currentTimeMillis() - start);
- blockUntilRegionIsInMeta(metaTable, rem, daughterB);
+ blockUntilRegionIsInMeta(conn, rem, daughterB);
rem = timeout - (System.currentTimeMillis() - start);
blockUntilRegionIsOpened(conf, rem, daughterA);
@@ -472,29 +472,18 @@ public class TestEndToEndSplitTransaction {
rem = timeout - (System.currentTimeMillis() - start);
blockUntilRegionIsOpened(conf, rem, daughterB);
}
- } finally {
- IOUtils.closeQuietly(metaTable);
- IOUtils.closeQuietly(connection);
}
}
- public static Result getRegionRow(Table metaTable, byte[] regionName) throws IOException {
- Get get = new Get(regionName);
- return metaTable.get(get);
- }
-
- public static void blockUntilRegionIsInMeta(Table metaTable, long timeout, HRegionInfo hri)
+ public static void blockUntilRegionIsInMeta(Connection conn, long timeout, HRegionInfo hri)
throws IOException, InterruptedException {
log("blocking until region is in META: " + hri.getRegionNameAsString());
long start = System.currentTimeMillis();
while (System.currentTimeMillis() - start < timeout) {
- Result result = getRegionRow(metaTable, hri.getRegionName());
- if (result != null) {
- HRegionInfo info = HRegionInfo.getHRegionInfo(result);
- if (info != null && !info.isOffline()) {
- log("found region in META: " + hri.getRegionNameAsString());
- break;
- }
+ HRegionLocation loc = MetaTableAccessor.getRegionLocation(conn, hri);
+ if (loc != null && !loc.getRegionInfo().isOffline()) {
+ log("found region in META: " + hri.getRegionNameAsString());
+ break;
}
Threads.sleep(10);
}
@@ -504,26 +493,21 @@ public class TestEndToEndSplitTransaction {
throws IOException, InterruptedException {
log("blocking until region is opened for reading:" + hri.getRegionNameAsString());
long start = System.currentTimeMillis();
- Connection connection = ConnectionFactory.createConnection(conf);
- Table table = connection.getTable(hri.getTable());
-
- try {
- byte [] row = hri.getStartKey();
- // Check for null/empty row. If we find one, use a key that is likely to be in first region.
- if (row == null || row.length <= 0) row = new byte [] {'0'};
+ try (Connection conn = ConnectionFactory.createConnection(conf);
+ Table table = conn.getTable(hri.getTable())) {
+ byte[] row = hri.getStartKey();
+ // Check for null/empty row. If we find one, use a key that is likely to be in first region.
+ if (row == null || row.length <= 0) row = new byte[] { '0' };
Get get = new Get(row);
while (System.currentTimeMillis() - start < timeout) {
try {
table.get(get);
break;
- } catch(IOException ex) {
- //wait some more
+ } catch (IOException ex) {
+ // wait some more
}
Threads.sleep(10);
}
- } finally {
- IOUtils.closeQuietly(table);
- IOUtils.closeQuietly(connection);
}
}
}