Repository: accumulo
Updated Branches:
  refs/heads/ACCUMULO-4173 796cbcf7f -> 47679074f


Addressed some comments about using the same comparator as the current set of 
tservers and allowing multiple pools per host


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

Branch: refs/heads/ACCUMULO-4173
Commit: 47679074f1ef784708d1aab86f292c64dcd99178
Parents: 796cbcf
Author: Dave Marion <dlmar...@apache.org>
Authored: Wed Mar 30 14:06:43 2016 -0400
Committer: Dave Marion <dlmar...@apache.org>
Committed: Wed Mar 30 14:06:43 2016 -0400

----------------------------------------------------------------------
 .../balancer/HostRegexTableLoadBalancer.java    | 78 ++++++++------------
 .../HostRegexTableLoadBalancerTest.java         | 40 ++++++----
 2 files changed, 54 insertions(+), 64 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/accumulo/blob/47679074/server/base/src/main/java/org/apache/accumulo/server/master/balancer/HostRegexTableLoadBalancer.java
----------------------------------------------------------------------
diff --git 
a/server/base/src/main/java/org/apache/accumulo/server/master/balancer/HostRegexTableLoadBalancer.java
 
b/server/base/src/main/java/org/apache/accumulo/server/master/balancer/HostRegexTableLoadBalancer.java
index 8e28132..74154a5 100644
--- 
a/server/base/src/main/java/org/apache/accumulo/server/master/balancer/HostRegexTableLoadBalancer.java
+++ 
b/server/base/src/main/java/org/apache/accumulo/server/master/balancer/HostRegexTableLoadBalancer.java
@@ -91,32 +91,12 @@ public class HostRegexTableLoadBalancer extends 
TableLoadBalancer {
     if ((System.currentTimeMillis() - lastPoolRecheck) > poolRecheckMillis) {
       Map<String,SortedMap<TServerInstance,TabletServerStatus>> newPools = new 
HashMap<String,SortedMap<TServerInstance,TabletServerStatus>>();
       for (Entry<TServerInstance,TabletServerStatus> e : current.entrySet()) {
-        String tableName = getPoolNameForHost(e.getKey().host());
-        if (!newPools.containsKey(tableName)) {
-          newPools.put(tableName, new 
TreeMap<TServerInstance,TabletServerStatus>());
-        }
-        newPools.get(tableName).put(e.getKey(), e.getValue());
-      }
-      // Ensure that no host is in more than one pool
-      // TODO: I'm not sure that I need to check for disjoint as the call to 
getPoolNameForHost checks for more than one match
-      boolean error = false;
-      for (SortedMap<TServerInstance,TabletServerStatus> s1 : 
newPools.values()) {
-        for (SortedMap<TServerInstance,TabletServerStatus> s2 : 
newPools.values()) {
-          if (s1 == s2) {
-            continue;
-          }
-          if (!Collections.disjoint(s1.keySet(), s2.keySet())) {
-            LOG.error("Pools are not disjoint: {}, there is a problem with 
your regular expressions. Putting all servers in default pool", newPools);
-            error = true;
+        List<String> poolNames = getPoolNamesForHost(e.getKey().host());
+        for (String pool : poolNames) {
+          if (!newPools.containsKey(pool)) {
+            newPools.put(pool, new 
TreeMap<TServerInstance,TabletServerStatus>(current.comparator()));
           }
-        }
-      }
-      if (error) {
-        // Put all servers into the default pool
-        newPools.clear();
-        newPools.put(DEFAULT_POOL, new 
TreeMap<TServerInstance,TabletServerStatus>());
-        for (Entry<TServerInstance,TabletServerStatus> e : current.entrySet()) 
{
-          newPools.get(DEFAULT_POOL).put(e.getKey(), e.getValue());
+          newPools.get(pool).put(e.getKey(), e.getValue());
         }
       }
       pools = newPools;
@@ -126,33 +106,32 @@ public class HostRegexTableLoadBalancer extends 
TableLoadBalancer {
   }
 
   /**
-   * Matches host against the regexes and returns the matching pool name
+   * Matches host against the regexes and returns the matching pool names
    *
    * @param host
    *          tablet server host
-   * @return name of pool. will return default pool if host matches more than 
one regex
+   * @return pool names, will return default pool if host matches more no regex
    */
-  protected String getPoolNameForHost(String host) {
+  protected List<String> getPoolNamesForHost(String host) {
     String test = host;
-    String table = DEFAULT_POOL;
     if (!isIpBasedRegex) {
       try {
         test = getNameFromIp(host);
       } catch (UnknownHostException e1) {
         LOG.error("Unable to determine host name for IP: " + host + ", setting 
to default pool", e1);
-        return table;
+        return Collections.singletonList(DEFAULT_POOL);
       }
     }
+    List<String> pools = new ArrayList<>();
     for (Entry<String,Pattern> e : poolNameToRegexPattern.entrySet()) {
       if (e.getValue().matcher(test).matches()) {
-        if (!table.equals(DEFAULT_POOL)) {
-          LOG.warn("host {} matches more than one regex, assigning to default 
pool", host);
-          return DEFAULT_POOL;
-        }
-        table = e.getKey();
+        pools.add(e.getKey());
       }
     }
-    return table;
+    if (pools.size() == 0) {
+      pools.add(DEFAULT_POOL);
+    }
+    return pools;
   }
 
   protected String getNameFromIp(String hostIp) throws UnknownHostException {
@@ -240,20 +219,21 @@ public class HostRegexTableLoadBalancer extends 
TableLoadBalancer {
     if ((System.currentTimeMillis() - this.lastOOBCheck) > 
this.oobCheckMillis) {
       // Check to see if a tablet is assigned outside the bounds of the pool. 
If so, migrate it.
       for (Entry<TServerInstance,TabletServerStatus> e : current.entrySet()) {
-        String assignedPool = getPoolNameForHost(e.getKey().host());
-        for (String pool : poolNameToRegexPattern.keySet()) {
-          if (assignedPool.equals(pool) || pool.equals(DEFAULT_POOL)) {
-            continue;
-          }
-          String tid = getTableOperations().tableIdMap().get(pool);
-          try {
-            List<TabletStats> outOfBoundsTablets = 
getOnlineTabletsForTable(e.getKey(), tid);
-            for (TabletStats ts : outOfBoundsTablets) {
-              LOG.info("Tablet {} is currently outside the bounds of the 
regex, reassigning", ts.toString());
-              unassigned.put(new KeyExtent(ts.getExtent()), e.getKey());
+        for (String assignedPool : getPoolNamesForHost(e.getKey().host())) {
+          for (String pool : poolNameToRegexPattern.keySet()) {
+            if (assignedPool.equals(pool) || pool.equals(DEFAULT_POOL)) {
+              continue;
+            }
+            String tid = getTableOperations().tableIdMap().get(pool);
+            try {
+              List<TabletStats> outOfBoundsTablets = 
getOnlineTabletsForTable(e.getKey(), tid);
+              for (TabletStats ts : outOfBoundsTablets) {
+                LOG.info("Tablet {} is currently outside the bounds of the 
regex, reassigning", ts.toString());
+                unassigned.put(new KeyExtent(ts.getExtent()), e.getKey());
+              }
+            } catch (TException e1) {
+              LOG.error("Error in OOB check getting tablets for table {} from 
server {}", tid, e.getKey().host(), e);
             }
-          } catch (TException e1) {
-            LOG.error("Error in OOB check getting tablets for table {} from 
server {}", tid, e.getKey().host(), e);
           }
         }
       }

http://git-wip-us.apache.org/repos/asf/accumulo/blob/47679074/server/base/src/test/java/org/apache/accumulo/server/master/balancer/HostRegexTableLoadBalancerTest.java
----------------------------------------------------------------------
diff --git 
a/server/base/src/test/java/org/apache/accumulo/server/master/balancer/HostRegexTableLoadBalancerTest.java
 
b/server/base/src/test/java/org/apache/accumulo/server/master/balancer/HostRegexTableLoadBalancerTest.java
index e14b511..c33752a 100644
--- 
a/server/base/src/test/java/org/apache/accumulo/server/master/balancer/HostRegexTableLoadBalancerTest.java
+++ 
b/server/base/src/test/java/org/apache/accumulo/server/master/balancer/HostRegexTableLoadBalancerTest.java
@@ -344,7 +344,7 @@ public class HostRegexTableLoadBalancerTest extends 
HostRegexTableLoadBalancer {
   }
 
   @Test
-  public void testSplitCurrentByRegexUsingHostnameMatchesTooMany() {
+  public void testSplitCurrentByRegexUsingOverlappingPools() {
     init((ServerConfiguration) new TestServerConfigurationFactory(instance) {
       @Override
       public TableConfiguration getTableConfiguration(String tableId) {
@@ -375,25 +375,35 @@ public class HostRegexTableLoadBalancerTest extends 
HostRegexTableLoadBalancer {
     Assert.assertEquals(2, groups.size());
     Assert.assertTrue(groups.containsKey(FOO.getTableName()));
     SortedMap<TServerInstance,TabletServerStatus> fooHosts = 
groups.get(FOO.getTableName());
-    Assert.assertEquals(5, fooHosts.size());
+    Assert.assertEquals(15, fooHosts.size());
+    Assert.assertTrue(fooHosts.containsKey(new 
TServerInstance("192.168.0.1:9997", 1)));
+    Assert.assertTrue(fooHosts.containsKey(new 
TServerInstance("192.168.0.2:9997", 1)));
+    Assert.assertTrue(fooHosts.containsKey(new 
TServerInstance("192.168.0.3:9997", 1)));
+    Assert.assertTrue(fooHosts.containsKey(new 
TServerInstance("192.168.0.4:9997", 1)));
+    Assert.assertTrue(fooHosts.containsKey(new 
TServerInstance("192.168.0.5:9997", 1)));
+    Assert.assertTrue(fooHosts.containsKey(new 
TServerInstance("192.168.0.6:9997", 1)));
+    Assert.assertTrue(fooHosts.containsKey(new 
TServerInstance("192.168.0.7:9997", 1)));
+    Assert.assertTrue(fooHosts.containsKey(new 
TServerInstance("192.168.0.8:9997", 1)));
+    Assert.assertTrue(fooHosts.containsKey(new 
TServerInstance("192.168.0.9:9997", 1)));
+    Assert.assertTrue(fooHosts.containsKey(new 
TServerInstance("192.168.0.10:9997", 1)));
     Assert.assertTrue(fooHosts.containsKey(new 
TServerInstance("192.168.0.11:9997", 1)));
     Assert.assertTrue(fooHosts.containsKey(new 
TServerInstance("192.168.0.12:9997", 1)));
     Assert.assertTrue(fooHosts.containsKey(new 
TServerInstance("192.168.0.13:9997", 1)));
     Assert.assertTrue(fooHosts.containsKey(new 
TServerInstance("192.168.0.14:9997", 1)));
     Assert.assertTrue(fooHosts.containsKey(new 
TServerInstance("192.168.0.15:9997", 1)));
-    Assert.assertTrue(groups.containsKey(DEFAULT_POOL));
-    SortedMap<TServerInstance,TabletServerStatus> defHosts = 
groups.get(DEFAULT_POOL);
-    Assert.assertEquals(10, defHosts.size());
-    Assert.assertTrue(defHosts.containsKey(new 
TServerInstance("192.168.0.1:9997", 1)));
-    Assert.assertTrue(defHosts.containsKey(new 
TServerInstance("192.168.0.2:9997", 1)));
-    Assert.assertTrue(defHosts.containsKey(new 
TServerInstance("192.168.0.3:9997", 1)));
-    Assert.assertTrue(defHosts.containsKey(new 
TServerInstance("192.168.0.4:9997", 1)));
-    Assert.assertTrue(defHosts.containsKey(new 
TServerInstance("192.168.0.5:9997", 1)));
-    Assert.assertTrue(defHosts.containsKey(new 
TServerInstance("192.168.0.6:9997", 1)));
-    Assert.assertTrue(defHosts.containsKey(new 
TServerInstance("192.168.0.7:9997", 1)));
-    Assert.assertTrue(defHosts.containsKey(new 
TServerInstance("192.168.0.8:9997", 1)));
-    Assert.assertTrue(defHosts.containsKey(new 
TServerInstance("192.168.0.9:9997", 1)));
-    Assert.assertTrue(defHosts.containsKey(new 
TServerInstance("192.168.0.10:9997", 1)));
+    Assert.assertTrue(groups.containsKey(BAR.getTableName()));
+    SortedMap<TServerInstance,TabletServerStatus> barHosts = 
groups.get(BAR.getTableName());
+    Assert.assertEquals(10, barHosts.size());
+    Assert.assertTrue(barHosts.containsKey(new 
TServerInstance("192.168.0.1:9997", 1)));
+    Assert.assertTrue(barHosts.containsKey(new 
TServerInstance("192.168.0.2:9997", 1)));
+    Assert.assertTrue(barHosts.containsKey(new 
TServerInstance("192.168.0.3:9997", 1)));
+    Assert.assertTrue(barHosts.containsKey(new 
TServerInstance("192.168.0.4:9997", 1)));
+    Assert.assertTrue(barHosts.containsKey(new 
TServerInstance("192.168.0.5:9997", 1)));
+    Assert.assertTrue(barHosts.containsKey(new 
TServerInstance("192.168.0.6:9997", 1)));
+    Assert.assertTrue(barHosts.containsKey(new 
TServerInstance("192.168.0.7:9997", 1)));
+    Assert.assertTrue(barHosts.containsKey(new 
TServerInstance("192.168.0.8:9997", 1)));
+    Assert.assertTrue(barHosts.containsKey(new 
TServerInstance("192.168.0.9:9997", 1)));
+    Assert.assertTrue(barHosts.containsKey(new 
TServerInstance("192.168.0.10:9997", 1)));
   }
 
   @Test

Reply via email to