Beispiel #1
0
 protected void waitRegionInTransition(final List<HRegionInfo> regions)
     throws IOException, CoordinatedStateException {
   AssignmentManager am = this.masterServices.getAssignmentManager();
   RegionStates states = am.getRegionStates();
   long waitTime = server.getConfiguration().getLong("hbase.master.wait.on.region", 5 * 60 * 1000);
   for (HRegionInfo region : regions) {
     long done = System.currentTimeMillis() + waitTime;
     while (System.currentTimeMillis() < done) {
       if (states.isRegionInState(region, State.FAILED_OPEN)) {
         am.regionOffline(region);
       }
       if (!states.isRegionInTransition(region)) break;
       try {
         Thread.sleep(waitingTimeForEvents);
       } catch (InterruptedException e) {
         LOG.warn("Interrupted while sleeping");
         throw (InterruptedIOException) new InterruptedIOException().initCause(e);
       }
       LOG.debug(
           "Waiting on region to clear regions in transition; "
               + am.getRegionStates().getRegionTransitionState(region));
     }
     if (states.isRegionInTransition(region)) {
       throw new IOException(
           "Waited hbase.master.wait.on.region ("
               + waitTime
               + "ms) for region to leave region "
               + region.getRegionNameAsString()
               + " in transitions");
     }
   }
 }
  @Test
  public void testWholesomeMerge() throws Exception {
    LOG.info("Starting testWholesomeMerge");
    final TableName tableName = TableName.valueOf("testWholesomeMerge");

    // Create table and load data.
    Table table = createTableAndLoadData(master, tableName);
    // Merge 1st and 2nd region
    mergeRegionsAndVerifyRegionNum(master, tableName, 0, 1, INITIAL_REGION_NUM - 1);

    // Merge 2nd and 3th region
    PairOfSameType<HRegionInfo> mergedRegions =
        mergeRegionsAndVerifyRegionNum(master, tableName, 1, 2, INITIAL_REGION_NUM - 2);

    verifyRowCount(table, ROWSIZE);

    // Randomly choose one of the two merged regions
    HRegionInfo hri =
        RandomUtils.nextBoolean() ? mergedRegions.getFirst() : mergedRegions.getSecond();
    MiniHBaseCluster cluster = TEST_UTIL.getHBaseCluster();
    AssignmentManager am = cluster.getMaster().getAssignmentManager();
    RegionStates regionStates = am.getRegionStates();
    long start = EnvironmentEdgeManager.currentTime();
    while (!regionStates.isRegionInState(hri, State.MERGED)) {
      assertFalse(
          "Timed out in waiting one merged region to be in state MERGED",
          EnvironmentEdgeManager.currentTime() - start > 60000);
      Thread.sleep(500);
    }

    // We should not be able to assign it again
    am.assign(hri, true);
    assertFalse("Merged region can't be assigned", regionStates.isRegionInTransition(hri));
    assertTrue(regionStates.isRegionInState(hri, State.MERGED));

    // We should not be able to unassign it either
    am.unassign(hri, null);
    assertFalse("Merged region can't be unassigned", regionStates.isRegionInTransition(hri));
    assertTrue(regionStates.isRegionInState(hri, State.MERGED));

    table.close();
  }