Package org.apache.hadoop.hbase.index

Source Code of org.apache.hadoop.hbase.index.TestSecIndexLoadBalancer

/**
* Copyright 2011 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.index;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseTestingUtility;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HRegionInfo;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.LargeTests;
import org.apache.hadoop.hbase.MiniHBaseCluster;
import org.apache.hadoop.hbase.ServerName;
import org.apache.hadoop.hbase.catalog.MetaReader;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.coprocessor.CoprocessorHost;
import org.apache.hadoop.hbase.index.ColumnQualifier.ValueType;
import org.apache.hadoop.hbase.index.coprocessor.master.IndexMasterObserver;
import org.apache.hadoop.hbase.index.coprocessor.regionserver.IndexRegionObserver;
import org.apache.hadoop.hbase.index.coprocessor.wal.IndexWALObserver;
import org.apache.hadoop.hbase.master.HMaster;
import org.apache.hadoop.hbase.regionserver.HRegionServer;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.hbase.util.Pair;
import org.apache.hadoop.hbase.zookeeper.ZKAssign;
import org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.experimental.categories.Category;

@Category(LargeTests.class)
public class TestSecIndexLoadBalancer {

  private static HBaseTestingUtility UTIL = new HBaseTestingUtility();

  @BeforeClass
  public static void setupBeforeClass() throws Exception {
    final int NUM_MASTERS = 1;
    final int NUM_RS = 4;
    Configuration conf = UTIL.getConfiguration();
    conf.set(CoprocessorHost.MASTER_COPROCESSOR_CONF_KEY, IndexMasterObserver.class.getName());
    conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY, IndexRegionObserver.class.getName());
    conf.set(CoprocessorHost.WAL_COPROCESSOR_CONF_KEY, IndexWALObserver.class.getName());
    conf.setBoolean("hbase.use.secondary.index", true);
    UTIL.startMiniCluster(NUM_MASTERS, NUM_RS);
  }

  @AfterClass
  public static void tearDownAfterClass() throws Exception {
    UTIL.shutdownMiniCluster();
  }

  @Test(timeout = 180000)
  public void testRoundRobinAssignmentDuringIndexTableCreation() throws Exception {
    HBaseAdmin admin = UTIL.getHBaseAdmin();
    MiniHBaseCluster cluster = UTIL.getHBaseCluster();
    HMaster master = cluster.getMaster();
    IndexedHTableDescriptor iHtd =
        TestUtils.createIndexedHTableDescriptor("testRoundRobinAssignmentDuringIndexTableCreation",
          "cf", "index_name", "cf", "cq");
    char c = 'A';
    byte[][] split = new byte[20][];
    for (int i = 0; i < 20; i++) {
      byte[] b = { (byte) c };
      split[i] = b;
      c++;
    }
    admin.createTable(iHtd, split);
    String tableName = "testRoundRobinAssignmentDuringIndexTableCreation";
    String indexTableName =
        "testRoundRobinAssignmentDuringIndexTableCreation" + Constants.INDEX_TABLE_SUFFIX;
    boolean isRegionColocated = TestUtils.checkForColocation(master, tableName, indexTableName);
    assertTrue("User regions and index regions should colocate.", isRegionColocated);
  }

  @Test(timeout = 180000)
  public void testRoundRobinAssignmentDuringIndexTableEnable() throws Exception {
    HBaseAdmin admin = UTIL.getHBaseAdmin();
    MiniHBaseCluster cluster = UTIL.getHBaseCluster();
    HMaster master = cluster.getMaster();
    master.getConfiguration().setBoolean("hbase.master.enabletable.roundrobin", true);

    IndexedHTableDescriptor iHtd =
        TestUtils.createIndexedHTableDescriptor("testRoundRobinAssignmentDuringIndexTableEnable",
          "cf", "index_name", "cf", "cq");
    char c = 'A';
    byte[][] split = new byte[20][];
    for (int i = 0; i < 20; i++) {
      byte[] b = { (byte) c };
      split[i] = b;
      c++;
    }
    admin.createTable(iHtd, split);
    String tableName = "testRoundRobinAssignmentDuringIndexTableEnable";
    String indexTableName =
        "testRoundRobinAssignmentDuringIndexTableEnable" + Constants.INDEX_TABLE_SUFFIX;
    admin.disableTable(tableName);
    admin.enableTable(tableName);
    boolean isRegionColocated = TestUtils.checkForColocation(master, tableName, indexTableName);
    assertTrue("User regions and index regions should colocate.", isRegionColocated);

  }

  @Test(timeout = 180000)
  public void testColocationAfterSplit() throws Exception {
    HBaseAdmin admin = UTIL.getHBaseAdmin();
    ZooKeeperWatcher zkw = HBaseTestingUtility.getZooKeeperWatcher(UTIL);
    String userTableName = "testCompactionOnIndexTableShouldNotRetrieveTTLExpiredData";
    IndexedHTableDescriptor ihtd = new IndexedHTableDescriptor(userTableName);

    HColumnDescriptor hcd = new HColumnDescriptor("col").setMaxVersions(Integer.MAX_VALUE);

    HColumnDescriptor hcd1 = new HColumnDescriptor("col1").setMaxVersions(Integer.MAX_VALUE);
    IndexSpecification iSpec = new IndexSpecification("ScanIndexf");
    iSpec.addIndexColumn(hcd, "q1", ValueType.String, 10);
    iSpec.addIndexColumn(hcd1, "q2", ValueType.String, 10);
    ihtd.addFamily(hcd);
    ihtd.addFamily(hcd1);
    ihtd.addIndex(iSpec);
    admin.createTable(ihtd);
    ZKAssign.blockUntilNoRIT(zkw);

    Configuration conf = UTIL.getConfiguration();
    HTable table = new HTable(conf, userTableName);

    // test put with the indexed column

    Put p = new Put("row11".getBytes());
    p.add(Bytes.toBytes("col"), Bytes.toBytes("q1"), Bytes.toBytes("Val"));
    p.add("col1".getBytes(), "q2".getBytes(), Bytes.toBytes("ValForCF2"));
    table.put(p);

    Put p1 = new Put("row21".getBytes());
    p1.add(Bytes.toBytes("col"), Bytes.toBytes("q1"), Bytes.toBytes("Val"));
    p1.add("col1".getBytes(), "q2".getBytes(), Bytes.toBytes("ValForCF2"));
    table.put(p1);

    Put p2 = new Put("row31".getBytes());
    p2.add(Bytes.toBytes("col"), Bytes.toBytes("q1"), Bytes.toBytes("Val"));
    p2.add("col1".getBytes(), "q2".getBytes(), Bytes.toBytes("ValForCF2"));
    table.put(p2);

    Put p3 = new Put("row41".getBytes());
    p3.add(Bytes.toBytes("col"), Bytes.toBytes("q1"), Bytes.toBytes("Val"));
    p3.add("col1".getBytes(), "q2".getBytes(), Bytes.toBytes("ValForCF2"));
    table.put(p3);

    Put p4 = new Put("row51".getBytes());
    p4.add(Bytes.toBytes("col"), Bytes.toBytes("q1"), Bytes.toBytes("Val"));
    p4.add("col1".getBytes(), "q2".getBytes(), Bytes.toBytes("ValForCF2"));
    table.put(p4);

    admin.flush(userTableName);
    admin.flush(userTableName + "_idx");

    admin.split(userTableName, "row31");
    MiniHBaseCluster cluster = UTIL.getHBaseCluster();
    HMaster master = cluster.getMaster();
    List<HRegionInfo> regionsOfUserTable =
        master.getAssignmentManager().getRegionsOfTable(Bytes.toBytes(userTableName));

    while (regionsOfUserTable.size() != 2) {
      regionsOfUserTable =
          master.getAssignmentManager().getRegionsOfTable(Bytes.toBytes(userTableName));
    }

    List<HRegionInfo> regionsOfIndexTable =
        master.getAssignmentManager().getRegionsOfTable(Bytes.toBytes(userTableName + "_idx"));

    while (regionsOfIndexTable.size() != 2) {
      regionsOfIndexTable =
          master.getAssignmentManager().getRegionsOfTable(Bytes.toBytes(userTableName + "_idx"));
    }

    for (HRegionInfo hRegionInfo : regionsOfUserTable) {
      for (HRegionInfo indexRegionInfo : regionsOfIndexTable) {
        if (Bytes.equals(hRegionInfo.getStartKey(), indexRegionInfo.getStartKey())) {
          assertEquals("The regions should be colocated", master.getAssignmentManager()
              .getRegionServerOfRegion(hRegionInfo), master.getAssignmentManager()
              .getRegionServerOfRegion(indexRegionInfo));
        }
      }
    }

  }

  @Test(timeout = 180000)
  public void testRandomAssignmentDuringIndexTableEnable() throws Exception {
    HBaseAdmin admin = UTIL.getHBaseAdmin();
    MiniHBaseCluster cluster = UTIL.getHBaseCluster();
    HMaster master = cluster.getMaster();
    master.getConfiguration().setBoolean("hbase.master.enabletable.roundrobin", false);
    IndexedHTableDescriptor iHtd =
        TestUtils.createIndexedHTableDescriptor("testRandomAssignmentDuringIndexTableEnable", "cf",
          "index_name", "cf", "cq");
    char c = 'A';
    byte[][] split = new byte[3][];
    for (int i = 0; i < 3; i++) {
      byte[] b = { (byte) c };
      split[i] = b;
      c++;
    }
    admin.createTable(iHtd, split);

    String tableName = "testRandomAssignmentDuringIndexTableEnable";
    String indexTableName =
        "testRandomAssignmentDuringIndexTableEnable" + Constants.INDEX_TABLE_SUFFIX;
    admin.disableTable(tableName);
    admin.enableTable(tableName);
    boolean isRegionColocated = checkForColocation(master, tableName, indexTableName);
    assertTrue("User regions and index regions should colocate.", isRegionColocated);

  }

  @Test(timeout = 180000)
  public void testBalanceClusterFromAdminBalancer() throws Exception {
    HBaseAdmin admin = UTIL.getHBaseAdmin();
    MiniHBaseCluster cluster = UTIL.getHBaseCluster();
    HMaster master = cluster.getMaster();
    master.getConfiguration().setBoolean("hbase.master.enabletable.roundrobin", false);
    master.getConfiguration().setBoolean("hbase.master.startup.retainassign", false);
    master.getConfiguration().setBoolean("hbase.master.loadbalance.bytable", false);

    IndexedHTableDescriptor iHtd =
        createIndexedHTableDescriptor("testBalanceClusterFromAdminBalancer", "cf", "index_name",
          "cf", "cq");
    HTableDescriptor htd = new HTableDescriptor("testBalanceClusterFromAdminBalancer1");
    htd.addFamily(new HColumnDescriptor("fam1"));

    char c = 'A';
    byte[][] split = new byte[20][];
    for (int i = 0; i < 20; i++) {
      byte[] b = { (byte) c };
      split[i] = b;
      c++;
    }
    admin.createTable(iHtd, split);
    c = 'A';
    byte[][] split1 = new byte[12][];
    for (int i = 0; i < 12; i++) {
      byte[] b = { (byte) c };
      split1[i] = b;
      c++;
    }
    admin.balanceSwitch(false);
    admin.createTable(htd, split1);
    String tableName = "testBalanceClusterFromAdminBalancer";
    String indexTableName = "testBalanceClusterFromAdminBalancer" + Constants.INDEX_TABLE_SUFFIX;
    waitUntilIndexTableCreated(master, indexTableName);
    admin.disableTable(tableName);
    admin.enableTable(tableName);
    admin.balanceSwitch(true);
    admin.balancer();
    boolean isRegionsColocated = checkForColocation(master, tableName, indexTableName);
    assertTrue("User regions and index regions should colocate.", isRegionsColocated);
  }

  @Test(timeout = 180000)
  public void testByTableBalanceClusterFromAdminBalancer() throws Exception {
    HBaseAdmin admin = UTIL.getHBaseAdmin();
    ZooKeeperWatcher zkw = UTIL.getZooKeeperWatcher(UTIL);
    MiniHBaseCluster cluster = UTIL.getHBaseCluster();
    HMaster master = cluster.getMaster();
    master.getConfiguration().setBoolean("hbase.master.enabletable.roundrobin", false);
    master.getConfiguration().setBoolean("hbase.master.startup.retainassign", false);
    IndexedHTableDescriptor iHtd =
        createIndexedHTableDescriptor("testByTableBalanceClusterFromAdminBalancer", "cf",
          "index_name", "cf", "cq");
    HTableDescriptor htd = new HTableDescriptor("testByTableBalanceClusterFromAdminBalancer1");
    htd.addFamily(new HColumnDescriptor("fam1"));

    char c = 'A';
    byte[][] split = new byte[20][];
    for (int i = 0; i < 20; i++) {
      byte[] b = { (byte) c };
      split[i] = b;
      c++;
    }
    admin.createTable(iHtd, split);
    c = 'A';
    byte[][] split1 = new byte[12][];
    for (int i = 0; i < 12; i++) {
      byte[] b = { (byte) c };
      split1[i] = b;
      c++;
    }
    admin.balanceSwitch(false);
    admin.createTable(htd, split1);
    String tableName = "testByTableBalanceClusterFromAdminBalancer";
    String indexTableName =
        "testByTableBalanceClusterFromAdminBalancer" + Constants.INDEX_TABLE_SUFFIX;
    waitUntilIndexTableCreated(master, indexTableName);
    admin.disableTable(tableName);
    admin.enableTable(tableName);
    admin.balanceSwitch(true);
    admin.balancer();
    int totalNumRegions = 21;
    Thread.sleep(10000);
    List<Pair<byte[], ServerName>> iTableStartKeysAndLocations = null;
    do {
      iTableStartKeysAndLocations = getStartKeysAndLocations(master, indexTableName);
      System.out.println("wait until all regions comeup " + iTableStartKeysAndLocations.size());
      Thread.sleep(1000);
    } while (totalNumRegions > iTableStartKeysAndLocations.size());
    ZKAssign.blockUntilNoRIT(zkw);
    boolean isRegionColocated = checkForColocation(master, tableName, indexTableName);
    assertTrue("User regions and index regions should colocate.", isRegionColocated);
  }

  @Test(timeout = 180000)
  public void testRandomAssignmentAfterRegionServerDown() throws Exception {
    HBaseAdmin admin = UTIL.getHBaseAdmin();
    ZooKeeperWatcher zkw = UTIL.getZooKeeperWatcher(UTIL);
    MiniHBaseCluster cluster = UTIL.getHBaseCluster();
    HMaster master = cluster.getMaster();
    IndexedHTableDescriptor iHtd =
        createIndexedHTableDescriptor("testRandomAssignmentAfterRegionServerDown", "cf",
          "index_name", "cf", "cq");
    char c = 'A';
    byte[][] split = new byte[20][];
    for (int i = 0; i < 20; i++) {
      byte[] b = { (byte) c };
      split[i] = b;
      c++;
    }
    admin.createTable(iHtd, split);

    String tableName = "testRandomAssignmentAfterRegionServerDown";
    String indexTableName =
        "testRandomAssignmentAfterRegionServerDown" + Constants.INDEX_TABLE_SUFFIX;
    HRegionServer regionServer = cluster.getRegionServer(1);
    regionServer.abort("Aborting to test random assignment after region server down");
    while (master.getServerManager().areDeadServersInProgress()) {
      Thread.sleep(1000);
    }
    int totalNumRegions = 21;
    List<Pair<byte[], ServerName>> iTableStartKeysAndLocations = null;
    do {
      iTableStartKeysAndLocations = getStartKeysAndLocations(master, indexTableName);
      System.out.println("wait until all regions comeup " + iTableStartKeysAndLocations.size());
      Thread.sleep(1000);
    } while (totalNumRegions > iTableStartKeysAndLocations.size());
    ZKAssign.blockUntilNoRIT(zkw);
    boolean isRegionColocated = checkForColocation(master, tableName, indexTableName);
    assertTrue("User regions and index regions should colocate.", isRegionColocated);

  }

  @Test(timeout = 180000)
  public void testPostAssign() throws Exception {
    HBaseAdmin admin = UTIL.getHBaseAdmin();
    MiniHBaseCluster cluster = UTIL.getHBaseCluster();
    HMaster master = cluster.getMaster();
    ZooKeeperWatcher zkw = UTIL.getZooKeeperWatcher(UTIL);
    ZKAssign.deleteAllNodes(zkw);
    IndexedHTableDescriptor iHtd = new IndexedHTableDescriptor("testPostAssign");
    char c = 'A';
    byte[][] split = new byte[4][];
    for (int i = 0; i < 4; i++) {
      byte[] b = { (byte) c };
      split[i] = b;
      c++;
    }
    admin.createTable(iHtd, split);
    List<HRegionInfo> tableRegions =
        MetaReader.getTableRegions(master.getCatalogTracker(),
          Bytes.toBytes(iHtd.getNameAsString()));
    for (HRegionInfo hRegionInfo : tableRegions) {
      admin.assign(hRegionInfo.getRegionName());
    }
    ZKAssign.blockUntilNoRIT(zkw);
    boolean isRegionColocated =
        checkForColocation(master, "testPostAssign", "testPostAssign"
            + Constants.INDEX_TABLE_SUFFIX);
    assertTrue("User regions and index regions should colocate.", isRegionColocated);

  }

  @Test(timeout = 180000)
  public void testRegionMove() throws Exception {
    HBaseAdmin admin = UTIL.getHBaseAdmin();
    MiniHBaseCluster cluster = UTIL.getHBaseCluster();
    HMaster master = cluster.getMaster();
    ZooKeeperWatcher zkw = UTIL.getZooKeeperWatcher(UTIL);

    IndexedHTableDescriptor iHtd = new IndexedHTableDescriptor("testRegionMove");
    char c = 'A';
    byte[][] split = new byte[4][];
    for (int i = 0; i < 4; i++) {
      byte[] b = { (byte) c };
      split[i] = b;
      c++;
    }
    admin.createTable(iHtd, split);
    List<HRegionInfo> tableRegions =
        MetaReader.getTableRegions(master.getCatalogTracker(),
          Bytes.toBytes(iHtd.getNameAsString()));
    int numRegions = cluster.getRegionServerThreads().size();
    cluster.getRegionServer(1).getServerName();
    Random random = new Random();
    for (HRegionInfo hRegionInfo : tableRegions) {
      int regionNumber = random.nextInt(numRegions);
      ServerName serverName = cluster.getRegionServer(regionNumber).getServerName();
      admin.move(hRegionInfo.getEncodedNameAsBytes(), Bytes.toBytes(serverName.getServerName()));
    }
    ZKAssign.blockUntilNoRIT(zkw);
    boolean isRegionColocated =
        checkForColocation(master, "testRegionMove", "testRegionMove"
            + Constants.INDEX_TABLE_SUFFIX);
    assertTrue("User regions and index regions should colocate.", isRegionColocated);

  }

  @Test(timeout = 180000)
  public void testRetainAssignmentDuringMasterStartUp() throws Exception {
    HBaseAdmin admin = UTIL.getHBaseAdmin();
    MiniHBaseCluster cluster = UTIL.getHBaseCluster();
    HMaster master = cluster.getMaster();
    master.getConfiguration().setBoolean("hbase.master.startup.retainassign", true);
    IndexedHTableDescriptor iHtd =
        createIndexedHTableDescriptor("testRetainAssignmentDuringMasterStartUp", "cf",
          "index_name", "cf", "cq");
    char c = 'A';
    byte[][] split = new byte[20][];
    for (int i = 0; i < 20; i++) {
      byte[] b = { (byte) c };
      split[i] = b;
      c++;
    }
    admin.createTable(iHtd, split);
    String tableName = "testRetainAssignmentDuringMasterStartUp";
    String indexTableName =
        "testRetainAssignmentDuringMasterStartUp" + Constants.INDEX_TABLE_SUFFIX;
    waitUntilIndexTableCreated(master, indexTableName);
    UTIL.shutdownMiniHBaseCluster();
    UTIL.startMiniHBaseCluster(1, 4);
    cluster = UTIL.getHBaseCluster();
    master = cluster.getMaster();

    boolean isRegionColocated = checkForColocation(master, tableName, indexTableName);
    assertTrue("User regions and index regions should colocate.", isRegionColocated);

  }

  @Test(timeout = 180000)
  public void testRoundRobinAssignmentDuringMasterStartUp() throws Exception {
    HBaseAdmin admin = new HBaseAdmin(UTIL.getConfiguration());
    MiniHBaseCluster cluster = UTIL.getHBaseCluster();
    HMaster master = cluster.getMaster();
    master.getConfiguration().setBoolean("hbase.master.startup.retainassign", false);

    IndexedHTableDescriptor iHtd =
        TestUtils.createIndexedHTableDescriptor("testRoundRobinAssignmentDuringMasterStartUp",
          "cf", "index_name", "cf", "cq");
    char c = 'A';
    byte[][] split = new byte[20][];
    for (int i = 0; i < 20; i++) {
      byte[] b = { (byte) c };
      split[i] = b;
      c++;
    }
    admin.createTable(iHtd, split);
    String tableName = "testRoundRobinAssignmentDuringMasterStartUp";
    String indexTableName =
        "testRoundRobinAssignmentDuringMasterStartUp" + Constants.INDEX_TABLE_SUFFIX;
    waitUntilIndexTableCreated(master, indexTableName);
    UTIL.shutdownMiniHBaseCluster();
    UTIL.startMiniHBaseCluster(1, 4);
    cluster = UTIL.getHBaseCluster();
    master = cluster.getMaster();
    boolean isRegionColocated = checkForColocation(master, tableName, indexTableName);
    assertTrue("User regions and index regions should colocate.", isRegionColocated);

  }

  private IndexedHTableDescriptor createIndexedHTableDescriptor(String tableName,
      String columnFamily, String indexName, String indexColumnFamily, String indexColumnQualifier) {
    IndexedHTableDescriptor htd = new IndexedHTableDescriptor(tableName);
    IndexSpecification iSpec = new IndexSpecification(indexName);
    HColumnDescriptor hcd = new HColumnDescriptor(columnFamily);
    iSpec.addIndexColumn(hcd, indexColumnQualifier, ValueType.String, 10);
    htd.addFamily(hcd);
    htd.addIndex(iSpec);
    return htd;
  }

  private void waitUntilIndexTableCreated(HMaster master, String tableName) throws IOException,
      InterruptedException {
    boolean isEnabled = false;
    boolean isExist = false;
    do {
      isExist = MetaReader.tableExists(master.getCatalogTracker(), tableName);
      isEnabled = master.getAssignmentManager().getZKTable().isEnabledTable(tableName);
      Thread.sleep(1000);
    } while ((false == isExist) && (false == isEnabled));
  }

  private List<Pair<byte[], ServerName>> getStartKeysAndLocations(HMaster master, String tableName)
      throws IOException, InterruptedException {

    List<Pair<HRegionInfo, ServerName>> tableRegionsAndLocations =
        MetaReader.getTableRegionsAndLocations(master.getCatalogTracker(), tableName);
    List<Pair<byte[], ServerName>> startKeyAndLocationPairs =
        new ArrayList<Pair<byte[], ServerName>>(tableRegionsAndLocations.size());
    Pair<byte[], ServerName> startKeyAndLocation = null;
    for (Pair<HRegionInfo, ServerName> regionAndLocation : tableRegionsAndLocations) {
      startKeyAndLocation =
          new Pair<byte[], ServerName>(regionAndLocation.getFirst().getStartKey(),
              regionAndLocation.getSecond());
      startKeyAndLocationPairs.add(startKeyAndLocation);
    }
    return startKeyAndLocationPairs;

  }

  private boolean checkForColocation(HMaster master, String tableName, String indexTableName)
      throws IOException, InterruptedException {
    List<Pair<byte[], ServerName>> uTableStartKeysAndLocations =
        getStartKeysAndLocations(master, tableName);
    List<Pair<byte[], ServerName>> iTableStartKeysAndLocations =
        getStartKeysAndLocations(master, indexTableName);

    boolean regionsColocated = true;
    if (uTableStartKeysAndLocations.size() != iTableStartKeysAndLocations.size()) {
      regionsColocated = false;
    } else {
      for (int i = 0; i < uTableStartKeysAndLocations.size(); i++) {
        Pair<byte[], ServerName> uStartKeyAndLocation = uTableStartKeysAndLocations.get(i);
        Pair<byte[], ServerName> iStartKeyAndLocation = iTableStartKeysAndLocations.get(i);

        if (Bytes.compareTo(uStartKeyAndLocation.getFirst(), iStartKeyAndLocation.getFirst()) == 0) {
          if (uStartKeyAndLocation.getSecond().equals(iStartKeyAndLocation.getSecond())) {
            continue;
          }
        }
        regionsColocated = false;
      }
    }
    return regionsColocated;
  }

}
TOP

Related Classes of org.apache.hadoop.hbase.index.TestSecIndexLoadBalancer

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.