Repository: hbase
Updated Branches:
  refs/heads/branch-1 0be854d45 -> 489380a84


HBASE-12149 TestRegionPlacement is failing undeterministically (Manukranth 
Kolloju)


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/489380a8
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/489380a8
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/489380a8

Branch: refs/heads/branch-1
Commit: 489380a847b8bf2c4304025cb27c365bcc8867c1
Parents: 0be854d
Author: stack <st...@apache.org>
Authored: Thu Oct 2 11:29:44 2014 -0700
Committer: stack <st...@apache.org>
Committed: Thu Oct 2 11:30:30 2014 -0700

----------------------------------------------------------------------
 .../hbase/master/TestRegionPlacement.java       | 136 +------------
 .../hbase/master/TestRegionPlacement2.java      | 196 +++++++++++++++++++
 2 files changed, 200 insertions(+), 132 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/489380a8/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestRegionPlacement.java
----------------------------------------------------------------------
diff --git 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestRegionPlacement.java
 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestRegionPlacement.java
index 2f521b6..8c9ed4c 100644
--- 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestRegionPlacement.java
+++ 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestRegionPlacement.java
@@ -32,13 +32,11 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Random;
-import java.util.Set;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.HBaseIOException;
 import org.apache.hadoop.hbase.HBaseTestingUtility;
 import org.apache.hadoop.hbase.HColumnDescriptor;
 import org.apache.hadoop.hbase.HConstants;
@@ -59,7 +57,6 @@ import 
org.apache.hadoop.hbase.master.balancer.FavoredNodeAssignmentHelper;
 import org.apache.hadoop.hbase.master.balancer.FavoredNodeLoadBalancer;
 import org.apache.hadoop.hbase.master.balancer.FavoredNodesPlan;
 import org.apache.hadoop.hbase.master.balancer.FavoredNodesPlan.Position;
-import org.apache.hadoop.hbase.master.balancer.LoadBalancerFactory;
 import org.apache.hadoop.hbase.regionserver.HRegion;
 import org.apache.hadoop.hbase.regionserver.HRegionServer;
 import org.apache.hadoop.hbase.util.Bytes;
