You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by li...@apache.org on 2013/07/30 20:18:18 UTC

svn commit: r1508569 - in /hbase/branches/0.89-fb/src/test/java/org/apache/hadoop/hbase/client: TestBlacklistRegionServer.java TestHCM.java

Author: liyin
Date: Tue Jul 30 18:18:18 2013
New Revision: 1508569

URL: http://svn.apache.org/r1508569
Log:
[HBASE-8500] Separates out the test case to make it more reliable

Author: rshroff

Summary:
The test was blacklisting a region server and then verifying whether
the regions were assigned to the blacklisted region servers or not.

Since, each individual test creates a new table, the number of regions were
too many, which might cause timeouts in some scenarios

Test Plan: MR and run the new test locally

Reviewers: manukranthk

Reviewed By: manukranthk

CC: hbase-eng@

Differential Revision: https://phabricator.fb.com/D847030

Blame Revision: ยท

Task ID: 2479067

Added:
    hbase/branches/0.89-fb/src/test/java/org/apache/hadoop/hbase/client/TestBlacklistRegionServer.java
Modified:
    hbase/branches/0.89-fb/src/test/java/org/apache/hadoop/hbase/client/TestHCM.java

Added: hbase/branches/0.89-fb/src/test/java/org/apache/hadoop/hbase/client/TestBlacklistRegionServer.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.89-fb/src/test/java/org/apache/hadoop/hbase/client/TestBlacklistRegionServer.java?rev=1508569&view=auto
==============================================================================
--- hbase/branches/0.89-fb/src/test/java/org/apache/hadoop/hbase/client/TestBlacklistRegionServer.java (added)
+++ hbase/branches/0.89-fb/src/test/java/org/apache/hadoop/hbase/client/TestBlacklistRegionServer.java Tue Jul 30 18:18:18 2013
@@ -0,0 +1,223 @@
+/*
+ * Copyright 2013 The Apache Software Foundation
+ *
+ * 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.client;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.hbase.HBaseTestingUtility;
+import org.apache.hadoop.hbase.HConstants;
+import org.apache.hadoop.hbase.HRegionInfo;
+import org.apache.hadoop.hbase.HServerAddress;
+import org.apache.hadoop.hbase.ipc.HRegionInterface;
+import org.apache.hadoop.hbase.master.AssignmentPlan;
+import org.apache.hadoop.hbase.regionserver.HRegion;
+import org.apache.hadoop.hbase.regionserver.HRegionServer;
+import org.apache.hadoop.hbase.util.Bytes;
+import org.apache.hadoop.hbase.util.JVMClusterUtil;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+
+import static org.junit.Assert.assertTrue;
+
+public class TestBlacklistRegionServer {
+  private static final Log LOG = LogFactory.getLog(TestHCM.class);
+
+  private final static HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();
+  private static final byte[] TABLE_NAME = Bytes.toBytes("test");
+  private static final byte[] FAM_NAM = Bytes.toBytes("f");
+  private static final byte[] ROW = Bytes.toBytes("bbd");
+
+  private static final int REGION_SERVERS = 5;
+
+  @BeforeClass
+  public static void setUpBeforeClass() throws Exception {
+    TEST_UTIL.getConfiguration().setInt("hbase.client.retries.number", 3);
+    TEST_UTIL.getConfiguration().set("hbase.loadbalancer.impl",
+      "org.apache.hadoop.hbase.master.RegionManager$AssignmentLoadBalancer");
+    TEST_UTIL.getConfiguration().setBoolean("hbase.client.record.context", true);
+    TEST_UTIL.startMiniCluster(REGION_SERVERS);
+    TEST_UTIL.getConfiguration().setInt(
+      HConstants.HBASE_REGION_ASSIGNMENT_LOADBALANCER_WAITTIME_MS, 60000);
+  }
+
+  @Test(timeout = 300000)
+  public void testBlacklistRegionServerWithoutTimeout() throws Exception {
+
+    byte[] tableName = Bytes.toBytes("testBlacklistRegionServerWithoutTimeout");
+
+    HTable table = TEST_UTIL.createTable(tableName, FAM_NAM);
+    TEST_UTIL.createMultiRegions(table, FAM_NAM);
+
+    List<JVMClusterUtil.RegionServerThread> servers =
+      TEST_UTIL.getHBaseCluster().getLiveRegionServerThreads();
+
+    // Update to Assignment Plan to balance the region across regionservers
+    // equally
+    AssignmentPlan ap = TEST_UTIL.getHBaseCluster().
+      getMaster().regionPlacement.getNewAssignmentPlan();
+    TEST_UTIL.getHBaseCluster().getMaster().regionPlacement.updateAssignmentPlan(ap);
+
+    // Wait for rebalance to to complete
+    Thread.sleep(60000);
+
+    HRegionServer blacklistedServer = null;
+    int blacklistedServerId = 0;
+
+    // Lets select a server with does not have META/ROOT
+    for (int i = 0; i < servers.size(); i++) {
+      blacklistedServer = servers.get(i).getRegionServer();
+      blacklistedServerId = i;
+      for (HRegion region : blacklistedServer.getOnlineRegions()) {
+        if (region.getRegionInfo().isMetaRegion() ||
+          region.getRegionInfo().isRootRegion() ||
+          region.getRegionNameAsString().contains(",,")) {
+          blacklistedServer = null;
+          break;
+        }
+      }
+      if (blacklistedServer != null) {
+        break;
+      }
+    }
+
+    TEST_UTIL.getHBaseCluster().getMaster().addServerToBlacklist(
+      blacklistedServer.getHServerInfo().getHostnamePort());
+
+    LOG.debug(blacklistedServer.getServerInfo().getHostnamePort() + " blacklisted");
+
+    drainRegionServer(ap, blacklistedServer);
+
+    LOG.debug("No more regions on black listed server " +
+      blacklistedServer.getHServerInfo().getHostnamePort());
+
+    TEST_UTIL.getHBaseCluster().abortRegionServer(
+      (blacklistedServerId + 1) % servers.size());
+
+    Thread.sleep(60000);
+
+    int numberOfNonMetaRegions = 0;
+    for (HRegion r : blacklistedServer.getOnlineRegions()) {
+      LOG.debug("Region opened on " + r.getRegionNameAsString());
+      if (!r.getRegionInfo().isMetaRegion() &&
+        !r.getRegionInfo().isRootRegion()) {
+        numberOfNonMetaRegions++;
+      }
+    }
+
+    assertTrue(numberOfNonMetaRegions == 0);
+
+    LOG.debug("Removing blacklisted Region Server");
+
+    // Now lets remove it from the black list. The load balancer will kick in
+    // and start assigning regions to this region server
+    TEST_UTIL.getHBaseCluster().getMaster().clearBlacklistedServer(
+      blacklistedServer.getHServerInfo().getHostnamePort());
+
+    while (blacklistedServer.getOnlineRegions().size() == 0) {
+      LOG.debug("No regions assigned yet.");
+      Thread.sleep(10000);
+    }
+
+    LOG.debug("Region Server has been atleast assigned " +
+      blacklistedServer.getOnlineRegions().size() +
+      " regions.");
+  }
+  private int drainRegionServer(AssignmentPlan ap,
+                                HRegionServer blacklistedServer) throws IOException, InterruptedException {
+
+    while (true) {
+      Collection<HRegion> regions = blacklistedServer.getOnlineRegions();
+
+      final Set<HRegionInfo> pendingRegionsForServer = TEST_UTIL.getHBaseCluster().getMaster().
+        getRegionManager().getAssignmentManager().
+        getTransientAssignments(blacklistedServer.getServerInfo().getServerAddress());
+
+      // Loop until the server has no regions and there are no more assignments left
+      // for this region server.
+      if (regions.size() == 0 && pendingRegionsForServer ==  null) {
+        break;
+      }
+
+      for (HRegion region : regions) {
+        HRegionInterface destRS =
+          getDestinationServer(ap, blacklistedServer.getHServerInfo().getServerAddress(),
+            region.getRegionInfo());
+        if (destRS == null) {
+          LOG.debug("No preferred server found for " + region.getRegionNameAsString() +
+            ". Skipping");
+        }
+        LOG.debug("Moving region " + region.getRegionNameAsString());
+        try {
+          TEST_UTIL.getHBaseAdmin().moveRegion(
+            region.getRegionInfo().getRegionName(),
+            destRS.getHServerInfo().getHostnamePort());
+        } catch (IOException e) {
+          LOG.info("Cannot move " + region.getRegionNameAsString());
+          continue;
+        }
+
+        while (true) {
+          try {
+            HRegionInfo r = destRS.getRegionInfo(region.getRegionName());
+            if (r != null) {
+              break;
+            }
+          } catch (Exception e) {
+            LOG.info("Waiting for region to come online on destination region server");
+            // region not yet moved; continue
+          }
+          Thread.sleep(500);
+        }
+      }
+      Thread.sleep(1000);
+    }
+
+    return 0;
+  }
+
+  final HRegionInterface getDestinationServer(
+    AssignmentPlan plan, HServerAddress serverAddr,
+    final HRegionInfo region) {
+
+    List<HServerAddress> serversForRegion = plan.getAssignment(region);
+
+    // Get the preferred region server from the Assignment Plan
+    for (HServerAddress server : serversForRegion) {
+      if (!server.equals(serverAddr)) {
+        try {
+          HRegionInterface candidate = TEST_UTIL.getHBaseAdmin().getConnection().getHRegionConnection(server);
+          if (!TEST_UTIL.getHBaseAdmin().getConnection().getHRegionConnection(server).isStopped()) {
+            return candidate;
+          }
+        } catch (IOException e) {
+          // server not online/reachable skip
+        }
+      }
+    }
+
+    // if none found we should return a random server. For now return null
+    return null;
+  }
+}

Modified: hbase/branches/0.89-fb/src/test/java/org/apache/hadoop/hbase/client/TestHCM.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.89-fb/src/test/java/org/apache/hadoop/hbase/client/TestHCM.java?rev=1508569&r1=1508568&r2=1508569&view=diff
==============================================================================
--- hbase/branches/0.89-fb/src/test/java/org/apache/hadoop/hbase/client/TestHCM.java (original)
+++ hbase/branches/0.89-fb/src/test/java/org/apache/hadoop/hbase/client/TestHCM.java Tue Jul 30 18:18:18 2013
@@ -77,89 +77,6 @@ public class TestHCM {
         HConstants.HBASE_REGION_ASSIGNMENT_LOADBALANCER_WAITTIME_MS, 60000);
   }
 
-  @Test
-  public void testBlacklistRegionServerWithoutTimeout() throws Exception {
-
-    byte[] tableName = Bytes.toBytes("testBlacklistRegionServerWithoutTimeout");
-
-    HTable table = TEST_UTIL.createTable(tableName, FAM_NAM);
-    TEST_UTIL.createMultiRegions(table, FAM_NAM);
-
-    List<RegionServerThread> servers =
-        TEST_UTIL.getHBaseCluster().getLiveRegionServerThreads();
-
-    // Update to Assignment Plan to balance the region across regionservers
-    // equally
-    AssignmentPlan ap = TEST_UTIL.getHBaseCluster().
-        getMaster().regionPlacement.getNewAssignmentPlan();
-    TEST_UTIL.getHBaseCluster().getMaster().regionPlacement.updateAssignmentPlan(ap);
-
-    // Wait for rebalance to to complete
-    Thread.sleep(60000);
-
-    HRegionServer blacklistedServer = null;
-    int blacklistedServerId = 0;
-
-    // Lets select a server with does not have META/ROOT
-    for (int i = 0; i < servers.size(); i++) {
-      blacklistedServer = servers.get(i).getRegionServer();
-      blacklistedServerId = i;
-      for (HRegion region : blacklistedServer.getOnlineRegions()) {
-        if (region.getRegionInfo().isMetaRegion() ||
-            region.getRegionInfo().isRootRegion() ||
-            region.getRegionNameAsString().contains(",,")) {
-          blacklistedServer = null;
-          break;
-        }
-      }
-      if (blacklistedServer != null) {
-        break;
-      }
-    }
-
-    TEST_UTIL.getHBaseCluster().getMaster().addServerToBlacklist(
-        blacklistedServer.getHServerInfo().getHostnamePort());
-
-    LOG.debug(blacklistedServer.getServerInfo().getHostnamePort() + " blacklisted");
-
-    drainRegionServer(ap, blacklistedServer);
-
-    LOG.debug("No more regions on black listed server " +
-        blacklistedServer.getHServerInfo().getHostnamePort());
-
-    TEST_UTIL.getHBaseCluster().abortRegionServer(
-        (blacklistedServerId + 1) % servers.size());
-
-    Thread.sleep(60000);
-
-    int numberOfNonMetaRegions = 0;
-    for (HRegion r : blacklistedServer.getOnlineRegions()) {
-      LOG.debug("Region opened on " + r.getRegionNameAsString());
-      if (!r.getRegionInfo().isMetaRegion() &&
-          !r.getRegionInfo().isRootRegion()) {
-        numberOfNonMetaRegions++;
-      }
-    }
-
-    assertTrue(numberOfNonMetaRegions == 0);
-
-    LOG.debug("Removing blacklisted Region Server");
-
-    // Now lets remove it from the black list. The load balancer will kick in
-    // and start assigning regions to this region server
-    TEST_UTIL.getHBaseCluster().getMaster().clearBlacklistedServer(
-        blacklistedServer.getHServerInfo().getHostnamePort());
-
-    while (blacklistedServer.getOnlineRegions().size() == 0) {
-      LOG.debug("No regions assigned yet.");
-      Thread.sleep(10000);
-    }
-
-    LOG.debug("Region Server has been atleast assigned " +
-        blacklistedServer.getOnlineRegions().size() +
-        " regions.");
-  }
-
   /**
    * Simulates a case where the RegionServer throws exception because
    * a put operation failed.
@@ -345,85 +262,6 @@ public class TestHCM {
     }
   }
 
-  
-  private int drainRegionServer(AssignmentPlan ap,
-      HRegionServer blacklistedServer) throws IOException, InterruptedException {
-
-    while (true) {
-      Collection<HRegion> regions = blacklistedServer.getOnlineRegions();
-
-      final Set<HRegionInfo> pendingRegionsForServer = TEST_UTIL.getHBaseCluster().getMaster().
-          getRegionManager().getAssignmentManager().
-          getTransientAssignments(blacklistedServer.getServerInfo().getServerAddress());
-
-      // Loop until the server has no regions and there are no more assignments left
-      // for this region server.
-      if (regions.size() == 0 && pendingRegionsForServer ==  null) {
-        break;
-      }
-
-      for (HRegion region : regions) {
-        HRegionInterface destRS =
-            getDestinationServer(ap, blacklistedServer.getHServerInfo().getServerAddress(),
-            region.getRegionInfo());
-        if (destRS == null) {
-          LOG.debug("No preferred server found for " + region.getRegionNameAsString() +
-              ". Skipping");
-        }
-        LOG.debug("Moving region " + region.getRegionNameAsString());
-        try {
-          TEST_UTIL.getHBaseAdmin().moveRegion(
-              region.getRegionInfo().getRegionName(),
-              destRS.getHServerInfo().getHostnamePort());
-        } catch (IOException e) {
-          LOG.info("Cannot move " + region.getRegionNameAsString());
-          continue;
-        }
-
-        while (true) {
-          try {
-            HRegionInfo r = destRS.getRegionInfo(region.getRegionName());
-            if (r != null) {
-              break;
-            }
-          } catch (Exception e) {
-            LOG.info("Waiting for region to come online on destination region server");
-            // region not yet moved; continue
-          }
-          Thread.sleep(500);
-        }
-      }
-      Thread.sleep(1000);
-    }
-
-    return 0;
-  }
-
- final HRegionInterface getDestinationServer(
-     AssignmentPlan plan, HServerAddress serverAddr,
-     final HRegionInfo region) {
-
-    List<HServerAddress> serversForRegion = plan.getAssignment(region);
-
-    // Get the preferred region server from the Assignment Plan
-    for (HServerAddress server : serversForRegion) {
-      if (!server.equals(serverAddr)) {
-        try {
-          HRegionInterface candidate = TEST_UTIL.getHBaseAdmin().getConnection().getHRegionConnection(server);
-          if (!TEST_UTIL.getHBaseAdmin().getConnection().getHRegionConnection(server).isStopped()) {
-            return candidate;
-          }
-        } catch (IOException e) {
-          // server not online/reachable skip
-        }
-      }
-    }
-
-    // if none found we should return a random server. For now return null
-    return null;
-  }
-
-
   static public class TestHRegion extends HRegion {
     public TestHRegion(Path basedir, HLog log, FileSystem fs,
         Configuration conf, HRegionInfo regionInfo, FlushRequester flushListener) {
@@ -462,7 +300,6 @@ public class TestHCM {
   }
 
   private void verifyFailure(HTable table, Exception e) {
-
     List<OperationContext> context = table.getAndResetOperationContext();
     assertTrue(context.size() != 0);
     for (OperationContext c : context) {