You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by st...@apache.org on 2017/05/27 20:18:01 UTC
[09/29] hbase git commit: HBASE-14614 Procedure v2 - Core Assignment
Manager (Matteo Bertozzi) Move to a new AssignmentManager,
one that describes Assignment using a State Machine built on top of
ProcedureV2 facility.
http://git-wip-us.apache.org/repos/asf/hbase/blob/657a5d46/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestSnapshotCloneIndependence.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestSnapshotCloneIndependence.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestSnapshotCloneIndependence.java
index 66c5abf..aef67bf 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestSnapshotCloneIndependence.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestSnapshotCloneIndependence.java
@@ -19,6 +19,7 @@
package org.apache.hadoop.hbase.client;
import java.util.List;
+
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.conf.Configuration;
@@ -32,7 +33,6 @@ import org.apache.hadoop.hbase.HRegionInfo;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.master.snapshot.SnapshotManager;
-import org.apache.hadoop.hbase.regionserver.CompactingMemStore;
import org.apache.hadoop.hbase.regionserver.ConstantSizeRegionSplitPolicy;
import org.apache.hadoop.hbase.snapshot.SnapshotTestingUtils;
import org.apache.hadoop.hbase.testclassification.ClientTests;
http://git-wip-us.apache.org/repos/asf/hbase/blob/657a5d46/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestSplitOrMergeStatus.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestSplitOrMergeStatus.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestSplitOrMergeStatus.java
index 852c5cf..10f466d 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestSplitOrMergeStatus.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestSplitOrMergeStatus.java
@@ -17,19 +17,24 @@
*/
package org.apache.hadoop.hbase.client;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+
import org.apache.hadoop.hbase.HBaseTestingUtility;
import org.apache.hadoop.hbase.HRegionInfo;
-import org.apache.hadoop.hbase.HRegionLocation;
-import org.apache.hadoop.hbase.MiniHBaseCluster;
import org.apache.hadoop.hbase.TableName;
-import org.apache.hadoop.hbase.regionserver.HRegion;
-import org.apache.hadoop.hbase.regionserver.Region;
import org.apache.hadoop.hbase.testclassification.ClientTests;
import org.apache.hadoop.hbase.testclassification.MediumTests;
import org.apache.hadoop.hbase.util.Bytes;
-import org.apache.hadoop.hbase.util.JVMClusterUtil;
+import org.apache.hadoop.hbase.util.Threads;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Rule;
@@ -37,17 +42,9 @@ import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.junit.rules.TestName;
-import java.io.IOException;
-import java.util.List;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
@Category({MediumTests.class, ClientTests.class})
public class TestSplitOrMergeStatus {
- private static final Log LOG = LogFactory.getLog(TestSplitOrMergeStatus.class);
private final static HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();
private static byte [] FAMILY = Bytes.toBytes("testFamily");
@@ -77,7 +74,7 @@ public class TestSplitOrMergeStatus {
TEST_UTIL.loadTable(t, FAMILY, false);
RegionLocator locator = TEST_UTIL.getConnection().getRegionLocator(t.getName());
- int orignalCount = locator.getAllRegionLocations().size();
+ int originalCount = locator.getAllRegionLocations().size();
Admin admin = TEST_UTIL.getAdmin();
initSwitchStatus(admin);
@@ -85,14 +82,17 @@ public class TestSplitOrMergeStatus {
assertEquals(results.length, 1);
assertTrue(results[0]);
admin.split(t.getName());
- int count = waitOnSplitOrMerge(t).size();
- assertTrue(orignalCount == count);
+ int count = admin.getTableRegions(tableName).size();
+ assertTrue(originalCount == count);
results = admin.setSplitOrMergeEnabled(true, false, MasterSwitchType.SPLIT);
assertEquals(results.length, 1);
assertFalse(results[0]);
admin.split(t.getName());
- count = waitOnSplitOrMerge(t).size();
- assertTrue(orignalCount<count);
+ while ((count = admin.getTableRegions(tableName).size()) == originalCount) {
+ Threads.sleep(1);;
+ }
+ count = admin.getTableRegions(tableName).size();
+ assertTrue(originalCount < count);
admin.close();
}
@@ -103,33 +103,43 @@ public class TestSplitOrMergeStatus {
Table t = TEST_UTIL.createTable(tableName, FAMILY);
TEST_UTIL.loadTable(t, FAMILY, false);
- RegionLocator locator = TEST_UTIL.getConnection().getRegionLocator(t.getName());
-
Admin admin = TEST_UTIL.getAdmin();
+ int originalCount = admin.getTableRegions(tableName).size();
initSwitchStatus(admin);
admin.split(t.getName());
- waitOnSplitOrMerge(t); //Split the table to ensure we have two regions at least.
+ int postSplitCount = -1;
+ while ((postSplitCount = admin.getTableRegions(tableName).size()) == originalCount) {
+ Threads.sleep(1);;
+ }
+ assertTrue("originalCount=" + originalCount + ", newCount=" + postSplitCount,
+ originalCount != postSplitCount);
- waitForMergable(admin, tableName);
- int orignalCount = locator.getAllRegionLocations().size();
+ // Merge switch is off so merge should NOT succeed.
boolean[] results = admin.setSplitOrMergeEnabled(false, false, MasterSwitchType.MERGE);
assertEquals(results.length, 1);
assertTrue(results[0]);
List<HRegionInfo> regions = admin.getTableRegions(t.getName());
assertTrue(regions.size() > 1);
- admin.mergeRegionsAsync(regions.get(0).getEncodedNameAsBytes(),
+ Future<?> f = admin.mergeRegionsAsync(regions.get(0).getEncodedNameAsBytes(),
regions.get(1).getEncodedNameAsBytes(), true);
- int count = waitOnSplitOrMerge(t).size();
- assertTrue(orignalCount == count);
+ try {
+ f.get(10, TimeUnit.SECONDS);
+ fail("Should not get here.");
+ } catch (ExecutionException ee) {
+ // Expected.
+ }
+ int count = admin.getTableRegions(tableName).size();
+ assertTrue("newCount=" + postSplitCount + ", count=" + count, postSplitCount == count);
- waitForMergable(admin, tableName);
results = admin.setSplitOrMergeEnabled(true, false, MasterSwitchType.MERGE);
+ regions = admin.getTableRegions(t.getName());
assertEquals(results.length, 1);
assertFalse(results[0]);
- admin.mergeRegionsAsync(regions.get(0).getEncodedNameAsBytes(),
+ f = admin.mergeRegionsAsync(regions.get(0).getEncodedNameAsBytes(),
regions.get(1).getEncodedNameAsBytes(), true);
- count = waitOnSplitOrMerge(t).size();
- assertTrue(orignalCount>count);
+ f.get(10, TimeUnit.SECONDS);
+ count = admin.getTableRegions(tableName).size();
+ assertTrue((postSplitCount / 2 /*Merge*/) == count);
admin.close();
}
@@ -156,47 +166,4 @@ public class TestSplitOrMergeStatus {
assertTrue(admin.isSplitOrMergeEnabled(MasterSwitchType.SPLIT));
assertTrue(admin.isSplitOrMergeEnabled(MasterSwitchType.MERGE));
}
-
- private void waitForMergable(Admin admin, TableName t) throws InterruptedException, IOException {
- // Wait for the Regions to be mergeable
- MiniHBaseCluster miniCluster = TEST_UTIL.getMiniHBaseCluster();
- int mergeable = 0;
- while (mergeable < 2) {
- Thread.sleep(100);
- admin.majorCompact(t);
- mergeable = 0;
- for (JVMClusterUtil.RegionServerThread regionThread: miniCluster.getRegionServerThreads()) {
- for (Region region: regionThread.getRegionServer().getOnlineRegions(t)) {
- mergeable += ((HRegion)region).isMergeable() ? 1 : 0;
- }
- }
- }
- }
-
- /*
- * Wait on table split. May return because we waited long enough on the split
- * and it didn't happen. Caller should check.
- * @param t
- * @return Map of table regions; caller needs to check table actually split.
- */
- private List<HRegionLocation> waitOnSplitOrMerge(final Table t)
- throws IOException {
- try (RegionLocator locator = TEST_UTIL.getConnection().getRegionLocator(t.getName())) {
- List<HRegionLocation> regions = locator.getAllRegionLocations();
- int originalCount = regions.size();
- for (int i = 0; i < TEST_UTIL.getConfiguration().getInt("hbase.test.retries", 10); i++) {
- Thread.currentThread();
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- regions = locator.getAllRegionLocations();
- if (regions.size() != originalCount)
- break;
- }
- return regions;
- }
- }
-
-}
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/hbase/blob/657a5d46/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestTableFavoredNodes.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestTableFavoredNodes.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestTableFavoredNodes.java
index 3eb65a5..8412e77 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestTableFavoredNodes.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestTableFavoredNodes.java
@@ -35,29 +35,28 @@ import java.util.concurrent.TimeUnit;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.NamespaceDescriptor;
-import org.apache.hadoop.hbase.favored.FavoredNodeAssignmentHelper;
-import org.apache.hadoop.hbase.favored.FavoredNodesManager;
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.NamespaceDescriptor;
import org.apache.hadoop.hbase.ServerName;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.Waiter;
+import org.apache.hadoop.hbase.favored.FavoredNodeAssignmentHelper;
+import org.apache.hadoop.hbase.favored.FavoredNodesManager;
import org.apache.hadoop.hbase.master.LoadBalancer;
-import org.apache.hadoop.hbase.master.RegionStates;
import org.apache.hadoop.hbase.master.ServerManager;
import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer;
import org.apache.hadoop.hbase.master.balancer.LoadOnlyFavoredStochasticBalancer;
+import org.apache.hadoop.hbase.procedure2.ProcedureTestingUtility;
import org.apache.hadoop.hbase.regionserver.HRegionServer;
import org.apache.hadoop.hbase.testclassification.ClientTests;
import org.apache.hadoop.hbase.testclassification.MediumTests;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.hbase.util.JVMClusterUtil;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
+import org.apache.hadoop.hbase.util.Threads;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
@@ -66,6 +65,9 @@ import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.junit.rules.TestName;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+
@Category({ClientTests.class, MediumTests.class})
public class TestTableFavoredNodes {
@@ -76,7 +78,6 @@ public class TestTableFavoredNodes {
private final static int WAIT_TIMEOUT = 60000;
private final static int SLAVES = 8;
private FavoredNodesManager fnm;
- private RegionStates regionStates;
private Admin admin;
private final byte[][] splitKeys = new byte[][] {Bytes.toBytes(1), Bytes.toBytes(9)};
@@ -101,8 +102,8 @@ public class TestTableFavoredNodes {
@AfterClass
public static void tearDownAfterClass() throws Exception {
- TEST_UTIL.cleanupTestDir();
TEST_UTIL.shutdownMiniCluster();
+ TEST_UTIL.cleanupTestDir();
}
@Before
@@ -111,8 +112,6 @@ public class TestTableFavoredNodes {
admin = TEST_UTIL.getAdmin();
admin.setBalancerRunning(false, true);
admin.enableCatalogJanitor(false);
- regionStates =
- TEST_UTIL.getHBaseCluster().getMaster().getAssignmentManager().getRegionStates();
}
/*
@@ -165,8 +164,9 @@ public class TestTableFavoredNodes {
@Test
public void testSplitTable() throws Exception {
final TableName tableName = TableName.valueOf(name.getMethodName());
- TEST_UTIL.createTable(tableName, Bytes.toBytes("f"), splitKeys);
+ Table t = TEST_UTIL.createTable(tableName, Bytes.toBytes("f"), splitKeys);
TEST_UTIL.waitUntilAllRegionsAssigned(tableName);
+ final int numberOfRegions = admin.getTableRegions(t.getName()).size();
checkIfFavoredNodeInformationIsCorrect(tableName);
@@ -176,13 +176,14 @@ public class TestTableFavoredNodes {
List<ServerName> parentFN = fnm.getFavoredNodes(parent);
assertNotNull("FN should not be null for region: " + parent, parentFN);
+ LOG.info("SPLITTING TABLE");
admin.split(tableName, splitPoint);
TEST_UTIL.waitUntilNoRegionsInTransition(WAIT_TIMEOUT);
- waitUntilTableRegionCountReached(tableName, NUM_REGIONS + 1);
+ LOG.info("FINISHED WAITING ON RIT");
+ waitUntilTableRegionCountReached(tableName, numberOfRegions + 1);
- // All regions should have favored nodes
- checkIfFavoredNodeInformationIsCorrect(tableName);
+ // All regions should have favored nodes checkIfFavoredNodeInformationIsCorrect(tableName);
// Get the daughters of parent.
HRegionInfo daughter1 = locator.getRegionLocation(parent.getStartKey(), true).getRegionInfo();
@@ -206,11 +207,18 @@ public class TestTableFavoredNodes {
// Major compact table and run catalog janitor. Parent's FN should be removed
TEST_UTIL.getMiniHBaseCluster().compact(tableName, true);
- assertEquals("Parent region should have been cleaned", 1, admin.runCatalogScan());
+ admin.runCatalogScan();
+ // Catalog cleanup is async. Wait on procedure to finish up.
+ ProcedureTestingUtility.waitAllProcedures(
+ TEST_UTIL.getMiniHBaseCluster().getMaster().getMasterProcedureExecutor());
+ // assertEquals("Parent region should have been cleaned", 1, admin.runCatalogScan());
assertNull("Parent FN should be null", fnm.getFavoredNodes(parent));
List<HRegionInfo> regions = admin.getTableRegions(tableName);
-
+ // Split and Table Disable interfere with each other around region replicas
+ // TODO. Meantime pause a few seconds.
+ Threads.sleep(2000);
+ LOG.info("STARTING DELETE");
TEST_UTIL.deleteTable(tableName);
checkNoFNForDeletedTable(regions);
@@ -235,11 +243,12 @@ public class TestTableFavoredNodes {
LOG.info("regionA: " + regionA.getEncodedName() + " with FN: " + fnm.getFavoredNodes(regionA));
LOG.info("regionB: " + regionA.getEncodedName() + " with FN: " + fnm.getFavoredNodes(regionB));
+ int countOfRegions = MetaTableAccessor.getRegionCount(TEST_UTIL.getConfiguration(), tableName);
admin.mergeRegionsAsync(regionA.getEncodedNameAsBytes(),
regionB.getEncodedNameAsBytes(), false).get(60, TimeUnit.SECONDS);
TEST_UTIL.waitUntilNoRegionsInTransition(WAIT_TIMEOUT);
- waitUntilTableRegionCountReached(tableName, NUM_REGIONS - 1);
+ waitUntilTableRegionCountReached(tableName, countOfRegions - 1);
// All regions should have favored nodes
checkIfFavoredNodeInformationIsCorrect(tableName);
@@ -254,6 +263,9 @@ public class TestTableFavoredNodes {
// Major compact table and run catalog janitor. Parent FN should be removed
TEST_UTIL.getMiniHBaseCluster().compact(tableName, true);
assertEquals("Merge parents should have been cleaned", 1, admin.runCatalogScan());
+ // Catalog cleanup is async. Wait on procedure to finish up.
+ ProcedureTestingUtility.waitAllProcedures(
+ TEST_UTIL.getMiniHBaseCluster().getMaster().getMasterProcedureExecutor());
assertNull("Parent FN should be null", fnm.getFavoredNodes(regionA));
assertNull("Parent FN should be null", fnm.getFavoredNodes(regionB));
@@ -266,6 +278,7 @@ public class TestTableFavoredNodes {
private void checkNoFNForDeletedTable(List<HRegionInfo> regions) {
for (HRegionInfo region : regions) {
+ LOG.info("Testing if FN data for " + region);
assertNull("FN not null for deleted table's region: " + region, fnm.getFavoredNodes(region));
}
}
@@ -376,8 +389,8 @@ public class TestTableFavoredNodes {
TEST_UTIL.waitFor(WAIT_TIMEOUT, new Waiter.Predicate<Exception>() {
@Override
public boolean evaluate() throws Exception {
- return regionStates.getRegionsOfTable(tableName).size() == numRegions;
+ return MetaTableAccessor.getRegionCount(TEST_UTIL.getConfiguration(), tableName) == numRegions;
}
});
}
-}
\ No newline at end of file
+}
http://git-wip-us.apache.org/repos/asf/hbase/blob/657a5d46/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestIncrementTimeRange.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestIncrementTimeRange.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestIncrementTimeRange.java
index 35ed531..8805337 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestIncrementTimeRange.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestIncrementTimeRange.java
@@ -32,7 +32,6 @@ import java.util.NavigableMap;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.HBaseTestingUtility;
import org.apache.hadoop.hbase.TableName;
-import org.apache.hadoop.hbase.client.Durability;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.Increment;
import org.apache.hadoop.hbase.client.Put;
@@ -40,6 +39,7 @@ import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.Row;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.io.TimeRange;
+import org.apache.hadoop.hbase.procedure2.RemoteProcedureDispatcher;
import org.apache.hadoop.hbase.testclassification.CoprocessorTests;
import org.apache.hadoop.hbase.testclassification.MediumTests;
import org.apache.hadoop.hbase.util.Bytes;
@@ -84,6 +84,9 @@ public class TestIncrementTimeRange {
public static void setupBeforeClass() throws Exception {
util.getConfiguration().set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,
MyObserver.class.getName());
+ // Make general delay zero rather than default. Timing is off in this
+ // test that depends on an evironment edge that is manually moved forward.
+ util.getConfiguration().setInt(RemoteProcedureDispatcher.DISPATCH_DELAY_CONF_KEY, 0);
util.startMiniCluster();
EnvironmentEdgeManager.injectEdge(mee);
}
http://git-wip-us.apache.org/repos/asf/hbase/blob/657a5d46/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestSimpleRpcScheduler.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestSimpleRpcScheduler.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestSimpleRpcScheduler.java
index 1d7c12e..a1b33f7 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestSimpleRpcScheduler.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestSimpleRpcScheduler.java
@@ -49,6 +49,7 @@ import java.util.concurrent.LinkedBlockingQueue;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.hbase.CategoryBasedTimeout;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HConstants;
import org.apache.hadoop.hbase.client.Put;
@@ -66,17 +67,19 @@ import org.apache.hadoop.hbase.util.EnvironmentEdge;
import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
import org.apache.hadoop.hbase.util.Threads;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.experimental.categories.Category;
+import org.junit.rules.TestRule;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
@Category({RPCTests.class, SmallTests.class})
-public class TestSimpleRpcScheduler {/*
+public class TestSimpleRpcScheduler {
@Rule
public final TestRule timeout =
CategoryBasedTimeout.builder().withTimeout(this.getClass()).
- withLookingForStuckThread(true).build();*/
+ withLookingForStuckThread(true).build();
private static final Log LOG = LogFactory.getLog(TestSimpleRpcScheduler.class);
http://git-wip-us.apache.org/repos/asf/hbase/blob/657a5d46/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestLoadIncrementalHFiles.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestLoadIncrementalHFiles.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestLoadIncrementalHFiles.java
index 7f1723c..b6ad2c9 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestLoadIncrementalHFiles.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestLoadIncrementalHFiles.java
@@ -26,7 +26,6 @@ import static org.junit.Assert.fail;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.ArrayList;
-import java.util.Deque;
import java.util.List;
import java.util.Locale;
import java.util.Map;
@@ -60,6 +59,7 @@ import org.apache.hadoop.hbase.util.FSUtils;
import org.apache.hadoop.hbase.util.HFileTestUtil;
import org.junit.AfterClass;
import org.junit.BeforeClass;
+import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.experimental.categories.Category;
http://git-wip-us.apache.org/repos/asf/hbase/blob/657a5d46/hbase-server/src/test/java/org/apache/hadoop/hbase/master/MockNoopMasterServices.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/MockNoopMasterServices.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/MockNoopMasterServices.java
index ff6b88e..626e154 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/MockNoopMasterServices.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/MockNoopMasterServices.java
@@ -32,14 +32,17 @@ import org.apache.hadoop.hbase.ServerName;
import org.apache.hadoop.hbase.TableDescriptors;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.ClusterConnection;
+import org.apache.hadoop.hbase.client.MasterSwitchType;
import org.apache.hadoop.hbase.executor.ExecutorService;
-import org.apache.hadoop.hbase.master.locking.LockManager;
import org.apache.hadoop.hbase.favored.FavoredNodesManager;
+import org.apache.hadoop.hbase.master.assignment.AssignmentManager;
+import org.apache.hadoop.hbase.master.locking.LockManager;
import org.apache.hadoop.hbase.master.normalizer.RegionNormalizer;
import org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv;
import org.apache.hadoop.hbase.master.snapshot.SnapshotManager;
import org.apache.hadoop.hbase.procedure.MasterProcedureManagerHost;
import org.apache.hadoop.hbase.procedure2.LockInfo;
+import org.apache.hadoop.hbase.procedure2.ProcedureEvent;
import org.apache.hadoop.hbase.procedure2.ProcedureExecutor;
import org.apache.hadoop.hbase.quotas.MasterQuotaManager;
import org.apache.hadoop.hbase.replication.ReplicationException;
@@ -374,6 +377,11 @@ public class MockNoopMasterServices implements MasterServices, Server {
}
@Override
+ public boolean isSplitOrMergeEnabled(MasterSwitchType switchType) {
+ return false;
+ }
+
+ @Override
public void addReplicationPeer(String peerId, ReplicationPeerConfig peerConfig)
throws ReplicationException {
}
@@ -426,4 +434,16 @@ public class MockNoopMasterServices implements MasterServices, Server {
public LockManager getLockManager() {
return null;
}
+
+ @Override
+ public long dispatchMergingRegions(HRegionInfo region_a, HRegionInfo region_b, boolean forcible, long nonceGroup,
+ long nonce) throws IOException {
+ return 0;
+ }
+
+ @Override
+ public ProcedureEvent getInitializedEvent() {
+ // TODO Auto-generated method stub
+ return null;
+ }
}
http://git-wip-us.apache.org/repos/asf/hbase/blob/657a5d46/hbase-server/src/test/java/org/apache/hadoop/hbase/master/MockRegionServer.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/MockRegionServer.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/MockRegionServer.java
index 67a3f0a..7ac7571 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/MockRegionServer.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/MockRegionServer.java
@@ -41,7 +41,6 @@ import org.apache.hadoop.hbase.ServerName;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.ZooKeeperConnectionException;
import org.apache.hadoop.hbase.client.ClusterConnection;
-import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.client.locking.EntityLock;
@@ -54,10 +53,10 @@ import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ClearCompac
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ClearCompactionQueuesResponse;
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CloseRegionRequest;
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CloseRegionResponse;
-import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CloseRegionForSplitOrMergeRequest;
-import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CloseRegionForSplitOrMergeResponse;
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CompactRegionRequest;
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CompactRegionResponse;
+import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ExecuteProceduresRequest;
+import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ExecuteProceduresResponse;
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.FlushRegionRequest;
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.FlushRegionResponse;
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetOnlineRegionRequest;
@@ -70,6 +69,8 @@ import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetServerIn
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetServerInfoResponse;
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetStoreFileRequest;
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetStoreFileResponse;
+import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.MergeRegionsRequest;
+import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.MergeRegionsResponse;
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.OpenRegionRequest;
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.OpenRegionResponse;
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ReplicateWALEntryRequest;
@@ -502,13 +503,6 @@ ClientProtos.ClientService.BlockingInterface, RegionServerServices {
}
@Override
- public CloseRegionForSplitOrMergeResponse closeRegionForSplitOrMerge(
- RpcController controller,
- CloseRegionForSplitOrMergeRequest request) throws ServiceException {
- return null;
- }
-
- @Override
public FlushRegionResponse flushRegion(RpcController controller,
FlushRegionRequest request) throws ServiceException {
// TODO Auto-generated method stub
@@ -516,16 +510,6 @@ ClientProtos.ClientService.BlockingInterface, RegionServerServices {
}
@Override
- public long requestRegionSplit(HRegionInfo regionInfo, byte[] splitRow) {
- return -1;
- }
-
- @Override
- public boolean isProcedureFinished(final long procId) {
- return false;
- }
-
- @Override
public SplitRegionResponse splitRegion(RpcController controller,
SplitRegionRequest request) throws ServiceException {
return null;
@@ -738,9 +722,22 @@ ClientProtos.ClientService.BlockingInterface, RegionServerServices {
}
@Override
+ public ExecuteProceduresResponse executeProcedures(RpcController controller,
+ ExecuteProceduresRequest request) throws ServiceException {
+ return null;
+ }
+
+ @Override
public GetSpaceQuotaSnapshotsResponse getSpaceQuotaSnapshots(
RpcController controller, GetSpaceQuotaSnapshotsRequest request)
throws ServiceException {
return null;
}
+
+ @Override
+ public MergeRegionsResponse mergeRegions(RpcController controller, MergeRegionsRequest request)
+ throws ServiceException {
+ // TODO Auto-generated method stub
+ return null;
+ }
}
http://git-wip-us.apache.org/repos/asf/hbase/blob/657a5d46/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestAssignmentListener.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestAssignmentListener.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestAssignmentListener.java
index 78b75d5..95c0615 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestAssignmentListener.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestAssignmentListener.java
@@ -40,6 +40,7 @@ import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Table;
+import org.apache.hadoop.hbase.master.assignment.AssignmentManager;
import org.apache.hadoop.hbase.regionserver.HRegion;
import org.apache.hadoop.hbase.regionserver.Region;
import org.apache.hadoop.hbase.testclassification.MasterTests;
http://git-wip-us.apache.org/repos/asf/hbase/blob/657a5d46/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestAssignmentManagerOnCluster.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestAssignmentManagerOnCluster.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestAssignmentManagerOnCluster.java
deleted file mode 100644
index 23e61f6..0000000
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestAssignmentManagerOnCluster.java
+++ /dev/null
@@ -1,1403 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.hadoop.hbase.master;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.fs.FileSystem;
-import org.apache.hadoop.fs.Path;
-import org.apache.hadoop.hbase.CoordinatedStateManager;
-import org.apache.hadoop.hbase.HBaseIOException;
-import org.apache.hadoop.hbase.HBaseTestingUtility;
-import org.apache.hadoop.hbase.HColumnDescriptor;
-import org.apache.hadoop.hbase.HConstants;
-import org.apache.hadoop.hbase.HRegionInfo;
-import org.apache.hadoop.hbase.HTableDescriptor;
-import org.apache.hadoop.hbase.MetaTableAccessor;
-import org.apache.hadoop.hbase.MiniHBaseCluster;
-import org.apache.hadoop.hbase.MiniHBaseCluster.MiniHBaseClusterRegionServer;
-import org.apache.hadoop.hbase.ServerLoad;
-import org.apache.hadoop.hbase.ServerName;
-import org.apache.hadoop.hbase.TableName;
-import org.apache.hadoop.hbase.UnknownRegionException;
-import org.apache.hadoop.hbase.Waiter;
-import org.apache.hadoop.hbase.client.Admin;
-import org.apache.hadoop.hbase.client.Result;
-import org.apache.hadoop.hbase.client.Table;
-import org.apache.hadoop.hbase.coordination.ZkCoordinatedStateManager;
-import org.apache.hadoop.hbase.client.TableState;
-import org.apache.hadoop.hbase.coprocessor.CoprocessorHost;
-import org.apache.hadoop.hbase.coprocessor.ObserverContext;
-import org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment;
-import org.apache.hadoop.hbase.coprocessor.RegionObserver;
-import org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer;
-import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode;
-import org.apache.hadoop.hbase.regionserver.HRegionServer;
-import org.apache.hadoop.hbase.testclassification.MasterTests;
-import org.apache.hadoop.hbase.testclassification.MediumTests;
-import org.apache.hadoop.hbase.util.Bytes;
-import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
-import org.apache.hadoop.hbase.util.FSUtils;
-import org.apache.hadoop.hbase.util.JVMClusterUtil;
-import org.apache.hadoop.hbase.zookeeper.MetaTableLocator;
-import org.apache.zookeeper.KeeperException;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-import org.junit.rules.TestName;
-
-/**
- * This tests AssignmentManager with a testing cluster.
- */
-@SuppressWarnings("deprecation")
-@Category({MasterTests.class, MediumTests.class})
-public class TestAssignmentManagerOnCluster {
- private final static byte[] FAMILY = Bytes.toBytes("FAMILY");
- private final static HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();
- final static Configuration conf = TEST_UTIL.getConfiguration();
- private static Admin admin;
-
- @Rule
- public TestName name = new TestName();
-
- @BeforeClass
- public static void setUpBeforeClass() throws Exception {
- // Using the our load balancer to control region plans
- conf.setClass(HConstants.HBASE_MASTER_LOADBALANCER_CLASS,
- MyLoadBalancer.class, LoadBalancer.class);
- conf.setClass(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,
- MyRegionObserver.class, RegionObserver.class);
- // Reduce the maximum attempts to speed up the test
- conf.setInt("hbase.assignment.maximum.attempts", 3);
- conf.setInt("hbase.master.maximum.ping.server.attempts", 3);
- conf.setInt("hbase.master.ping.server.retry.sleep.interval", 1);
-
- TEST_UTIL.startMiniCluster(1, 4, null, MyMaster.class, MyRegionServer.class);
- admin = TEST_UTIL.getAdmin();
- }
-
- @AfterClass
- public static void tearDownAfterClass() throws Exception {
- TEST_UTIL.shutdownMiniCluster();
- }
-
- /**
- * This tests restarting meta regionserver
- */
- @Test (timeout=180000)
- public void testRestartMetaRegionServer() throws Exception {
- MiniHBaseCluster cluster = TEST_UTIL.getHBaseCluster();
- boolean stoppedARegionServer = false;
- try {
- HMaster master = cluster.getMaster();
- RegionStates regionStates = master.getAssignmentManager().getRegionStates();
- ServerName metaServerName = regionStates.getRegionServerOfRegion(
- HRegionInfo.FIRST_META_REGIONINFO);
- if (master.getServerName().equals(metaServerName)) {
- // Move meta off master
- metaServerName = cluster.getLiveRegionServerThreads()
- .get(0).getRegionServer().getServerName();
- master.move(HRegionInfo.FIRST_META_REGIONINFO.getEncodedNameAsBytes(),
- Bytes.toBytes(metaServerName.getServerName()));
- TEST_UTIL.waitUntilNoRegionsInTransition(60000);
- }
- RegionState metaState =
- MetaTableLocator.getMetaRegionState(master.getZooKeeper());
- assertEquals("Meta should be not in transition",
- metaState.getState(), RegionState.State.OPEN);
- assertNotEquals("Meta should be moved off master",
- metaState.getServerName(), master.getServerName());
- assertEquals("Meta should be on the meta server",
- metaState.getServerName(), metaServerName);
- cluster.killRegionServer(metaServerName);
- stoppedARegionServer = true;
- cluster.waitForRegionServerToStop(metaServerName, 60000);
-
- // Wait for SSH to finish
- final ServerName oldServerName = metaServerName;
- final ServerManager serverManager = master.getServerManager();
- TEST_UTIL.waitFor(120000, 200, new Waiter.Predicate<Exception>() {
- @Override
- public boolean evaluate() throws Exception {
- return serverManager.isServerDead(oldServerName)
- && !serverManager.areDeadServersInProgress();
- }
- });
-
- TEST_UTIL.waitUntilNoRegionsInTransition(60000);
- // Now, make sure meta is assigned
- assertTrue("Meta should be assigned",
- regionStates.isRegionOnline(HRegionInfo.FIRST_META_REGIONINFO));
- // Now, make sure meta is registered in zk
- metaState = MetaTableLocator.getMetaRegionState(master.getZooKeeper());
- assertEquals("Meta should be not in transition",
- metaState.getState(), RegionState.State.OPEN);
- assertEquals("Meta should be assigned", metaState.getServerName(),
- regionStates.getRegionServerOfRegion(HRegionInfo.FIRST_META_REGIONINFO));
- assertNotEquals("Meta should be assigned on a different server",
- metaState.getServerName(), metaServerName);
- } finally {
- if (stoppedARegionServer) {
- cluster.startRegionServer();
- }
- }
- }
-
- /**
- * This tests region assignment
- */
- @Test (timeout=60000)
- public void testAssignRegion() throws Exception {
- final TableName tableName = TableName.valueOf(name.getMethodName());
- try {
- HTableDescriptor desc = new HTableDescriptor(tableName);
- desc.addFamily(new HColumnDescriptor(FAMILY));
- admin.createTable(desc);
-
- Table meta = TEST_UTIL.getConnection().getTable(TableName.META_TABLE_NAME);
- HRegionInfo hri = new HRegionInfo(
- desc.getTableName(), Bytes.toBytes("A"), Bytes.toBytes("Z"));
- MetaTableAccessor.addRegionToMeta(meta, hri);
-
- HMaster master = TEST_UTIL.getHBaseCluster().getMaster();
- AssignmentManager am = master.getAssignmentManager();
- TEST_UTIL.assignRegion(hri);
-
- RegionStates regionStates = am.getRegionStates();
- ServerName serverName = regionStates.getRegionServerOfRegion(hri);
- TEST_UTIL.assertRegionOnServer(hri, serverName, 200);
-
- // Region is assigned now. Let's assign it again.
- // Master should not abort, and region should be assigned.
- TEST_UTIL.getAdmin().assign(hri.getRegionName());
- master.getAssignmentManager().waitForAssignment(hri);
- RegionState newState = regionStates.getRegionState(hri);
- assertTrue(newState.isOpened());
- } finally {
- TEST_UTIL.deleteTable(tableName);
- }
- }
-
- /**
- * This tests region assignment on a simulated restarted server
- */
- @Test (timeout=120000)
- public void testAssignRegionOnRestartedServer() throws Exception {
- final TableName tableName = TableName.valueOf(name.getMethodName());
- TEST_UTIL.getMiniHBaseCluster().getConf().setInt("hbase.assignment.maximum.attempts", 20);
- TEST_UTIL.getMiniHBaseCluster().stopMaster(0);
- //restart the master so that conf take into affect
- TEST_UTIL.getMiniHBaseCluster().startMaster();
-
- ServerName deadServer = null;
- HMaster master = null;
- try {
- HTableDescriptor desc = new HTableDescriptor(tableName);
- desc.addFamily(new HColumnDescriptor(FAMILY));
- admin.createTable(desc);
-
- Table meta = TEST_UTIL.getConnection().getTable(TableName.META_TABLE_NAME);
- final HRegionInfo hri = new HRegionInfo(
- desc.getTableName(), Bytes.toBytes("A"), Bytes.toBytes("Z"));
- MetaTableAccessor.addRegionToMeta(meta, hri);
-
- master = TEST_UTIL.getHBaseCluster().getMaster();
- Set<ServerName> onlineServers = master.getServerManager().getOnlineServers().keySet();
- assertFalse("There should be some servers online", onlineServers.isEmpty());
-
- // Use the first server as the destination server
- ServerName destServer = onlineServers.iterator().next();
-
- // Created faked dead server that is still online in master
- deadServer = ServerName.valueOf(destServer.getHostname(),
- destServer.getPort(), destServer.getStartcode() - 100L);
- master.getServerManager().recordNewServerWithLock(deadServer, ServerLoad.EMPTY_SERVERLOAD);
-
- final AssignmentManager am = master.getAssignmentManager();
- RegionPlan plan = new RegionPlan(hri, null, deadServer);
- am.addPlan(hri.getEncodedName(), plan);
- TEST_UTIL.assignRegion(hri);
-
- TEST_UTIL.waitFor(60000, new Waiter.Predicate<Exception>() {
- @Override
- public boolean evaluate() throws Exception {
- return ! am.getRegionStates().isRegionInTransition(hri);
- }
- });
-
- assertFalse("Region should be assigned", am.getRegionStates().isRegionInTransition(hri));
- } finally {
- if (deadServer != null) {
- master.getServerManager().expireServer(deadServer);
- }
-
- TEST_UTIL.deleteTable(tableName);
-
- // reset the value for other tests
- TEST_UTIL.getMiniHBaseCluster().getConf().setInt("hbase.assignment.maximum.attempts", 3);
- ServerName masterServerName = TEST_UTIL.getMiniHBaseCluster().getMaster().getServerName();
- TEST_UTIL.getMiniHBaseCluster().stopMaster(masterServerName);
- TEST_UTIL.getMiniHBaseCluster().startMaster();
- }
- }
-
- /**
- * This tests offlining a region
- */
- @Test (timeout=60000)
- public void testOfflineRegion() throws Exception {
- final TableName tableName = TableName.valueOf(name.getMethodName());
- try {
- HRegionInfo hri = createTableAndGetOneRegion(tableName);
-
- RegionStates regionStates = TEST_UTIL.getHBaseCluster().
- getMaster().getAssignmentManager().getRegionStates();
- ServerName serverName = regionStates.getRegionServerOfRegion(hri);
- TEST_UTIL.assertRegionOnServer(hri, serverName, 200);
- admin.offline(hri.getRegionName());
-
- long timeoutTime = System.currentTimeMillis() + 800;
- while (true) {
- if (regionStates.getRegionByStateOfTable(tableName)
- .get(RegionState.State.OFFLINE).contains(hri))
- break;
- long now = System.currentTimeMillis();
- if (now > timeoutTime) {
- fail("Failed to offline the region in time");
- break;
- }
- Thread.sleep(10);
- }
- RegionState regionState = regionStates.getRegionState(hri);
- assertTrue(regionState.isOffline());
- } finally {
- TEST_UTIL.deleteTable(tableName);
- }
- }
-
- /**
- * This tests moving a region
- */
- @Test (timeout=50000)
- public void testMoveRegion() throws Exception {
- final TableName tableName = TableName.valueOf(name.getMethodName());
- try {
- HRegionInfo hri = createTableAndGetOneRegion(tableName);
-
- HMaster master = TEST_UTIL.getHBaseCluster().getMaster();
- RegionStates regionStates = master.getAssignmentManager().getRegionStates();
- ServerName serverName = regionStates.getRegionServerOfRegion(hri);
- ServerManager serverManager = master.getServerManager();
- ServerName destServerName = null;
- List<JVMClusterUtil.RegionServerThread> regionServers =
- TEST_UTIL.getHBaseCluster().getLiveRegionServerThreads();
- for (JVMClusterUtil.RegionServerThread regionServer: regionServers) {
- HRegionServer destServer = regionServer.getRegionServer();
- destServerName = destServer.getServerName();
- if (!destServerName.equals(serverName)
- && serverManager.isServerOnline(destServerName)) {
- break;
- }
- }
- assertTrue(destServerName != null
- && !destServerName.equals(serverName));
- TEST_UTIL.getAdmin().move(hri.getEncodedNameAsBytes(),
- Bytes.toBytes(destServerName.getServerName()));
-
- long timeoutTime = System.currentTimeMillis() + 30000;
- while (true) {
- ServerName sn = regionStates.getRegionServerOfRegion(hri);
- if (sn != null && sn.equals(destServerName)) {
- TEST_UTIL.assertRegionOnServer(hri, sn, 200);
- break;
- }
- long now = System.currentTimeMillis();
- if (now > timeoutTime) {
- fail("Failed to move the region in time: "
- + regionStates.getRegionState(hri));
- }
- regionStates.waitForUpdate(50);
- }
-
- } finally {
- TEST_UTIL.deleteTable(tableName);
- }
- }
-
- /**
- * If a table is deleted, we should not be able to move it anymore.
- * Otherwise, the region will be brought back.
- * @throws Exception
- */
- @Test (timeout=50000)
- public void testMoveRegionOfDeletedTable() throws Exception {
- final TableName tableName = TableName.valueOf(name.getMethodName());
- Admin admin = TEST_UTIL.getAdmin();
- try {
- HRegionInfo hri = createTableAndGetOneRegion(tableName);
-
- HMaster master = TEST_UTIL.getHBaseCluster().getMaster();
- AssignmentManager am = master.getAssignmentManager();
- RegionStates regionStates = am.getRegionStates();
- ServerName serverName = regionStates.getRegionServerOfRegion(hri);
- ServerName destServerName = null;
- for (int i = 0; i < 3; i++) {
- HRegionServer destServer = TEST_UTIL.getHBaseCluster().getRegionServer(i);
- if (!destServer.getServerName().equals(serverName)) {
- destServerName = destServer.getServerName();
- break;
- }
- }
- assertTrue(destServerName != null
- && !destServerName.equals(serverName));
-
- TEST_UTIL.deleteTable(tableName);
-
- try {
- admin.move(hri.getEncodedNameAsBytes(),
- Bytes.toBytes(destServerName.getServerName()));
- fail("We should not find the region");
- } catch (IOException ioe) {
- assertTrue(ioe instanceof UnknownRegionException);
- }
-
- am.balance(new RegionPlan(hri, serverName, destServerName));
- assertFalse("The region should not be in transition",
- regionStates.isRegionInTransition(hri));
- } finally {
- if (admin.tableExists(tableName)) {
- TEST_UTIL.deleteTable(tableName);
- }
- }
- }
-
- HRegionInfo createTableAndGetOneRegion(
- final TableName tableName) throws IOException, InterruptedException {
- HTableDescriptor desc = new HTableDescriptor(tableName);
- desc.addFamily(new HColumnDescriptor(FAMILY));
- admin.createTable(desc, Bytes.toBytes("A"), Bytes.toBytes("Z"), 5);
-
- // wait till the table is assigned
- HMaster master = TEST_UTIL.getHBaseCluster().getMaster();
- long timeoutTime = System.currentTimeMillis() + 1000;
- while (true) {
- List<HRegionInfo> regions = master.getAssignmentManager().
- getRegionStates().getRegionsOfTable(tableName);
- if (regions.size() > 3) {
- return regions.get(2);
- }
- long now = System.currentTimeMillis();
- if (now > timeoutTime) {
- fail("Could not find an online region");
- }
- Thread.sleep(10);
- }
- }
-
- /**
- * This tests assign a region while it's closing.
- */
- @Test (timeout=60000)
- public void testAssignWhileClosing() throws Exception {
- final TableName tableName = TableName.valueOf(name.getMethodName());
- try {
- HTableDescriptor desc = new HTableDescriptor(tableName);
- desc.addFamily(new HColumnDescriptor(FAMILY));
- admin.createTable(desc);
-
- Table meta = TEST_UTIL.getConnection().getTable(TableName.META_TABLE_NAME);
- HRegionInfo hri = new HRegionInfo(
- desc.getTableName(), Bytes.toBytes("A"), Bytes.toBytes("Z"));
- MetaTableAccessor.addRegionToMeta(meta, hri);
-
- HMaster master = TEST_UTIL.getHBaseCluster().getMaster();
- AssignmentManager am = master.getAssignmentManager();
- assertTrue(TEST_UTIL.assignRegion(hri));
-
- ServerName sn = am.getRegionStates().getRegionServerOfRegion(hri);
- TEST_UTIL.assertRegionOnServer(hri, sn, 6000);
- MyRegionObserver.preCloseEnabled.set(true);
- am.unassign(hri);
- RegionState state = am.getRegionStates().getRegionState(hri);
- assertEquals(RegionState.State.FAILED_CLOSE, state.getState());
-
- MyRegionObserver.preCloseEnabled.set(false);
- am.unassign(hri);
-
- // region is closing now, will be re-assigned automatically.
- // now, let's forcefully assign it again. it should be
- // assigned properly and no double-assignment
- am.assign(hri, true);
-
- // let's check if it's assigned after it's out of transition
- am.waitOnRegionToClearRegionsInTransition(hri);
- assertTrue(am.waitForAssignment(hri));
-
- ServerName serverName = master.getAssignmentManager().
- getRegionStates().getRegionServerOfRegion(hri);
- TEST_UTIL.assertRegionOnlyOnServer(hri, serverName, 200);
- } finally {
- MyRegionObserver.preCloseEnabled.set(false);
- TEST_UTIL.deleteTable(tableName);
- }
- }
-
- /**
- * This tests region close failed
- */
- @Test (timeout=60000)
- public void testCloseFailed() throws Exception {
- final TableName tableName = TableName.valueOf(name.getMethodName());
- try {
- HTableDescriptor desc = new HTableDescriptor(tableName);
- desc.addFamily(new HColumnDescriptor(FAMILY));
- admin.createTable(desc);
-
- Table meta = TEST_UTIL.getConnection().getTable(TableName.META_TABLE_NAME);
- HRegionInfo hri = new HRegionInfo(
- desc.getTableName(), Bytes.toBytes("A"), Bytes.toBytes("Z"));
- MetaTableAccessor.addRegionToMeta(meta, hri);
-
- HMaster master = TEST_UTIL.getHBaseCluster().getMaster();
- AssignmentManager am = master.getAssignmentManager();
- assertTrue(TEST_UTIL.assignRegion(hri));
- ServerName sn = am.getRegionStates().getRegionServerOfRegion(hri);
- TEST_UTIL.assertRegionOnServer(hri, sn, 6000);
-
- MyRegionObserver.preCloseEnabled.set(true);
- am.unassign(hri);
- RegionState state = am.getRegionStates().getRegionState(hri);
- assertEquals(RegionState.State.FAILED_CLOSE, state.getState());
-
- MyRegionObserver.preCloseEnabled.set(false);
- am.unassign(hri);
-
- // region may still be assigned now since it's closing,
- // let's check if it's assigned after it's out of transition
- am.waitOnRegionToClearRegionsInTransition(hri);
-
- // region should be closed and re-assigned
- assertTrue(am.waitForAssignment(hri));
- ServerName serverName = master.getAssignmentManager().
- getRegionStates().getRegionServerOfRegion(hri);
- TEST_UTIL.assertRegionOnServer(hri, serverName, 200);
- } finally {
- MyRegionObserver.preCloseEnabled.set(false);
- TEST_UTIL.deleteTable(tableName);
- }
- }
-
- /**
- * This tests region open failed
- */
- @Test (timeout=60000)
- public void testOpenFailed() throws Exception {
- final TableName tableName = TableName.valueOf(name.getMethodName());
- try {
- HTableDescriptor desc = new HTableDescriptor(tableName);
- desc.addFamily(new HColumnDescriptor(FAMILY));
- admin.createTable(desc);
-
- Table meta = TEST_UTIL.getConnection().getTable(TableName.META_TABLE_NAME);
- HRegionInfo hri = new HRegionInfo(
- desc.getTableName(), Bytes.toBytes("A"), Bytes.toBytes("Z"));
- MetaTableAccessor.addRegionToMeta(meta, hri);
-
- MyLoadBalancer.controledRegion = hri;
-
- HMaster master = TEST_UTIL.getHBaseCluster().getMaster();
- AssignmentManager am = master.getAssignmentManager();
- assertFalse(TEST_UTIL.assignRegion(hri));
-
- RegionState state = am.getRegionStates().getRegionState(hri);
- assertEquals(RegionState.State.FAILED_OPEN, state.getState());
- // Failed to open since no plan, so it's on no server
- assertNull(state.getServerName());
-
- MyLoadBalancer.controledRegion = null;
- assertTrue(TEST_UTIL.assignRegion(hri));
-
- ServerName serverName = master.getAssignmentManager().
- getRegionStates().getRegionServerOfRegion(hri);
- TEST_UTIL.assertRegionOnServer(hri, serverName, 200);
- } finally {
- MyLoadBalancer.controledRegion = null;
- TEST_UTIL.deleteTable(tableName);
- }
- }
-
- /**
- * This tests round-robin assignment failed due to no bulkplan
- */
- @Test (timeout=60000)
- public void testRoundRobinAssignmentFailed() throws Exception {
- final TableName tableName = TableName.valueOf(name.getMethodName());
- try {
- HTableDescriptor desc = new HTableDescriptor(tableName);
- desc.addFamily(new HColumnDescriptor(FAMILY));
- admin.createTable(desc);
-
- Table meta = admin.getConnection().getTable(TableName.META_TABLE_NAME);
- HRegionInfo hri = new HRegionInfo(
- desc.getTableName(), Bytes.toBytes("A"), Bytes.toBytes("Z"));
- MetaTableAccessor.addRegionToMeta(meta, hri);
-
- HMaster master = TEST_UTIL.getHBaseCluster().getMaster();
- AssignmentManager am = master.getAssignmentManager();
-
- // round-robin assignment but balancer cannot find a plan
- // assignment should fail
- MyLoadBalancer.controledRegion = hri;
- // if bulk assignment cannot update region state to online
- // or failed_open this waits until timeout
- assertFalse(TEST_UTIL.assignRegion(hri));
- RegionState state = am.getRegionStates().getRegionState(hri);
- assertEquals(RegionState.State.FAILED_OPEN, state.getState());
- // Failed to open since no plan, so it's on no server
- assertNull(state.getServerName());
-
- // try again with valid plan
- MyLoadBalancer.controledRegion = null;
- assertTrue(TEST_UTIL.assignRegion(hri));
-
- ServerName serverName = master.getAssignmentManager().
- getRegionStates().getRegionServerOfRegion(hri);
- TEST_UTIL.assertRegionOnServer(hri, serverName, 200);
- } finally {
- MyLoadBalancer.controledRegion = null;
- TEST_UTIL.deleteTable(tableName);
- }
- }
-
- /**
- * This tests retain assignment failed due to no bulkplan
- */
- @Test (timeout=60000)
- public void testRetainAssignmentFailed() throws Exception {
- final TableName tableName = TableName.valueOf(name.getMethodName());
- try {
- HTableDescriptor desc = new HTableDescriptor(tableName);
- desc.addFamily(new HColumnDescriptor(FAMILY));
- admin.createTable(desc);
-
- Table meta = TEST_UTIL.getConnection().getTable(TableName.META_TABLE_NAME);
- HRegionInfo hri = new HRegionInfo(
- desc.getTableName(), Bytes.toBytes("A"), Bytes.toBytes("Z"));
- MetaTableAccessor.addRegionToMeta(meta, hri);
-
- MyLoadBalancer.controledRegion = hri;
-
- HMaster master = TEST_UTIL.getHBaseCluster().getMaster();
- AssignmentManager am = master.getAssignmentManager();
-
- Map<HRegionInfo, ServerName> regions = new HashMap<>();
- ServerName dest = TEST_UTIL.getHBaseCluster().getRegionServer(0).getServerName();
- regions.put(hri, dest);
- // retainAssignment but balancer cannot find a plan
- // assignment should fail
- am.assign(regions);
-
- // if retain assignment cannot update region state to online
- // or failed_open this waits until timeout
- assertFalse(am.waitForAssignment(hri));
- RegionState state = am.getRegionStates().getRegionState(hri);
- assertEquals(RegionState.State.FAILED_OPEN, state.getState());
- // Failed to open since no plan, so it's on no server
- assertNull(state.getServerName());
-
- // try retainAssigment again with valid plan
- MyLoadBalancer.controledRegion = null;
- am.assign(regions);
- assertTrue(am.waitForAssignment(hri));
-
- ServerName serverName = master.getAssignmentManager().
- getRegionStates().getRegionServerOfRegion(hri);
- TEST_UTIL.assertRegionOnServer(hri, serverName, 200);
-
- // it retains on same server as specified
- assertEquals(serverName, dest);
- } finally {
- MyLoadBalancer.controledRegion = null;
- TEST_UTIL.deleteTable(tableName);
- }
- }
-
- /**
- * This tests region open failure which is not recoverable
- */
- @Test (timeout=60000)
- public void testOpenFailedUnrecoverable() throws Exception {
- final TableName tableName = TableName.valueOf(name.getMethodName());
- try {
- HTableDescriptor desc = new HTableDescriptor(tableName);
- desc.addFamily(new HColumnDescriptor(FAMILY));
- admin.createTable(desc);
-
- Table meta = TEST_UTIL.getConnection().getTable(TableName.META_TABLE_NAME);
- HRegionInfo hri = new HRegionInfo(
- desc.getTableName(), Bytes.toBytes("A"), Bytes.toBytes("Z"));
- MetaTableAccessor.addRegionToMeta(meta, hri);
-
- FileSystem fs = FileSystem.get(conf);
- Path tableDir= FSUtils.getTableDir(FSUtils.getRootDir(conf), tableName);
- Path regionDir = new Path(tableDir, hri.getEncodedName());
- // create a file named the same as the region dir to
- // mess up with region opening
- fs.create(regionDir, true);
-
- HMaster master = TEST_UTIL.getHBaseCluster().getMaster();
- AssignmentManager am = master.getAssignmentManager();
- assertFalse(TEST_UTIL.assignRegion(hri));
-
- RegionState state = am.getRegionStates().getRegionState(hri);
- assertEquals(RegionState.State.FAILED_OPEN, state.getState());
- // Failed to open due to file system issue. Region state should
- // carry the opening region server so that we can force close it
- // later on before opening it again. See HBASE-9092.
- assertNotNull(state.getServerName());
-
- // remove the blocking file, so that region can be opened
- fs.delete(regionDir, true);
- assertTrue(TEST_UTIL.assignRegion(hri));
-
- ServerName serverName = master.getAssignmentManager().
- getRegionStates().getRegionServerOfRegion(hri);
- TEST_UTIL.assertRegionOnServer(hri, serverName, 200);
- } finally {
- TEST_UTIL.deleteTable(tableName);
- }
- }
-
- @Test (timeout=60000)
- public void testSSHWhenDisablingTableRegionsInOpeningOrPendingOpenState() throws Exception {
- final TableName table =
- TableName.valueOf
- ("testSSHWhenDisablingTableRegionsInOpeningOrPendingOpenState");
- AssignmentManager am = TEST_UTIL.getHBaseCluster().getMaster().getAssignmentManager();
- HRegionInfo hri = null;
- ServerName serverName = null;
- try {
- hri = createTableAndGetOneRegion(table);
- serverName = am.getRegionStates().getRegionServerOfRegion(hri);
- ServerName destServerName = null;
- HRegionServer destServer = null;
- for (int i = 0; i < 3; i++) {
- destServer = TEST_UTIL.getHBaseCluster().getRegionServer(i);
- if (!destServer.getServerName().equals(serverName)) {
- destServerName = destServer.getServerName();
- break;
- }
- }
- am.regionOffline(hri);
- am.getRegionStates().updateRegionState(hri, RegionState.State.PENDING_OPEN, destServerName);
-
- am.getTableStateManager().setTableState(table, TableState.State.DISABLING);
- List<HRegionInfo> toAssignRegions = am.cleanOutCrashedServerReferences(destServerName);
- assertTrue("Regions to be assigned should be empty.", toAssignRegions.isEmpty());
- assertTrue("Regions to be assigned should be empty.", am.getRegionStates()
- .getRegionState(hri).isOffline());
- } finally {
- if (hri != null && serverName != null) {
- am.regionOnline(hri, serverName);
- }
- am.getTableStateManager().setTableState(table, TableState.State.ENABLED);
- TEST_UTIL.getAdmin().disableTable(table);
- TEST_UTIL.deleteTable(table);
- }
- }
-
- /**
- * This tests region close hanging
- */
- @Test (timeout=60000)
- public void testCloseHang() throws Exception {
- final TableName tableName = TableName.valueOf(name.getMethodName());
- try {
- HTableDescriptor desc = new HTableDescriptor(tableName);
- desc.addFamily(new HColumnDescriptor(FAMILY));
- admin.createTable(desc);
-
- Table meta = TEST_UTIL.getConnection().getTable(TableName.META_TABLE_NAME);
- HRegionInfo hri = new HRegionInfo(
- desc.getTableName(), Bytes.toBytes("A"), Bytes.toBytes("Z"));
- MetaTableAccessor.addRegionToMeta(meta, hri);
-
- HMaster master = TEST_UTIL.getHBaseCluster().getMaster();
- AssignmentManager am = master.getAssignmentManager();
- assertTrue(TEST_UTIL.assignRegion(hri));
- ServerName sn = am.getRegionStates().getRegionServerOfRegion(hri);
- TEST_UTIL.assertRegionOnServer(hri, sn, 6000);
-
- MyRegionObserver.postCloseEnabled.set(true);
- am.unassign(hri);
-
- // Let region closing move ahead. The region should be closed
- // properly and re-assigned automatically
- MyRegionObserver.postCloseEnabled.set(false);
-
- // region may still be assigned now since it's closing,
- // let's check if it's assigned after it's out of transition
- am.waitOnRegionToClearRegionsInTransition(hri);
-
- // region should be closed and re-assigned
- assertTrue(am.waitForAssignment(hri));
- ServerName serverName = master.getAssignmentManager().
- getRegionStates().getRegionServerOfRegion(hri);
- TEST_UTIL.assertRegionOnServer(hri, serverName, 200);
- } finally {
- MyRegionObserver.postCloseEnabled.set(false);
- TEST_UTIL.deleteTable(tableName);
- }
- }
-
- /**
- * This tests region close racing with open
- */
- @Test (timeout=60000)
- public void testOpenCloseRacing() throws Exception {
- final TableName tableName = TableName.valueOf(name.getMethodName());
- try {
- HTableDescriptor desc = new HTableDescriptor(tableName);
- desc.addFamily(new HColumnDescriptor(FAMILY));
- admin.createTable(desc);
-
- Table meta = TEST_UTIL.getConnection().getTable(TableName.META_TABLE_NAME);
- HRegionInfo hri = new HRegionInfo(
- desc.getTableName(), Bytes.toBytes("A"), Bytes.toBytes("Z"));
- MetaTableAccessor.addRegionToMeta(meta, hri);
- meta.close();
-
- MyRegionObserver.postOpenEnabled.set(true);
- MyRegionObserver.postOpenCalled = false;
- HMaster master = TEST_UTIL.getHBaseCluster().getMaster();
- AssignmentManager am = master.getAssignmentManager();
- // Region will be opened, but it won't complete
- am.assign(hri);
- long end = EnvironmentEdgeManager.currentTime() + 20000;
- // Wait till postOpen is called
- while (!MyRegionObserver.postOpenCalled ) {
- assertFalse("Timed out waiting for postOpen to be called",
- EnvironmentEdgeManager.currentTime() > end);
- Thread.sleep(300);
- }
-
- // Now let's unassign it, it should do nothing
- am.unassign(hri);
- RegionState state = am.getRegionStates().getRegionState(hri);
- ServerName oldServerName = state.getServerName();
- assertTrue(state.isOpening() && oldServerName != null);
-
- // Now the region is stuck in opening
- // Let's forcefully re-assign it to trigger closing/opening
- // racing. This test is to make sure this scenario
- // is handled properly.
- MyRegionObserver.postOpenEnabled.set(false);
- ServerName destServerName = null;
- int numRS = TEST_UTIL.getHBaseCluster().getLiveRegionServerThreads().size();
- for (int i = 0; i < numRS; i++) {
- HRegionServer destServer = TEST_UTIL.getHBaseCluster().getRegionServer(i);
- if (!destServer.getServerName().equals(oldServerName)) {
- destServerName = destServer.getServerName();
- break;
- }
- }
- assertNotNull(destServerName);
- assertFalse("Region should be assigned on a new region server",
- oldServerName.equals(destServerName));
- List<HRegionInfo> regions = new ArrayList<>();
- regions.add(hri);
- am.assign(destServerName, regions);
-
- // let's check if it's assigned after it's out of transition
- am.waitOnRegionToClearRegionsInTransition(hri);
- assertTrue(am.waitForAssignment(hri));
-
- ServerName serverName = master.getAssignmentManager().
- getRegionStates().getRegionServerOfRegion(hri);
- TEST_UTIL.assertRegionOnlyOnServer(hri, serverName, 6000);
- } finally {
- MyRegionObserver.postOpenEnabled.set(false);
- TEST_UTIL.deleteTable(tableName);
- }
- }
-
- /**
- * Test force unassign/assign a region hosted on a dead server
- */
- @Test (timeout=60000)
- public void testAssignRacingWithSSH() throws Exception {
- final TableName tableName = TableName.valueOf(name.getMethodName());
- MiniHBaseCluster cluster = TEST_UTIL.getHBaseCluster();
- MyMaster master = null;
- try {
- HTableDescriptor desc = new HTableDescriptor(tableName);
- desc.addFamily(new HColumnDescriptor(FAMILY));
- admin.createTable(desc);
-
- Table meta = TEST_UTIL.getConnection().getTable(TableName.META_TABLE_NAME);
- HRegionInfo hri = new HRegionInfo(
- desc.getTableName(), Bytes.toBytes("A"), Bytes.toBytes("Z"));
- MetaTableAccessor.addRegionToMeta(meta, hri);
-
- // Assign the region
- master = (MyMaster)cluster.getMaster();
- AssignmentManager am = master.getAssignmentManager();
-
- am.assign(hri);
-
- // Hold SSH before killing the hosting server
- master.enableSSH(false);
-
-
- RegionStates regionStates = am.getRegionStates();
- ServerName metaServer = regionStates.getRegionServerOfRegion(
- HRegionInfo.FIRST_META_REGIONINFO);
- while (true) {
- assertTrue(am.waitForAssignment(hri));
- RegionState state = regionStates.getRegionState(hri);
- ServerName oldServerName = state.getServerName();
- if (!ServerName.isSameHostnameAndPort(oldServerName, metaServer)) {
- // Kill the hosting server, which doesn't have meta on it.
- cluster.killRegionServer(oldServerName);
- cluster.waitForRegionServerToStop(oldServerName, -1);
- break;
- }
- int i = cluster.getServerWithMeta();
- HRegionServer rs = cluster.getRegionServer(i == 0 ? 1 : 0);
- oldServerName = rs.getServerName();
- master.move(hri.getEncodedNameAsBytes(),
- Bytes.toBytes(oldServerName.getServerName()));
- }
-
- // You can't assign a dead region before SSH
- am.assign(hri, true);
- RegionState state = regionStates.getRegionState(hri);
- assertTrue(state.isFailedClose());
-
- // You can't unassign a dead region before SSH either
- am.unassign(hri);
- state = regionStates.getRegionState(hri);
- assertTrue(state.isFailedClose());
-
- // Enable SSH so that log can be split
- master.enableSSH(true);
-
- // let's check if it's assigned after it's out of transition.
- // no need to assign it manually, SSH should do it
- am.waitOnRegionToClearRegionsInTransition(hri);
- assertTrue(am.waitForAssignment(hri));
-
- ServerName serverName = master.getAssignmentManager().
- getRegionStates().getRegionServerOfRegion(hri);
- TEST_UTIL.assertRegionOnlyOnServer(hri, serverName, 6000);
- } finally {
- if (master != null) {
- master.enableSSH(true);
- }
- TEST_UTIL.deleteTable(tableName);
- cluster.startRegionServer();
- }
- }
-
- /**
- * Test SSH waiting for extra region server for assignment
- */
- @Test (timeout=300000)
- public void testSSHWaitForServerToAssignRegion() throws Exception {
- final TableName tableName = TableName.valueOf(name.getMethodName());
- MiniHBaseCluster cluster = TEST_UTIL.getHBaseCluster();
- boolean startAServer = false;
- try {
- HTableDescriptor desc = new HTableDescriptor(tableName);
- desc.addFamily(new HColumnDescriptor(FAMILY));
- admin.createTable(desc);
-
- HMaster master = cluster.getMaster();
- final ServerManager serverManager = master.getServerManager();
- MyLoadBalancer.countRegionServers = Integer.valueOf(
- serverManager.countOfRegionServers());
- HRegionServer rs = TEST_UTIL.getRSForFirstRegionInTable(tableName);
- assertNotNull("First region should be assigned", rs);
- final ServerName serverName = rs.getServerName();
- // Wait till SSH tried to assign regions a several times
- int counter = MyLoadBalancer.counter.get() + 5;
- cluster.killRegionServer(serverName);
- startAServer = true;
- cluster.waitForRegionServerToStop(serverName, -1);
- while (counter > MyLoadBalancer.counter.get()) {
- Thread.sleep(1000);
- }
- cluster.startRegionServer();
- startAServer = false;
- // Wait till the dead server is processed by SSH
- TEST_UTIL.waitFor(120000, 1000, new Waiter.Predicate<Exception>() {
- @Override
- public boolean evaluate() throws Exception {
- return serverManager.isServerDead(serverName)
- && !serverManager.areDeadServersInProgress();
- }
- });
- TEST_UTIL.waitUntilNoRegionsInTransition(300000);
-
- rs = TEST_UTIL.getRSForFirstRegionInTable(tableName);
- assertTrue("First region should be re-assigned to a different server",
- rs != null && !serverName.equals(rs.getServerName()));
- } finally {
- MyLoadBalancer.countRegionServers = null;
- TEST_UTIL.deleteTable(tableName);
- if (startAServer) {
- cluster.startRegionServer();
- }
- }
- }
-
- /**
- * Test force unassign/assign a region of a disabled table
- */
- @Test (timeout=60000)
- public void testAssignDisabledRegion() throws Exception {
- final TableName tableName = TableName.valueOf(name.getMethodName());
- MiniHBaseCluster cluster = TEST_UTIL.getHBaseCluster();
- MyMaster master = null;
- try {
- HTableDescriptor desc = new HTableDescriptor(tableName);
- desc.addFamily(new HColumnDescriptor(FAMILY));
- admin.createTable(desc);
-
- Table meta = TEST_UTIL.getConnection().getTable(TableName.META_TABLE_NAME);
- HRegionInfo hri = new HRegionInfo(
- desc.getTableName(), Bytes.toBytes("A"), Bytes.toBytes("Z"));
- MetaTableAccessor.addRegionToMeta(meta, hri);
-
- // Assign the region
- master = (MyMaster)cluster.getMaster();
- AssignmentManager am = master.getAssignmentManager();
- RegionStates regionStates = am.getRegionStates();
- assertTrue(TEST_UTIL.assignRegion(hri));
-
- // Disable the table
- admin.disableTable(tableName);
- assertTrue(regionStates.isRegionOffline(hri));
-
- // You can't assign a disabled region
- am.assign(hri, true);
- assertTrue(regionStates.isRegionOffline(hri));
-
- // You can't unassign a disabled region either
- am.unassign(hri);
- assertTrue(regionStates.isRegionOffline(hri));
- } finally {
- TEST_UTIL.deleteTable(tableName);
- }
- }
-
- /**
- * Test offlined region is assigned by SSH
- */
- @Test (timeout=60000)
- public void testAssignOfflinedRegionBySSH() throws Exception {
- final TableName tableName = TableName.valueOf(name.getMethodName());
- MiniHBaseCluster cluster = TEST_UTIL.getHBaseCluster();
- MyMaster master = null;
- try {
- HTableDescriptor desc = new HTableDescriptor(tableName);
- desc.addFamily(new HColumnDescriptor(FAMILY));
- admin.createTable(desc);
-
- Table meta = TEST_UTIL.getConnection().getTable(TableName.META_TABLE_NAME);
- HRegionInfo hri = new HRegionInfo(
- desc.getTableName(), Bytes.toBytes("A"), Bytes.toBytes("Z"));
- MetaTableAccessor.addRegionToMeta(meta, hri);
-
- // Assign the region
- master = (MyMaster)cluster.getMaster();
- AssignmentManager am = master.getAssignmentManager();
- am.assign(hri);
-
- RegionStates regionStates = am.getRegionStates();
- ServerName metaServer = regionStates.getRegionServerOfRegion(
- HRegionInfo.FIRST_META_REGIONINFO);
- ServerName oldServerName = null;
- while (true) {
- assertTrue(am.waitForAssignment(hri));
- RegionState state = regionStates.getRegionState(hri);
- oldServerName = state.getServerName();
- if (!ServerName.isSameHostnameAndPort(oldServerName, metaServer)) {
- // Mark the hosting server aborted, but don't actually kill it.
- // It doesn't have meta on it.
- MyRegionServer.abortedServer = oldServerName;
- break;
- }
- int i = cluster.getServerWithMeta();
- HRegionServer rs = cluster.getRegionServer(i == 0 ? 1 : 0);
- oldServerName = rs.getServerName();
- master.move(hri.getEncodedNameAsBytes(),
- Bytes.toBytes(oldServerName.getServerName()));
- }
-
- // Make sure the region is assigned on the dead server
- assertTrue(regionStates.isRegionOnline(hri));
- assertEquals(oldServerName, regionStates.getRegionServerOfRegion(hri));
-
- // Kill the hosting server, which doesn't have meta on it.
- cluster.killRegionServer(oldServerName);
- cluster.waitForRegionServerToStop(oldServerName, -1);
-
- ServerManager serverManager = master.getServerManager();
- while (!serverManager.isServerDead(oldServerName)
- || serverManager.getDeadServers().areDeadServersInProgress()) {
- Thread.sleep(100);
- }
-
- // Let's check if it's assigned after it's out of transition.
- // no need to assign it manually, SSH should do it
- am.waitOnRegionToClearRegionsInTransition(hri);
- assertTrue(am.waitForAssignment(hri));
-
- ServerName serverName = master.getAssignmentManager().
- getRegionStates().getRegionServerOfRegion(hri);
- TEST_UTIL.assertRegionOnlyOnServer(hri, serverName, 200);
- } finally {
- MyRegionServer.abortedServer = null;
- TEST_UTIL.deleteTable(tableName);
- cluster.startRegionServer();
- }
- }
-
- /**
- * Test disabled region is ignored by SSH
- */
- @Test (timeout=60000)
- public void testAssignDisabledRegionBySSH() throws Exception {
- final TableName tableName = TableName.valueOf(name.getMethodName());
- MiniHBaseCluster cluster = TEST_UTIL.getHBaseCluster();
- MyMaster master;
- try {
- HTableDescriptor desc = new HTableDescriptor(tableName);
- desc.addFamily(new HColumnDescriptor(FAMILY));
- admin.createTable(desc);
-
- Table meta = TEST_UTIL.getConnection().getTable(TableName.META_TABLE_NAME);
- HRegionInfo hri = new HRegionInfo(
- desc.getTableName(), Bytes.toBytes("A"), Bytes.toBytes("Z"));
- MetaTableAccessor.addRegionToMeta(meta, hri);
-
- // Assign the region
- master = (MyMaster)cluster.getMaster();
- AssignmentManager am = master.getAssignmentManager();
- am.assign(hri);
-
- RegionStates regionStates = am.getRegionStates();
- ServerName metaServer = regionStates.getRegionServerOfRegion(
- HRegionInfo.FIRST_META_REGIONINFO);
- ServerName oldServerName = null;
- while (true) {
- assertTrue(am.waitForAssignment(hri));
- RegionState state = regionStates.getRegionState(hri);
- oldServerName = state.getServerName();
- if (!ServerName.isSameHostnameAndPort(oldServerName, metaServer)) {
- // Mark the hosting server aborted, but don't actually kill it.
- // It doesn't have meta on it.
- MyRegionServer.abortedServer = oldServerName;
- break;
- }
- int i = cluster.getServerWithMeta();
- HRegionServer rs = cluster.getRegionServer(i == 0 ? 1 : 0);
- oldServerName = rs.getServerName();
- master.move(hri.getEncodedNameAsBytes(),
- Bytes.toBytes(oldServerName.getServerName()));
- }
-
- // Make sure the region is assigned on the dead server
- assertTrue(regionStates.isRegionOnline(hri));
- assertEquals(oldServerName, regionStates.getRegionServerOfRegion(hri));
-
- // Disable the table now.
- master.disableTable(hri.getTable(), HConstants.NO_NONCE, HConstants.NO_NONCE);
-
- // Kill the hosting server, which doesn't have meta on it.
- cluster.killRegionServer(oldServerName);
- cluster.waitForRegionServerToStop(oldServerName, -1);
-
- ServerManager serverManager = master.getServerManager();
- while (!serverManager.isServerDead(oldServerName)
- || serverManager.getDeadServers().areDeadServersInProgress()) {
- Thread.sleep(100);
- }
-
- // Wait till no more RIT, the region should be offline.
- TEST_UTIL.waitUntilNoRegionsInTransition(60000);
- assertTrue(regionStates.isRegionOffline(hri));
- } finally {
- MyRegionServer.abortedServer = null;
- TEST_UTIL.deleteTable(tableName);
- cluster.startRegionServer();
- }
- }
-
- /**
- * Test that region state transition call is idempotent
- */
- @Test(timeout = 60000)
- public void testReportRegionStateTransition() throws Exception {
- final TableName tableName = TableName.valueOf(name.getMethodName());
- try {
- MyRegionServer.simulateRetry = true;
- HTableDescriptor desc = new HTableDescriptor(tableName);
- desc.addFamily(new HColumnDescriptor(FAMILY));
- admin.createTable(desc);
- Table meta = TEST_UTIL.getConnection().getTable(TableName.META_TABLE_NAME);
- HRegionInfo hri =
- new HRegionInfo(desc.getTableName(), Bytes.toBytes("A"), Bytes.toBytes("Z"));
- MetaTableAccessor.addRegionToMeta(meta, hri);
- HMaster master = TEST_UTIL.getHBaseCluster().getMaster();
- AssignmentManager am = master.getAssignmentManager();
- TEST_UTIL.assignRegion(hri);
- RegionStates regionStates = am.getRegionStates();
- ServerName serverName = regionStates.getRegionServerOfRegion(hri);
- // Assert the the region is actually open on the server
- TEST_UTIL.assertRegionOnServer(hri, serverName, 200);
- // Closing region should just work fine
- admin.disableTable(tableName);
- assertTrue(regionStates.isRegionOffline(hri));
- List<HRegionInfo> regions = TEST_UTIL.getAdmin().getOnlineRegions(serverName);
- assertTrue(!regions.contains(hri));
- } finally {
- MyRegionServer.simulateRetry = false;
- TEST_UTIL.deleteTable(tableName);
- }
- }
-
- /**
- * Test concurrent updates to meta when meta is not on master
- * @throws Exception
- */
- @Test(timeout = 30000)
- public void testUpdatesRemoteMeta() throws Exception {
- conf.setInt("hbase.regionstatestore.meta.connection", 3);
- final RegionStateStore rss =
- new RegionStateStore(new MyMaster(conf, new ZkCoordinatedStateManager()));
- rss.start();
- // Create 10 threads and make each do 10 puts related to region state update
- Thread[] th = new Thread[10];
- List<String> nameList = new ArrayList<>();
- List<TableName> tableNameList = new ArrayList<>();
- for (int i = 0; i < th.length; i++) {
- th[i] = new Thread() {
- @Override
- public void run() {
- HRegionInfo[] hri = new HRegionInfo[10];
- ServerName serverName = ServerName.valueOf("dummyhost", 1000, 1234);
- for (int i = 0; i < 10; i++) {
- hri[i] = new HRegionInfo(TableName.valueOf(Thread.currentThread().getName() + "_" + i));
- RegionState newState = new RegionState(hri[i], RegionState.State.OPEN, serverName);
- RegionState oldState =
- new RegionState(hri[i], RegionState.State.PENDING_OPEN, serverName);
- rss.updateRegionState(1, newState, oldState);
- }
- }
- };
- th[i].start();
- nameList.add(th[i].getName());
- }
- for (int i = 0; i < th.length; i++) {
- th[i].join();
- }
- // Add all the expected table names in meta to tableNameList
- for (String name : nameList) {
- for (int i = 0; i < 10; i++) {
- tableNameList.add(TableName.valueOf(name + "_" + i));
- }
- }
- List<Result> metaRows = MetaTableAccessor.fullScanRegions(admin.getConnection());
- int count = 0;
- // Check all 100 rows are in meta
- for (Result result : metaRows) {
- if (tableNameList.contains(HRegionInfo.getTable(result.getRow()))) {
- count++;
- if (count == 100) {
- break;
- }
- }
- }
- assertTrue(count == 100);
- rss.stop();
- }
-
- static class MyLoadBalancer extends StochasticLoadBalancer {
- // For this region, if specified, always assign to nowhere
- static volatile HRegionInfo controledRegion = null;
-
- static volatile Integer countRegionServers = null;
- static AtomicInteger counter = new AtomicInteger(0);
-
- @Override
- public ServerName randomAssignment(HRegionInfo regionInfo,
- List<ServerName> servers) throws HBaseIOException {
- if (regionInfo.equals(controledRegion)) {
- return null;
- }
- return super.randomAssignment(regionInfo, servers);
- }
-
- @Override
- public Map<ServerName, List<HRegionInfo>> roundRobinAssignment(
- List<HRegionInfo> regions, List<ServerName> servers) throws HBaseIOException {
- if (countRegionServers != null && services != null) {
- int regionServers = services.getServerManager().countOfRegionServers();
- if (regionServers < countRegionServers.intValue()) {
- // Let's wait till more region servers join in.
- // Before that, fail region assignments.
- counter.incrementAndGet();
- return null;
- }
- }
- if (regions.get(0).equals(controledRegion)) {
- Map<ServerName, List<HRegionInfo>> m = Maps.newHashMap();
- m.put(LoadBalancer.BOGUS_SERVER_NAME, regions);
- return m;
- }
- return super.roundRobinAssignment(regions, servers);
- }
-
- @Override
- public Map<ServerName, List<HRegionInfo>> retainAssignment(
- Map<HRegionInfo, ServerName> regions, List<ServerName> servers) throws HBaseIOException {
- for (HRegionInfo hri : regions.keySet()) {
- if (hri.equals(controledRegion)) {
- Map<ServerName, List<HRegionInfo>> m = Maps.newHashMap();
- m.put(LoadBalancer.BOGUS_SERVER_NAME, Lists.newArrayList(regions.keySet()));
- return m;
- }
- }
- return super.retainAssignment(regions, servers);
- }
- }
-
- public static class MyMaster extends HMaster {
- AtomicBoolean enabled = new AtomicBoolean(true);
-
- public MyMaster(Configuration conf, CoordinatedStateManager cp)
- throws IOException, KeeperException,
- InterruptedException {
- super(conf, cp);
- }
-
- @Override
- public boolean isServerCrashProcessingEnabled() {
- return enabled.get() && super.isServerCrashProcessingEnabled();
- }
-
- public void enableSSH(boolean enabled) {
- this.enabled.set(enabled);
- if (enabled) {
- getServerManager().processQueuedDeadServers();
- }
- }
- }
-
- public static class MyRegionServer extends MiniHBaseClusterRegionServer {
- static volatile ServerName abortedServer = null;
- static volatile boolean simulateRetry = false;
-
- public MyRegionServer(Configuration conf, CoordinatedStateManager cp)
- throws IOException, KeeperException,
- InterruptedException {
- super(conf, cp);
- }
-
- @Override
- public boolean reportRegionStateTransition(TransitionCode code, long openSeqNum,
- HRegionInfo... hris) {
- if (simulateRetry) {
- // Simulate retry by calling the method twice
- super.reportRegionStateTransition(code, openSeqNum, hris);
- return super.reportRegionStateTransition(code, openSeqNum, hris);
- }
- return super.reportRegionStateTransition(code, openSeqNum, hris);
- }
-
- @Override
- public boolean isAborted() {
- return getServerName().equals(abortedServer) || super.isAborted();
- }
- }
-
- public static class MyRegionObserver implements RegionObserver {
- // If enabled, fail all preClose calls
- static AtomicBoolean preCloseEnabled = new AtomicBoolean(false);
-
- // If enabled, stall postClose calls
- static AtomicBoolean postCloseEnabled = new AtomicBoolean(false);
-
- // If enabled, stall postOpen calls
- static AtomicBoolean postOpenEnabled = new AtomicBoolean(false);
-
- // A flag to track if postOpen is called
- static volatile boolean postOpenCalled = false;
-
- @Override
- public void preClose(ObserverContext<RegionCoprocessorEnvironment> c,
- boolean abortRequested) throws IOException {
- if (preCloseEnabled.get()) throw new IOException("fail preClose from coprocessor");
- }
-
- @Override
- public void postClose(ObserverContext<RegionCoprocessorEnvironment> c,
- boolean abortRequested) {
- stallOnFlag(postCloseEnabled);
- }
-
- @Override
- public void postOpen(ObserverContext<RegionCoprocessorEnvironment> c) {
- postOpenCalled = true;
- stallOnFlag(postOpenEnabled);
- }
-
- private void stallOnFlag(final AtomicBoolean flag) {
- try {
- // If enabled, stall
- while (flag.get()) {
- Thread.sleep(1000);
- }
- } catch (InterruptedException ie) {
- Thread.currentThread().interrupt();
- }
- }
- }
-}