@@ -83,9 +80,6 @@ public class TestRegionPlacement {
   private int REGION_NUM = 10;
   private Map<HRegionInfo, ServerName[]> favoredNodesAssignmentPlan =
       new HashMap<HRegionInfo, ServerName[]>();
-  private final static int PRIMARY = Position.PRIMARY.ordinal();
-  private final static int SECONDARY = Position.SECONDARY.ordinal();
-  private final static int TERTIARY = Position.TERTIARY.ordinal();
 
   @BeforeClass
   public static void setupBeforeClass() throws Exception {
@@ -105,111 +99,6 @@ public class TestRegionPlacement {
   }
 
   @Test
-  public void testFavoredNodesPresentForRoundRobinAssignment() throws 
HBaseIOException {
-    LoadBalancer balancer = 
LoadBalancerFactory.getLoadBalancer(TEST_UTIL.getConfiguration());
-    balancer.setMasterServices(TEST_UTIL.getMiniHBaseCluster().getMaster());
-    List<ServerName> servers = new ArrayList<ServerName>();
-    for (int i = 0; i < SLAVES; i++) {
-      ServerName server = 
TEST_UTIL.getMiniHBaseCluster().getRegionServer(i).getServerName();
-      servers.add(server);
-    }
-    List<HRegionInfo> regions = new ArrayList<HRegionInfo>(1);
-    HRegionInfo region = new HRegionInfo(TableName.valueOf("foobar"));
-    regions.add(region);
-    Map<ServerName,List<HRegionInfo>> assignmentMap = 
balancer.roundRobinAssignment(regions,
-        servers);
-    Set<ServerName> serverBefore = assignmentMap.keySet();
-    List<ServerName> favoredNodesBefore =
-        ((FavoredNodeLoadBalancer)balancer).getFavoredNodes(region);
-    assertTrue(favoredNodesBefore.size() == 3);
-    // the primary RS should be the one that the balancer's assignment returns
-    assertTrue(ServerName.isSameHostnameAndPort(serverBefore.iterator().next(),
-        favoredNodesBefore.get(PRIMARY)));
-    // now remove the primary from the list of available servers
-    List<ServerName> removedServers = removeMatchingServers(serverBefore, 
servers);
-    // call roundRobinAssignment with the modified servers list
-    assignmentMap = balancer.roundRobinAssignment(regions, servers);
-    List<ServerName> favoredNodesAfter =
-        ((FavoredNodeLoadBalancer)balancer).getFavoredNodes(region);
-    assertTrue(favoredNodesAfter.size() == 3);
-    // We don't expect the favored nodes assignments to change in multiple 
calls
-    // to the roundRobinAssignment method in the balancer (relevant for 
AssignmentManager.assign
-    // failures)
-    assertTrue(favoredNodesAfter.containsAll(favoredNodesBefore));
-    Set<ServerName> serverAfter = assignmentMap.keySet();
-    // We expect the new RegionServer assignee to be one of the favored nodes
-    // chosen earlier.
-    assertTrue(ServerName.isSameHostnameAndPort(serverAfter.iterator().next(),
-                 favoredNodesBefore.get(SECONDARY)) ||
-               ServerName.isSameHostnameAndPort(serverAfter.iterator().next(),
-                 favoredNodesBefore.get(TERTIARY)));
-
-    // put back the primary in the list of available servers
-    servers.addAll(removedServers);
-    // now roundRobinAssignment with the modified servers list should return 
the primary
-    // as the regionserver assignee
-    assignmentMap = balancer.roundRobinAssignment(regions, servers);
-    Set<ServerName> serverWithPrimary = assignmentMap.keySet();
-    assertTrue(serverBefore.containsAll(serverWithPrimary));
-
-    // Make all the favored nodes unavailable for assignment
-    removeMatchingServers(favoredNodesAfter, servers);
-    // call roundRobinAssignment with the modified servers list
-    assignmentMap = balancer.roundRobinAssignment(regions, servers);
-    List<ServerName> favoredNodesNow =
-        ((FavoredNodeLoadBalancer)balancer).getFavoredNodes(region);
-    assertTrue(favoredNodesNow.size() == 3);
-    assertTrue(!favoredNodesNow.contains(favoredNodesAfter.get(PRIMARY)) &&
-        !favoredNodesNow.contains(favoredNodesAfter.get(SECONDARY)) &&
-        !favoredNodesNow.contains(favoredNodesAfter.get(TERTIARY)));
-  }
-
-  @Test
-  public void testFavoredNodesPresentForRandomAssignment() throws 
HBaseIOException {
-    LoadBalancer balancer = 
LoadBalancerFactory.getLoadBalancer(TEST_UTIL.getConfiguration());
-    balancer.setMasterServices(TEST_UTIL.getMiniHBaseCluster().getMaster());
-    List<ServerName> servers = new ArrayList<ServerName>();
-    for (int i = 0; i < SLAVES; i++) {
-      ServerName server = 
TEST_UTIL.getMiniHBaseCluster().getRegionServer(i).getServerName();
-      servers.add(server);
-    }
-    List<HRegionInfo> regions = new ArrayList<HRegionInfo>(1);
-    HRegionInfo region = new HRegionInfo(TableName.valueOf("foobar"));
-    regions.add(region);
-    ServerName serverBefore = balancer.randomAssignment(region, servers);
-    List<ServerName> favoredNodesBefore =
-        ((FavoredNodeLoadBalancer)balancer).getFavoredNodes(region);
-    assertTrue(favoredNodesBefore.size() == 3);
-    // the primary RS should be the one that the balancer's assignment returns
-    
assertTrue(ServerName.isSameHostnameAndPort(serverBefore,favoredNodesBefore.get(PRIMARY)));
-    // now remove the primary from the list of servers
-    removeMatchingServers(serverBefore, servers);
-    // call randomAssignment with the modified servers list
-    ServerName serverAfter = balancer.randomAssignment(region, servers);
-    List<ServerName> favoredNodesAfter =
-        ((FavoredNodeLoadBalancer)balancer).getFavoredNodes(region);
-    assertTrue(favoredNodesAfter.size() == 3);
-    // We don't expect the favored nodes assignments to change in multiple 
calls
-    // to the randomAssignment method in the balancer (relevant for 
AssignmentManager.assign
-    // failures)
-    assertTrue(favoredNodesAfter.containsAll(favoredNodesBefore));
-    // We expect the new RegionServer assignee to be one of the favored nodes
-    // chosen earlier.
-    assertTrue(ServerName.isSameHostnameAndPort(serverAfter, 
favoredNodesBefore.get(SECONDARY)) ||
-               ServerName.isSameHostnameAndPort(serverAfter, 
favoredNodesBefore.get(TERTIARY)));
-    // Make all the favored nodes unavailable for assignment
-    removeMatchingServers(favoredNodesAfter, servers);
-    // call randomAssignment with the modified servers list
-    balancer.randomAssignment(region, servers);
-    List<ServerName> favoredNodesNow =
-        ((FavoredNodeLoadBalancer)balancer).getFavoredNodes(region);
-    assertTrue(favoredNodesNow.size() == 3);
-    assertTrue(!favoredNodesNow.contains(favoredNodesAfter.get(PRIMARY)) &&
-        !favoredNodesNow.contains(favoredNodesAfter.get(SECONDARY)) &&
-        !favoredNodesNow.contains(favoredNodesAfter.get(TERTIARY)));
-  }
-
-  @Test
   public void testRegionPlacement() throws Exception {
     String tableStr = "testRegionAssignment";
     TableName table = TableName.valueOf(tableStr);
@@ -501,27 +390,6 @@ public class TestRegionPlacement {
           regionMovement, expected);
   }
 
-  private List<ServerName> removeMatchingServers(ServerName 
serverWithoutStartCode,
-      List<ServerName> servers) {
-    List<ServerName> serversToRemove = new ArrayList<ServerName>();
-    for (ServerName s : servers) {
-      if (ServerName.isSameHostnameAndPort(s, serverWithoutStartCode)) {
-        serversToRemove.add(s);
-      }
-    }
-    servers.removeAll(serversToRemove);
-    return serversToRemove;
-  }
-
-  private List<ServerName> removeMatchingServers(Collection<ServerName> 
serversWithoutStartCode,
-      List<ServerName> servers) {
-    List<ServerName> serversToRemove = new ArrayList<ServerName>();
-    for (ServerName s : serversWithoutStartCode) {
-      serversToRemove.addAll(removeMatchingServers(s, servers));
-    }
-    return serversToRemove;
-  }
-
   /**
    * Verify the number of user regions is assigned to the primary
    * region server based on the plan is expected
@@ -601,6 +469,7 @@ public class TestRegionPlacement {
     MetaScannerVisitor visitor = new MetaScannerVisitor() {
       public boolean processRow(Result result) throws IOException {
         try {
+          @SuppressWarnings("deprecation")
           HRegionInfo info = MetaScanner.getHRegionInfo(result);
           if(info.getTable().getNamespaceAsString()
               .equals(NamespaceDescriptor.SYSTEM_NAMESPACE_NAME_STR)) {
@@ -680,9 +549,12 @@ public class TestRegionPlacement {
     desc.addFamily(new HColumnDescriptor(HConstants.CATALOG_FAMILY));
     admin.createTable(desc, splitKeys);
 
+    @SuppressWarnings("deprecation")
     HTable ht = new HTable(TEST_UTIL.getConfiguration(), tableName);
+    @SuppressWarnings("deprecation")
     Map<HRegionInfo, ServerName> regions = ht.getRegionLocations();
     assertEquals("Tried to create " + expectedRegions + " regions "
         + "but only found " + regions.size(), expectedRegions, regions.size());
+    ht.close();
   }
 }

http://git-wip-us.apache.org/repos/asf/hbase/blob/489380a8/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestRegionPlacement2.java
----------------------------------------------------------------------
diff --git 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestRegionPlacement2.java
 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestRegionPlacement2.java
new file mode 100644
index 0000000..3f34bc4
--- /dev/null
+++ 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestRegionPlacement2.java
@@ -0,0 +1,196 @@
+/**
+ * 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.*;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.hbase.HBaseIOException;
+import org.apache.hadoop.hbase.HBaseTestingUtility;
+import org.apache.hadoop.hbase.HConstants;
+import org.apache.hadoop.hbase.HRegionInfo;
+import org.apache.hadoop.hbase.ServerName;
+import org.apache.hadoop.hbase.TableName;
+import org.apache.hadoop.hbase.master.balancer.FavoredNodeLoadBalancer;
+import org.apache.hadoop.hbase.master.balancer.LoadBalancerFactory;
+import org.apache.hadoop.hbase.master.balancer.FavoredNodesPlan.Position;
+import org.apache.hadoop.hbase.testclassification.MasterTests;
+import org.apache.hadoop.hbase.testclassification.MediumTests;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+@Category({MasterTests.class, MediumTests.class})
+public class TestRegionPlacement2 {
+  final static Log LOG = LogFactory.getLog(TestRegionPlacement2.class);
+  private final static HBaseTestingUtility TEST_UTIL = new 
HBaseTestingUtility();
+  private final static int SLAVES = 7;
+  private final static int PRIMARY = Position.PRIMARY.ordinal();
+  private final static int SECONDARY = Position.SECONDARY.ordinal();
+  private final static int TERTIARY = Position.TERTIARY.ordinal();
+
+  @BeforeClass
+  public static void setupBeforeClass() throws Exception {
+    Configuration conf = TEST_UTIL.getConfiguration();
+    // Enable the favored nodes based load balancer
+    conf.setClass(HConstants.HBASE_MASTER_LOADBALANCER_CLASS,
+        FavoredNodeLoadBalancer.class, LoadBalancer.class);
+    conf.setBoolean("hbase.tests.use.shortcircuit.reads", false);
+    TEST_UTIL.startMiniCluster(SLAVES);
+  }
+
+  @AfterClass
+  public static void tearDownAfterClass() throws Exception {
+    TEST_UTIL.shutdownMiniCluster();
+  }
+
+  @Test
+  public void testFavoredNodesPresentForRoundRobinAssignment() throws 
HBaseIOException {
+    LoadBalancer balancer = 
LoadBalancerFactory.getLoadBalancer(TEST_UTIL.getConfiguration());
+    balancer.setMasterServices(TEST_UTIL.getMiniHBaseCluster().getMaster());
+    List<ServerName> servers = new ArrayList<ServerName>();
+    for (int i = 0; i < SLAVES; i++) {
+      ServerName server = 
TEST_UTIL.getMiniHBaseCluster().getRegionServer(i).getServerName();
+      servers.add(server);
+    }
+    List<HRegionInfo> regions = new ArrayList<HRegionInfo>(1);
+    HRegionInfo region = new HRegionInfo(TableName.valueOf("foobar"));
+    regions.add(region);
+    Map<ServerName,List<HRegionInfo>> assignmentMap = 
balancer.roundRobinAssignment(regions,
+        servers);
+    Set<ServerName> serverBefore = assignmentMap.keySet();
+    List<ServerName> favoredNodesBefore =
+        ((FavoredNodeLoadBalancer)balancer).getFavoredNodes(region);
+    assertTrue(favoredNodesBefore.size() == 3);
+    // the primary RS should be the one that the balancer's assignment returns
+    assertTrue(ServerName.isSameHostnameAndPort(serverBefore.iterator().next(),
+        favoredNodesBefore.get(PRIMARY)));
+    // now remove the primary from the list of available servers
+    List<ServerName> removedServers = removeMatchingServers(serverBefore, 
servers);
+    // call roundRobinAssignment with the modified servers list
+    assignmentMap = balancer.roundRobinAssignment(regions, servers);
+    List<ServerName> favoredNodesAfter =
+        ((FavoredNodeLoadBalancer)balancer).getFavoredNodes(region);
+    assertTrue(favoredNodesAfter.size() == 3);
+    // We don't expect the favored nodes assignments to change in multiple 
calls
+    // to the roundRobinAssignment method in the balancer (relevant for 
AssignmentManager.assign
+    // failures)
+    assertTrue(favoredNodesAfter.containsAll(favoredNodesBefore));
+    Set<ServerName> serverAfter = assignmentMap.keySet();
+    // We expect the new RegionServer assignee to be one of the favored nodes
+    // chosen earlier.
+    assertTrue(ServerName.isSameHostnameAndPort(serverAfter.iterator().next(),
+                 favoredNodesBefore.get(SECONDARY)) ||
+               ServerName.isSameHostnameAndPort(serverAfter.iterator().next(),
+                 favoredNodesBefore.get(TERTIARY)));
+
+    // put back the primary in the list of available servers
+    servers.addAll(removedServers);
+    // now roundRobinAssignment with the modified servers list should return 
the primary
+    // as the regionserver assignee
+    assignmentMap = balancer.roundRobinAssignment(regions, servers);
+    Set<ServerName> serverWithPrimary = assignmentMap.keySet();
+    assertTrue(serverBefore.containsAll(serverWithPrimary));
+
+    // Make all the favored nodes unavailable for assignment
+    removeMatchingServers(favoredNodesAfter, servers);
+    // call roundRobinAssignment with the modified servers list
+    assignmentMap = balancer.roundRobinAssignment(regions, servers);
+    List<ServerName> favoredNodesNow =
+        ((FavoredNodeLoadBalancer)balancer).getFavoredNodes(region);
+    assertTrue(favoredNodesNow.size() == 3);
+    assertTrue(!favoredNodesNow.contains(favoredNodesAfter.get(PRIMARY)) &&
+        !favoredNodesNow.contains(favoredNodesAfter.get(SECONDARY)) &&
+        !favoredNodesNow.contains(favoredNodesAfter.get(TERTIARY)));
+  }
+
+  @Test
+  public void testFavoredNodesPresentForRandomAssignment() throws 
HBaseIOException {
+    LoadBalancer balancer = 
LoadBalancerFactory.getLoadBalancer(TEST_UTIL.getConfiguration());
+    balancer.setMasterServices(TEST_UTIL.getMiniHBaseCluster().getMaster());
+    List<ServerName> servers = new ArrayList<ServerName>();
+    for (int i = 0; i < SLAVES; i++) {
+      ServerName server = 
TEST_UTIL.getMiniHBaseCluster().getRegionServer(i).getServerName();
+      servers.add(server);
+    }
+    List<HRegionInfo> regions = new ArrayList<HRegionInfo>(1);
+    HRegionInfo region = new HRegionInfo(TableName.valueOf("foobar"));
+    regions.add(region);
+    ServerName serverBefore = balancer.randomAssignment(region, servers);
+    List<ServerName> favoredNodesBefore =
+        ((FavoredNodeLoadBalancer)balancer).getFavoredNodes(region);
+    assertTrue(favoredNodesBefore.size() == 3);
+    // the primary RS should be the one that the balancer's assignment returns
+    
assertTrue(ServerName.isSameHostnameAndPort(serverBefore,favoredNodesBefore.get(PRIMARY)));
+    // now remove the primary from the list of servers
+    removeMatchingServers(serverBefore, servers);
+    // call randomAssignment with the modified servers list
+    ServerName serverAfter = balancer.randomAssignment(region, servers);
+    List<ServerName> favoredNodesAfter =
+        ((FavoredNodeLoadBalancer)balancer).getFavoredNodes(region);
+    assertTrue(favoredNodesAfter.size() == 3);
+    // We don't expect the favored nodes assignments to change in multiple 
calls
+    // to the randomAssignment method in the balancer (relevant for 
AssignmentManager.assign
+    // failures)
+    assertTrue(favoredNodesAfter.containsAll(favoredNodesBefore));
+    // We expect the new RegionServer assignee to be one of the favored nodes
+    // chosen earlier.
+    assertTrue(ServerName.isSameHostnameAndPort(serverAfter, 
favoredNodesBefore.get(SECONDARY)) ||
+               ServerName.isSameHostnameAndPort(serverAfter, 
favoredNodesBefore.get(TERTIARY)));
+    // Make all the favored nodes unavailable for assignment
+    removeMatchingServers(favoredNodesAfter, servers);
+    // call randomAssignment with the modified servers list
+    balancer.randomAssignment(region, servers);
+    List<ServerName> favoredNodesNow =
+        ((FavoredNodeLoadBalancer)balancer).getFavoredNodes(region);
+    assertTrue(favoredNodesNow.size() == 3);
+    assertTrue(!favoredNodesNow.contains(favoredNodesAfter.get(PRIMARY)) &&
+        !favoredNodesNow.contains(favoredNodesAfter.get(SECONDARY)) &&
+        !favoredNodesNow.contains(favoredNodesAfter.get(TERTIARY)));
+  }
+
+  private List<ServerName> removeMatchingServers(Collection<ServerName> 
serversWithoutStartCode,
+      List<ServerName> servers) {
+    List<ServerName> serversToRemove = new ArrayList<ServerName>();
+    for (ServerName s : serversWithoutStartCode) {
+      serversToRemove.addAll(removeMatchingServers(s, servers));
+    }
+    return serversToRemove;
+  }
+
+  private List<ServerName> removeMatchingServers(ServerName 
serverWithoutStartCode,
+      List<ServerName> servers) {
+    List<ServerName> serversToRemove = new ArrayList<ServerName>();
+    for (ServerName s : servers) {
+      if (ServerName.isSameHostnameAndPort(s, serverWithoutStartCode)) {
+        serversToRemove.add(s);
+      }
+    }
+    servers.removeAll(serversToRemove);
+    return serversToRemove;
+  }
+}

Reply via email to