You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by zh...@apache.org on 2017/12/18 12:46:36 UTC

[04/26] hbase git commit: HBASE-19272 Deal with HBCK tests disabled by HBASE-14614 AMv2 when HBCK works again...

http://git-wip-us.apache.org/repos/asf/hbase/blob/89e2869e/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestHBaseFsckTwoRS.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestHBaseFsckTwoRS.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestHBaseFsckTwoRS.java
deleted file mode 100644
index 6fa455a..0000000
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestHBaseFsckTwoRS.java
+++ /dev/null
@@ -1,674 +0,0 @@
-/**
- *
- * 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.util;
-
-import static org.apache.hadoop.hbase.util.hbck.HbckTestingUtil.assertErrors;
-import static org.apache.hadoop.hbase.util.hbck.HbckTestingUtil.assertNoErrors;
-import static org.apache.hadoop.hbase.util.hbck.HbckTestingUtil.doFsck;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-import java.util.concurrent.ScheduledThreadPoolExecutor;
-import java.util.concurrent.SynchronousQueue;
-import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.hadoop.fs.FileSystem;
-import org.apache.hadoop.fs.Path;
-import org.apache.hadoop.hbase.HColumnDescriptor;
-import org.apache.hadoop.hbase.HConstants;
-import org.apache.hadoop.hbase.HRegionLocation;
-import org.apache.hadoop.hbase.HTableDescriptor;
-import org.apache.hadoop.hbase.MetaTableAccessor;
-import org.apache.hadoop.hbase.MiniHBaseCluster;
-import org.apache.hadoop.hbase.ServerName;
-import org.apache.hadoop.hbase.TableName;
-import org.apache.hadoop.hbase.client.ClusterConnection;
-import org.apache.hadoop.hbase.client.Durability;
-import org.apache.hadoop.hbase.client.HBaseAdmin;
-import org.apache.hadoop.hbase.client.Put;
-import org.apache.hadoop.hbase.client.RegionInfo;
-import org.apache.hadoop.hbase.client.RegionInfoBuilder;
-import org.apache.hadoop.hbase.client.Result;
-import org.apache.hadoop.hbase.client.ResultScanner;
-import org.apache.hadoop.hbase.client.Scan;
-import org.apache.hadoop.hbase.client.Table;
-import org.apache.hadoop.hbase.coprocessor.CoprocessorHost;
-import org.apache.hadoop.hbase.io.HFileLink;
-import org.apache.hadoop.hbase.io.hfile.HFile;
-import org.apache.hadoop.hbase.io.hfile.HFileContext;
-import org.apache.hadoop.hbase.io.hfile.HFileContextBuilder;
-import org.apache.hadoop.hbase.master.RegionState;
-import org.apache.hadoop.hbase.regionserver.HRegionServer;
-import org.apache.hadoop.hbase.testclassification.LargeTests;
-import org.apache.hadoop.hbase.testclassification.MiscTests;
-import org.apache.hadoop.hbase.zookeeper.MetaTableLocator;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Ignore;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-import org.junit.rules.TestName;
-
-import org.apache.hadoop.hbase.shaded.com.google.common.collect.Multimap;
-import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;
-
-@Ignore // Until after HBASE-14614 goes in.
-@Category({MiscTests.class, LargeTests.class})
-public class TestHBaseFsckTwoRS extends BaseTestHBaseFsck {
-  @Rule
-  public TestName name = new TestName();
-
-  @BeforeClass
-  public static void setUpBeforeClass() throws Exception {
-    TEST_UTIL.getConfiguration().set(CoprocessorHost.MASTER_COPROCESSOR_CONF_KEY,
-        MasterSyncCoprocessor.class.getName());
-
-    conf.setInt("hbase.regionserver.handler.count", 2);
-    conf.setInt("hbase.regionserver.metahandler.count", 30);
-
-    conf.setInt("hbase.htable.threads.max", POOL_SIZE);
-    conf.setInt("hbase.hconnection.threads.max", 2 * POOL_SIZE);
-    conf.setInt("hbase.hbck.close.timeout", 2 * REGION_ONLINE_TIMEOUT);
-    conf.setInt(HConstants.HBASE_RPC_TIMEOUT_KEY, 8 * REGION_ONLINE_TIMEOUT);
-    TEST_UTIL.startMiniCluster(2);
-
-    tableExecutorService = new ThreadPoolExecutor(1, POOL_SIZE, 60, TimeUnit.SECONDS,
-        new SynchronousQueue<>(), Threads.newDaemonThreadFactory("testhbck"));
-
-    hbfsckExecutorService = new ScheduledThreadPoolExecutor(POOL_SIZE);
-
-    assignmentManager = TEST_UTIL.getHBaseCluster().getMaster().getAssignmentManager();
-    regionStates = assignmentManager.getRegionStates();
-
-    connection = (ClusterConnection) TEST_UTIL.getConnection();
-
-    admin = connection.getAdmin();
-    admin.setBalancerRunning(false, true);
-
-    TEST_UTIL.waitUntilAllRegionsAssigned(TableName.META_TABLE_NAME);
-    TEST_UTIL.waitUntilAllRegionsAssigned(TableName.NAMESPACE_TABLE_NAME);
-  }
-
-  @AfterClass
-  public static void tearDownAfterClass() throws Exception {
-    tableExecutorService.shutdown();
-    hbfsckExecutorService.shutdown();
-    admin.close();
-    TEST_UTIL.shutdownMiniCluster();
-  }
-
-  @Before
-  public void setUp() {
-    EnvironmentEdgeManager.reset();
-  }
-
-  @Test(timeout=180000)
-  public void testFixAssignmentsWhenMETAinTransition() throws Exception {
-    MiniHBaseCluster cluster = TEST_UTIL.getHBaseCluster();
-    admin.unassign(RegionInfoBuilder.FIRST_META_REGIONINFO.getRegionName(), true);
-    assignmentManager.offlineRegion(RegionInfoBuilder.FIRST_META_REGIONINFO);
-    new MetaTableLocator().deleteMetaLocation(cluster.getMaster().getZooKeeper());
-    assertFalse(regionStates.isRegionOnline(RegionInfoBuilder.FIRST_META_REGIONINFO));
-    HBaseFsck hbck = doFsck(conf, true);
-    assertErrors(hbck, new HBaseFsck.ErrorReporter.ERROR_CODE[] { HBaseFsck.ErrorReporter.ERROR_CODE.UNKNOWN, HBaseFsck.ErrorReporter.ERROR_CODE.NO_META_REGION,
-        HBaseFsck.ErrorReporter.ERROR_CODE.NULL_META_REGION });
-    assertNoErrors(doFsck(conf, false));
-  }
-
-  /**
-   * This create and fixes a bad table with regions that have a duplicate
-   * start key
-   */
-  @Test (timeout=180000)
-  public void testDupeStartKey() throws Exception {
-    final TableName tableName = TableName.valueOf(name.getMethodName());
-    try {
-      setupTable(tableName);
-      assertNoErrors(doFsck(conf, false));
-      assertEquals(ROWKEYS.length, countRows());
-
-      // Now let's mess it up, by adding a region with a duplicate startkey
-      RegionInfo hriDupe =
-          createRegion(tbl.getTableDescriptor(), Bytes.toBytes("A"), Bytes.toBytes("A2"));
-      TEST_UTIL.assignRegion(hriDupe);
-
-      ServerName server = regionStates.getRegionServerOfRegion(hriDupe);
-      TEST_UTIL.assertRegionOnServer(hriDupe, server, REGION_ONLINE_TIMEOUT);
-
-      HBaseFsck hbck = doFsck(conf, false);
-      assertErrors(hbck, new HBaseFsck.ErrorReporter.ERROR_CODE[] { HBaseFsck.ErrorReporter.ERROR_CODE.DUPE_STARTKEYS, HBaseFsck.ErrorReporter.ERROR_CODE.DUPE_STARTKEYS });
-      assertEquals(2, hbck.getOverlapGroups(tableName).size());
-      assertEquals(ROWKEYS.length, countRows()); // seems like the "bigger" region won.
-
-      // fix the degenerate region.
-      doFsck(conf, true);
-
-      // check that the degenerate region is gone and no data loss
-      HBaseFsck hbck2 = doFsck(conf,false);
-      assertNoErrors(hbck2);
-      assertEquals(0, hbck2.getOverlapGroups(tableName).size());
-      assertEquals(ROWKEYS.length, countRows());
-    } finally {
-      cleanupTable(tableName);
-    }
-  }
-
-  /**
-   * This create and fixes a bad table with regions that have a duplicate
-   * start key
-   */
-  @Test (timeout=180000)
-  public void testDupeRegion() throws Exception {
-    final TableName tableName = TableName.valueOf(name.getMethodName());
-    try {
-      setupTable(tableName);
-      assertNoErrors(doFsck(conf, false));
-      assertEquals(ROWKEYS.length, countRows());
-
-      // Now let's mess it up, by adding a region with a duplicate startkey
-      RegionInfo hriDupe =
-          createRegion(tbl.getTableDescriptor(), Bytes.toBytes("A"), Bytes.toBytes("B"));
-      TEST_UTIL.assignRegion(hriDupe);
-
-      ServerName server = regionStates.getRegionServerOfRegion(hriDupe);
-      TEST_UTIL.assertRegionOnServer(hriDupe, server, REGION_ONLINE_TIMEOUT);
-
-      // Yikes! The assignment manager can't tell between diff between two
-      // different regions with the same start/endkeys since it doesn't
-      // differentiate on ts/regionId!  We actually need to recheck
-      // deployments!
-      while (findDeployedHSI(getDeployedHRIs(admin), hriDupe) == null) {
-        Thread.sleep(250);
-      }
-
-      LOG.debug("Finished assignment of dupe region");
-
-      // TODO why is dupe region different from dupe start keys?
-      HBaseFsck hbck = doFsck(conf, false);
-      assertErrors(hbck, new HBaseFsck.ErrorReporter.ERROR_CODE[] { HBaseFsck.ErrorReporter.ERROR_CODE.DUPE_STARTKEYS, HBaseFsck.ErrorReporter.ERROR_CODE.DUPE_STARTKEYS });
-      assertEquals(2, hbck.getOverlapGroups(tableName).size());
-      assertEquals(ROWKEYS.length, countRows()); // seems like the "bigger" region won.
-
-      // fix the degenerate region.
-      doFsck(conf, true);
-
-      // check that the degenerate region is gone and no data loss
-      HBaseFsck hbck2 = doFsck(conf,false);
-      assertNoErrors(hbck2);
-      assertEquals(0, hbck2.getOverlapGroups(tableName).size());
-      assertEquals(ROWKEYS.length, countRows());
-    } finally {
-      cleanupTable(tableName);
-    }
-  }
-
-
-  /**
-   * This creates and fixes a bad table where a region is completely contained
-   * by another region.
-   */
-  @Test (timeout=180000)
-  public void testContainedRegionOverlap() throws Exception {
-    final TableName tableName = TableName.valueOf(name.getMethodName());
-    try {
-      setupTable(tableName);
-      assertEquals(ROWKEYS.length, countRows());
-
-      // Mess it up by creating an overlap in the metadata
-      RegionInfo hriOverlap =
-          createRegion(tbl.getTableDescriptor(), Bytes.toBytes("A2"), Bytes.toBytes("B"));
-      TEST_UTIL.assignRegion(hriOverlap);
-
-      ServerName server = regionStates.getRegionServerOfRegion(hriOverlap);
-      TEST_UTIL.assertRegionOnServer(hriOverlap, server, REGION_ONLINE_TIMEOUT);
-
-      HBaseFsck hbck = doFsck(conf, false);
-      assertErrors(hbck, new HBaseFsck.ErrorReporter.ERROR_CODE[] { HBaseFsck.ErrorReporter.ERROR_CODE.OVERLAP_IN_REGION_CHAIN });
-      assertEquals(2, hbck.getOverlapGroups(tableName).size());
-      assertEquals(ROWKEYS.length, countRows());
-
-      // fix the problem.
-      doFsck(conf, true);
-
-      // verify that overlaps are fixed
-      HBaseFsck hbck2 = doFsck(conf,false);
-      assertNoErrors(hbck2);
-      assertEquals(0, hbck2.getOverlapGroups(tableName).size());
-      assertEquals(ROWKEYS.length, countRows());
-    } finally {
-      cleanupTable(tableName);
-    }
-  }
-
-  /**
-   * Test fixing lingering reference file.
-   */
-  @Test (timeout=180000)
-  public void testLingeringReferenceFile() throws Exception {
-    final TableName tableName = TableName.valueOf(name.getMethodName());
-    try {
-      setupTable(tableName);
-      assertEquals(ROWKEYS.length, countRows());
-
-      // Mess it up by creating a fake reference file
-      FileSystem fs = FileSystem.get(conf);
-      Path tableDir= FSUtils.getTableDir(FSUtils.getRootDir(conf), tableName);
-      Path regionDir = FSUtils.getRegionDirs(fs, tableDir).get(0);
-      Path famDir = new Path(regionDir, FAM_STR);
-      Path fakeReferenceFile = new Path(famDir, "fbce357483ceea.12144538");
-      fs.create(fakeReferenceFile);
-
-      HBaseFsck hbck = doFsck(conf, false);
-      assertErrors(hbck, new HBaseFsck.ErrorReporter.ERROR_CODE[] { HBaseFsck.ErrorReporter.ERROR_CODE.LINGERING_REFERENCE_HFILE });
-      // fix reference file
-      doFsck(conf, true);
-      // check that reference file fixed
-      assertNoErrors(doFsck(conf, false));
-    } finally {
-      cleanupTable(tableName);
-    }
-  }
-
-  /**
-   * Test fixing lingering HFileLinks.
-   */
-  @Test(timeout = 180000)
-  public void testLingeringHFileLinks() throws Exception {
-    final TableName tableName = TableName.valueOf(name.getMethodName());
-    try {
-      setupTable(tableName);
-
-      FileSystem fs = FileSystem.get(conf);
-      Path tableDir = FSUtils.getTableDir(FSUtils.getRootDir(conf), tableName);
-      Path regionDir = FSUtils.getRegionDirs(fs, tableDir).get(0);
-      String regionName = regionDir.getName();
-      Path famDir = new Path(regionDir, FAM_STR);
-      String HFILE_NAME = "01234567abcd";
-      Path hFilePath = new Path(famDir, HFILE_NAME);
-
-      // creating HFile
-      HFileContext context = new HFileContextBuilder().withIncludesTags(false).build();
-      HFile.Writer w =
-          HFile.getWriterFactoryNoCache(conf).withPath(fs, hFilePath).withFileContext(context)
-              .create();
-      w.close();
-
-      HFileLink.create(conf, fs, famDir, tableName, regionName, HFILE_NAME);
-
-      // should report no error
-      HBaseFsck hbck = doFsck(conf, false);
-      assertNoErrors(hbck);
-
-      // Delete linked file
-      fs.delete(hFilePath, true);
-
-      // Check without fix should show the error
-      hbck = doFsck(conf, false);
-      assertErrors(hbck, new HBaseFsck.ErrorReporter.ERROR_CODE[] {
-          HBaseFsck.ErrorReporter.ERROR_CODE.LINGERING_HFILELINK });
-
-      // Fixing the error
-      hbck = doFsck(conf, true);
-      assertErrors(hbck, new HBaseFsck.ErrorReporter.ERROR_CODE[] {
-          HBaseFsck.ErrorReporter.ERROR_CODE.LINGERING_HFILELINK });
-
-      // Fix should sideline these files, thus preventing the error
-      hbck = doFsck(conf, false);
-      assertNoErrors(hbck);
-    } finally {
-      cleanupTable(tableName);
-    }
-  }
-
-  @Test(timeout = 180000)
-  public void testCorruptLinkDirectory() throws Exception {
-    final TableName tableName = TableName.valueOf(name.getMethodName());
-    try {
-      setupTable(tableName);
-      FileSystem fs = FileSystem.get(conf);
-
-      Path tableDir = FSUtils.getTableDir(FSUtils.getRootDir(conf), tableName);
-      Path regionDir = FSUtils.getRegionDirs(fs, tableDir).get(0);
-      Path famDir = new Path(regionDir, FAM_STR);
-      String regionName = regionDir.getName();
-      String HFILE_NAME = "01234567abcd";
-      String link = HFileLink.createHFileLinkName(tableName, regionName, HFILE_NAME);
-
-      // should report no error
-      HBaseFsck hbck = doFsck(conf, false);
-      assertNoErrors(hbck);
-
-      // creating a directory with file instead of the HFileLink file
-      fs.mkdirs(new Path(famDir, link));
-      fs.create(new Path(new Path(famDir, link), "somefile"));
-
-      // Check without fix should show the error
-      hbck = doFsck(conf, false);
-      assertErrors(hbck, new HBaseFsck.ErrorReporter.ERROR_CODE[] {
-          HBaseFsck.ErrorReporter.ERROR_CODE.LINGERING_HFILELINK });
-
-      // Fixing the error
-      hbck = doFsck(conf, true);
-      assertErrors(hbck, new HBaseFsck.ErrorReporter.ERROR_CODE[] {
-          HBaseFsck.ErrorReporter.ERROR_CODE.LINGERING_HFILELINK });
-
-      // Fix should sideline these files, thus preventing the error
-      hbck = doFsck(conf, false);
-      assertNoErrors(hbck);
-    } finally {
-      cleanupTable(tableName);
-    }
-  }
-
-  @Test (timeout=180000)
-  public void testMetaOffline() throws Exception {
-    // check no errors
-    HBaseFsck hbck = doFsck(conf, false);
-    assertNoErrors(hbck);
-    deleteMetaRegion(conf, true, false, false);
-    hbck = doFsck(conf, false);
-    // ERROR_CODE.UNKNOWN is coming because we reportError with a message for the hbase:meta
-    // inconsistency and whether we will be fixing it or not.
-    assertErrors(hbck, new HBaseFsck.ErrorReporter.ERROR_CODE[] { HBaseFsck.ErrorReporter.ERROR_CODE.NO_META_REGION, HBaseFsck.ErrorReporter.ERROR_CODE.UNKNOWN });
-    hbck = doFsck(conf, true);
-    assertErrors(hbck, new HBaseFsck.ErrorReporter.ERROR_CODE[] { HBaseFsck.ErrorReporter.ERROR_CODE.NO_META_REGION, HBaseFsck.ErrorReporter.ERROR_CODE.UNKNOWN });
-    hbck = doFsck(conf, false);
-    assertNoErrors(hbck);
-  }
-
-  /**
-   * This creates and fixes a bad table where an overlap group of
-   * 3 regions. Set HBaseFsck.maxMerge to 2 to trigger sideline overlapped
-   * region. Mess around the meta data so that closeRegion/offlineRegion
-   * throws exceptions.
-   */
-  @Test (timeout=180000)
-  public void testSidelineOverlapRegion() throws Exception {
-    final TableName tableName = TableName.valueOf(name.getMethodName());
-    try {
-      setupTable(tableName);
-      assertEquals(ROWKEYS.length, countRows());
-
-      // Mess it up by creating an overlap
-      MiniHBaseCluster cluster = TEST_UTIL.getHBaseCluster();
-      RegionInfo hriOverlap1 =
-          createRegion(tbl.getTableDescriptor(), Bytes.toBytes("A"), Bytes.toBytes("AB"));
-      TEST_UTIL.assignRegion(hriOverlap1);
-
-      RegionInfo hriOverlap2 =
-          createRegion(tbl.getTableDescriptor(), Bytes.toBytes("AB"), Bytes.toBytes("B"));
-      TEST_UTIL.assignRegion(hriOverlap2);
-
-      HBaseFsck hbck = doFsck(conf, false);
-      assertErrors(hbck, new HBaseFsck.ErrorReporter.ERROR_CODE[] {HBaseFsck.ErrorReporter.ERROR_CODE.DUPE_STARTKEYS,
-          HBaseFsck.ErrorReporter.ERROR_CODE.DUPE_STARTKEYS, HBaseFsck.ErrorReporter.ERROR_CODE.OVERLAP_IN_REGION_CHAIN});
-      assertEquals(3, hbck.getOverlapGroups(tableName).size());
-      assertEquals(ROWKEYS.length, countRows());
-
-      // mess around the overlapped regions, to trigger NotServingRegionException
-      Multimap<byte[], HBaseFsck.HbckInfo> overlapGroups = hbck.getOverlapGroups(tableName);
-      ServerName serverName = null;
-      byte[] regionName = null;
-      for (HBaseFsck.HbckInfo hbi: overlapGroups.values()) {
-        if ("A".equals(Bytes.toString(hbi.getStartKey()))
-            && "B".equals(Bytes.toString(hbi.getEndKey()))) {
-          regionName = hbi.getRegionName();
-
-          // get an RS not serving the region to force bad assignment info in to META.
-          int k = cluster.getServerWith(regionName);
-          for (int i = 0; i < 3; i++) {
-            if (i != k) {
-              HRegionServer rs = cluster.getRegionServer(i);
-              serverName = rs.getServerName();
-              break;
-            }
-          }
-
-          HBaseFsckRepair.closeRegionSilentlyAndWait(connection,
-              cluster.getRegionServer(k).getServerName(), hbi.getHdfsHRI());
-          admin.offline(regionName);
-          break;
-        }
-      }
-
-      assertNotNull(regionName);
-      assertNotNull(serverName);
-      try (Table meta = connection.getTable(TableName.META_TABLE_NAME, tableExecutorService)) {
-        Put put = new Put(regionName);
-        put.addColumn(HConstants.CATALOG_FAMILY, HConstants.SERVER_QUALIFIER,
-            Bytes.toBytes(serverName.getAddress().toString()));
-        meta.put(put);
-      }
-
-      // fix the problem.
-      HBaseFsck fsck = new HBaseFsck(conf, hbfsckExecutorService);
-      fsck.connect();
-      HBaseFsck.setDisplayFullReport(); // i.e. -details
-      fsck.setTimeLag(0);
-      fsck.setFixAssignments(true);
-      fsck.setFixMeta(true);
-      fsck.setFixHdfsHoles(true);
-      fsck.setFixHdfsOverlaps(true);
-      fsck.setFixHdfsOrphans(true);
-      fsck.setFixVersionFile(true);
-      fsck.setSidelineBigOverlaps(true);
-      fsck.setMaxMerge(2);
-      fsck.onlineHbck();
-      fsck.close();
-
-      // verify that overlaps are fixed, and there are less rows
-      // since one region is sidelined.
-      HBaseFsck hbck2 = doFsck(conf,false);
-      assertNoErrors(hbck2);
-      assertEquals(0, hbck2.getOverlapGroups(tableName).size());
-      assertTrue(ROWKEYS.length > countRows());
-    } finally {
-      cleanupTable(tableName);
-    }
-  }
-
-  @Test(timeout=180000)
-  public void testHBaseFsck() throws Exception {
-    assertNoErrors(doFsck(conf, false));
-    final TableName tableName = TableName.valueOf(name.getMethodName());
-    HTableDescriptor desc = new HTableDescriptor(tableName);
-    HColumnDescriptor hcd = new HColumnDescriptor(Bytes.toString(FAM));
-    desc.addFamily(hcd); // If a tableName has no CF's it doesn't get checked
-    createTable(TEST_UTIL, desc, null);
-
-    // We created 1 table, should be fine
-    assertNoErrors(doFsck(conf, false));
-
-    // Now let's mess it up and change the assignment in hbase:meta to
-    // point to a different region server
-    Table meta = connection.getTable(TableName.META_TABLE_NAME, tableExecutorService);
-    Scan scan = new Scan();
-    scan.setStartRow(Bytes.toBytes(tableName+",,"));
-    ResultScanner scanner = meta.getScanner(scan);
-    RegionInfo hri = null;
-
-    Result res = scanner.next();
-    ServerName currServer =
-        ProtobufUtil.parseServerNameFrom(res.getValue(HConstants.CATALOG_FAMILY,
-            HConstants.SERVER_QUALIFIER));
-    long startCode = Bytes.toLong(res.getValue(HConstants.CATALOG_FAMILY,
-        HConstants.STARTCODE_QUALIFIER));
-
-    for (JVMClusterUtil.RegionServerThread rs :
-        TEST_UTIL.getHBaseCluster().getRegionServerThreads()) {
-
-      ServerName sn = rs.getRegionServer().getServerName();
-
-      // When we find a diff RS, change the assignment and break
-      if (!currServer.getHostAndPort().equals(sn.getHostAndPort()) ||
-          startCode != sn.getStartcode()) {
-        Put put = new Put(res.getRow());
-        put.setDurability(Durability.SKIP_WAL);
-        put.addColumn(HConstants.CATALOG_FAMILY, HConstants.SERVER_QUALIFIER,
-            Bytes.toBytes(sn.getHostAndPort()));
-        put.addColumn(HConstants.CATALOG_FAMILY, HConstants.STARTCODE_QUALIFIER,
-            Bytes.toBytes(sn.getStartcode()));
-        meta.put(put);
-        hri = MetaTableAccessor.getRegionInfo(res);
-        break;
-      }
-    }
-
-    // Try to fix the data
-    assertErrors(doFsck(conf, true), new HBaseFsck.ErrorReporter.ERROR_CODE[]{
-        HBaseFsck.ErrorReporter.ERROR_CODE.SERVER_DOES_NOT_MATCH_META});
-
-    TEST_UTIL.getHBaseCluster().getMaster()
-        .getAssignmentManager().waitForAssignment(hri);
-
-    // Should be fixed now
-    assertNoErrors(doFsck(conf, false));
-
-    // comment needed - what is the purpose of this line
-    Table t = connection.getTable(tableName, tableExecutorService);
-    ResultScanner s = t.getScanner(new Scan());
-    s.close();
-    t.close();
-
-    scanner.close();
-    meta.close();
-  }
-
-  /**
-   * This creates and fixes a bad table with a missing region -- hole in meta and data present but
-   * .regioninfo missing (an orphan hdfs region)in the fs. At last we check every row was present
-   * at the correct region.
-   */
-  @Test(timeout = 180000)
-  public void testHDFSRegioninfoMissingAndCheckRegionBoundary() throws Exception {
-    final TableName tableName = TableName.valueOf(name.getMethodName());
-    try {
-      setupTable(tableName);
-      assertEquals(ROWKEYS.length, countRows());
-
-      // Mess it up by leaving a hole in the meta data
-      admin.disableTable(tableName);
-      deleteRegion(conf, tbl.getTableDescriptor(), Bytes.toBytes("B"), Bytes.toBytes("C"), true,
-        true, false, true, RegionInfo.DEFAULT_REPLICA_ID);
-      admin.enableTable(tableName);
-
-      HBaseFsck hbck = doFsck(conf, false);
-      assertErrors(hbck,
-        new HBaseFsck.ErrorReporter.ERROR_CODE[] {
-            HBaseFsck.ErrorReporter.ERROR_CODE.ORPHAN_HDFS_REGION,
-            HBaseFsck.ErrorReporter.ERROR_CODE.NOT_IN_META_OR_DEPLOYED,
-            HBaseFsck.ErrorReporter.ERROR_CODE.HOLE_IN_REGION_CHAIN });
-      // holes are separate from overlap groups
-      assertEquals(0, hbck.getOverlapGroups(tableName).size());
-
-      // fix hole
-      doFsck(conf, true);
-
-      // check that hole fixed
-      assertNoErrors(doFsck(conf, false));
-
-      // check data belong to the correct region,every scan should get one row.
-      for (int i = 0; i < ROWKEYS.length; i++) {
-        if (i != ROWKEYS.length - 1) {
-          assertEquals(1, countRows(ROWKEYS[i], ROWKEYS[i + 1]));
-        } else {
-          assertEquals(1, countRows(ROWKEYS[i], null));
-        }
-      }
-
-    } finally {
-      cleanupTable(tableName);
-    }
-  }
-
-  /**
-   * Creates and fixes a bad table with a successful split that have a deployed
-   * start and end keys
-   */
-  @Test (timeout=180000)
-  public void testSplitAndDupeRegion() throws Exception {
-    TableName table =
-      TableName.valueOf("testSplitAndDupeRegion");
-    Table meta = null;
-
-    try {
-      setupTable(table);
-
-      assertNoErrors(doFsck(conf, false));
-      assertEquals(ROWKEYS.length, countRows());
-
-      // No Catalog Janitor running
-      admin.enableCatalogJanitor(false);
-      meta = connection.getTable(TableName.META_TABLE_NAME, tableExecutorService);
-      HRegionLocation loc = this.connection.getRegionLocation(table, SPLITS[0], false);
-      RegionInfo hriParent = loc.getRegionInfo();
-
-      // Split Region A just before B
-      this.connection.getAdmin().split(table, Bytes.toBytes("A@"));
-      Thread.sleep(1000);
-
-      // We need to make sure the parent region is not in a split state, so we put it in CLOSED state.
-      regionStates.updateRegionState(hriParent, RegionState.State.CLOSED);
-      TEST_UTIL.assignRegion(hriParent);
-      MetaTableAccessor.addRegionToMeta(meta, hriParent);
-      ServerName server = regionStates.getRegionServerOfRegion(hriParent);
-
-      if (server != null)
-        TEST_UTIL.assertRegionOnServer(hriParent, server, REGION_ONLINE_TIMEOUT);
-
-      while (findDeployedHSI(getDeployedHRIs((HBaseAdmin) admin), hriParent) == null) {
-        Thread.sleep(250);
-      }
-
-      LOG.debug("Finished assignment of parent region");
-
-      // TODO why is dupe region different from dupe start keys?
-      HBaseFsck hbck = doFsck(conf, false);
-      assertErrors(hbck, new HBaseFsck.ErrorReporter.ERROR_CODE[] { HBaseFsck.ErrorReporter.ERROR_CODE.DUPE_STARTKEYS,
-        HBaseFsck.ErrorReporter.ERROR_CODE.DUPE_STARTKEYS, HBaseFsck.ErrorReporter.ERROR_CODE.OVERLAP_IN_REGION_CHAIN});
-      assertEquals(3, hbck.getOverlapGroups(table).size());
-
-      // fix the degenerate region.
-      hbck = new HBaseFsck(conf, hbfsckExecutorService);
-      hbck.setDisplayFullReport(); // i.e. -details
-      hbck.setTimeLag(0);
-      hbck.setFixHdfsOverlaps(true);
-      hbck.setRemoveParents(true);
-      hbck.setFixReferenceFiles(true);
-      hbck.setFixHFileLinks(true);
-      hbck.connect();
-      hbck.onlineHbck();
-      hbck.close();
-
-      hbck = doFsck(conf, false);
-
-      assertNoErrors(hbck);
-      assertEquals(0, hbck.getOverlapGroups(table).size());
-      assertEquals(ROWKEYS.length, countRows());
-    } finally {
-      cleanupTable(table);
-    }
-  }
-}

http://git-wip-us.apache.org/repos/asf/hbase/blob/89e2869e/hbase-server/src/test/java/org/apache/hadoop/hbase/util/hbck/TestOfflineMetaRebuildBase.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/util/hbck/TestOfflineMetaRebuildBase.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/util/hbck/TestOfflineMetaRebuildBase.java
deleted file mode 100644
index 1560efe..0000000
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/util/hbck/TestOfflineMetaRebuildBase.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/**
- * 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.util.hbck;
-
-import static org.apache.hadoop.hbase.util.hbck.HbckTestingUtil.assertErrors;
-import static org.apache.hadoop.hbase.util.hbck.HbckTestingUtil.doFsck;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-import java.io.IOException;
-import java.util.Arrays;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.hadoop.fs.FileStatus;
-import org.apache.hadoop.fs.FileSystem;
-import org.apache.hadoop.fs.Path;
-import org.apache.hadoop.hbase.HConstants;
-import org.apache.hadoop.hbase.HTableDescriptor;
-import org.apache.hadoop.hbase.TableName;
-import org.apache.hadoop.hbase.client.Admin;
-import org.apache.hadoop.hbase.client.Connection;
-import org.apache.hadoop.hbase.client.ConnectionFactory;
-import org.apache.hadoop.hbase.testclassification.MediumTests;
-import org.apache.hadoop.hbase.testclassification.MiscTests;
-import org.apache.hadoop.hbase.util.FSUtils;
-import org.apache.hadoop.hbase.util.HBaseFsck;
-import org.apache.hadoop.hbase.util.HBaseFsck.ErrorReporter.ERROR_CODE;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-/**
- * This builds a table, removes info from meta, and then rebuilds meta.
- */
-@Category({MiscTests.class, MediumTests.class})
-public class TestOfflineMetaRebuildBase extends OfflineMetaRebuildTestCore {
-  private static final Log LOG = LogFactory.getLog(TestOfflineMetaRebuildBase.class);
-
-  @SuppressWarnings("deprecation")
-  @Ignore @Test(timeout = 120000) // To fix post HBASE-14614
-  public void testMetaRebuild() throws Exception {
-    wipeOutMeta();
-
-    // is meta really messed up?
-    assertEquals(1, scanMeta());
-    assertErrors(doFsck(conf, false),
-        new ERROR_CODE[] {
-            ERROR_CODE.NOT_IN_META_OR_DEPLOYED,
-            ERROR_CODE.NOT_IN_META_OR_DEPLOYED,
-            ERROR_CODE.NOT_IN_META_OR_DEPLOYED,
-            ERROR_CODE.NOT_IN_META_OR_DEPLOYED});
-    // Note, would like to check # of tables, but this takes a while to time
-    // out.
-
-    // shutdown the minicluster
-    TEST_UTIL.shutdownMiniHBaseCluster();
-    TEST_UTIL.shutdownMiniZKCluster();
-
-    // rebuild meta table from scratch
-    HBaseFsck fsck = new HBaseFsck(conf);
-    assertTrue(fsck.rebuildMeta(false));
-    assertTrue("HBCK meta recovery WAL directory exist.", validateHBCKMetaRecoveryWALDir());
-
-    // bring up the minicluster
-    TEST_UTIL.startMiniZKCluster();
-    TEST_UTIL.restartHBaseCluster(3);
-    try (Connection connection = ConnectionFactory.createConnection(TEST_UTIL.getConfiguration())) {
-      Admin admin = connection.getAdmin();
-      if (admin.isTableDisabled(table))
-        admin.enableTable(table);
-      LOG.info("Waiting for no more RIT");
-      TEST_UTIL.waitUntilNoRegionsInTransition(60000);
-      LOG.info("No more RIT in ZK, now doing final test verification");
-
-      // everything is good again.
-      assertEquals(5, scanMeta()); // including table state rows
-      TableName[] tableNames = TEST_UTIL.getAdmin().listTableNames();
-      for (TableName tableName : tableNames) {
-        HTableDescriptor tableDescriptor = TEST_UTIL.getAdmin().getTableDescriptor(tableName);
-        assertNotNull(tableDescriptor);
-        assertTrue(TEST_UTIL.getAdmin().isTableEnabled(tableName));
-      }
-      HTableDescriptor[] htbls = admin.listTables();
-      LOG.info("Tables present after restart: " + Arrays.toString(htbls));
-      assertEquals(1, htbls.length);
-    }
-
-    assertErrors(doFsck(conf, false), new ERROR_CODE[] {});
-    LOG.info("Table " + table + " has " + tableRowCount(conf, table) + " entries.");
-    assertEquals(16, tableRowCount(conf, table));
-  }
-
-  /**
-   * Validate whether Meta recovery empty WAL directory is removed.
-   * @return True if directory is removed otherwise false.
-   */
-  private boolean validateHBCKMetaRecoveryWALDir() throws IOException {
-    Path rootdir = FSUtils.getRootDir(TEST_UTIL.getConfiguration());
-    Path walLogDir = new Path(rootdir, HConstants.HREGION_LOGDIR_NAME);
-    FileSystem fs = TEST_UTIL.getTestFileSystem();
-    FileStatus[] walFiles = FSUtils.listStatus(fs, walLogDir, null);
-    assertNotNull(walFiles);
-    for (FileStatus fsStat : walFiles) {
-      if (fsStat.isDirectory() && fsStat.getPath().getName().startsWith("hbck-meta-recovery-")) {
-        return false;
-      }
-    }
-    return true;
-  }
-}

http://git-wip-us.apache.org/repos/asf/hbase/blob/89e2869e/hbase-server/src/test/java/org/apache/hadoop/hbase/util/hbck/TestOfflineMetaRebuildHole.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/util/hbck/TestOfflineMetaRebuildHole.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/util/hbck/TestOfflineMetaRebuildHole.java
deleted file mode 100644
index 60c4b25..0000000
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/util/hbck/TestOfflineMetaRebuildHole.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/**
- * 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.util.hbck;
-
-import static org.apache.hadoop.hbase.util.hbck.HbckTestingUtil.assertErrors;
-import static org.apache.hadoop.hbase.util.hbck.HbckTestingUtil.doFsck;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-
-import java.util.Arrays;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.hadoop.hbase.HTableDescriptor;
-import org.apache.hadoop.hbase.testclassification.MediumTests;
-import org.apache.hadoop.hbase.testclassification.MiscTests;
-import org.apache.hadoop.hbase.util.HBaseFsck;
-import org.apache.hadoop.hbase.util.HBaseFsck.ErrorReporter.ERROR_CODE;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-
-/**
- * This builds a table, removes info from meta, and then fails when attempting
- * to rebuild meta.
- */
-@Ignore
-@Category({MiscTests.class, MediumTests.class})
-public class TestOfflineMetaRebuildHole extends OfflineMetaRebuildTestCore {
-  private final static Log LOG = LogFactory.getLog(TestOfflineMetaRebuildHole.class);
-
-  @Test(timeout = 120000)
-  public void testMetaRebuildHoleFail() throws Exception {
-    // Fully remove a meta entry and hdfs region
-    byte[] startKey = splits[1];
-    byte[] endKey = splits[2];
-    deleteRegion(conf, htbl, startKey, endKey);
-
-    wipeOutMeta();
-
-    // is meta really messed up?
-    assertEquals(1, scanMeta());
-    assertErrors(doFsck(conf, false), new ERROR_CODE[] {
-        ERROR_CODE.NOT_IN_META_OR_DEPLOYED,
-        ERROR_CODE.NOT_IN_META_OR_DEPLOYED,
-        ERROR_CODE.NOT_IN_META_OR_DEPLOYED});
-    // Note, would like to check # of tables, but this takes a while to time
-    // out.
-
-    // shutdown the minicluster
-    TEST_UTIL.shutdownMiniHBaseCluster();
-    TEST_UTIL.shutdownMiniZKCluster();
-
-    // attempt to rebuild meta table from scratch
-    HBaseFsck fsck = new HBaseFsck(conf);
-    assertFalse(fsck.rebuildMeta(false));
-    fsck.close();
-
-    // bring up the minicluster
-    TEST_UTIL.startMiniZKCluster(); // tables seem enabled by default
-    TEST_UTIL.restartHBaseCluster(3);
-
-    LOG.info("Waiting for no more RIT");
-    TEST_UTIL.waitUntilNoRegionsInTransition(60000);
-
-    // Meta still messed up.
-    assertEquals(1, scanMeta());
-    HTableDescriptor[] htbls = getTables(TEST_UTIL.getConfiguration());
-    LOG.info("Tables present after restart: " + Arrays.toString(htbls));
-
-    // After HBASE-451 HBaseAdmin.listTables() gets table descriptors from FS,
-    // so the table is still present and this should be 1.
-    assertEquals(1, htbls.length);
-    assertErrors(doFsck(conf, false), new ERROR_CODE[] {
-        ERROR_CODE.NOT_IN_META_OR_DEPLOYED,
-        ERROR_CODE.NOT_IN_META_OR_DEPLOYED,
-        ERROR_CODE.NOT_IN_META_OR_DEPLOYED});
-  }
-}

http://git-wip-us.apache.org/repos/asf/hbase/blob/89e2869e/hbase-server/src/test/java/org/apache/hadoop/hbase/util/hbck/TestOfflineMetaRebuildOverlap.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/util/hbck/TestOfflineMetaRebuildOverlap.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/util/hbck/TestOfflineMetaRebuildOverlap.java
deleted file mode 100644
index 9bf2212..0000000
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/util/hbck/TestOfflineMetaRebuildOverlap.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/**
- * 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.util.hbck;
-
-import static org.apache.hadoop.hbase.util.hbck.HbckTestingUtil.assertErrors;
-import static org.apache.hadoop.hbase.util.hbck.HbckTestingUtil.doFsck;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-
-import java.util.Arrays;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.hadoop.hbase.HTableDescriptor;
-import org.apache.hadoop.hbase.testclassification.MediumTests;
-import org.apache.hadoop.hbase.testclassification.MiscTests;
-import org.apache.hadoop.hbase.util.HBaseFsck;
-import org.apache.hadoop.hbase.util.HBaseFsck.ErrorReporter.ERROR_CODE;
-import org.apache.hadoop.hbase.util.HBaseFsck.HbckInfo;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-
-import org.apache.hadoop.hbase.shaded.com.google.common.collect.Multimap;
-
-/**
- * This builds a table, builds an overlap, and then fails when attempting to
- * rebuild meta.
- */
-@Ignore
-@Category({MiscTests.class, MediumTests.class})
-public class TestOfflineMetaRebuildOverlap extends OfflineMetaRebuildTestCore {
-  private final static Log LOG = LogFactory.getLog(TestOfflineMetaRebuildOverlap.class);
-
-  @Test(timeout = 120000)
-  public void testMetaRebuildOverlapFail() throws Exception {
-    // Add a new .regioninfo meta entry in hdfs
-    byte[] startKey = splits[0];
-    byte[] endKey = splits[2];
-    createRegion(conf, htbl, startKey, endKey);
-
-    wipeOutMeta();
-
-    // is meta really messed up?
-    assertEquals(1, scanMeta());
-    assertErrors(doFsck(conf, false),
-        new ERROR_CODE[] {
-            ERROR_CODE.NOT_IN_META_OR_DEPLOYED,
-            ERROR_CODE.NOT_IN_META_OR_DEPLOYED,
-            ERROR_CODE.NOT_IN_META_OR_DEPLOYED,
-            ERROR_CODE.NOT_IN_META_OR_DEPLOYED});
-    // Note, would like to check # of tables, but this takes a while to time
-    // out.
-
-    // shutdown the minicluster
-    TEST_UTIL.shutdownMiniHBaseCluster();
-    TEST_UTIL.shutdownMiniZKCluster();
-
-    // attempt to rebuild meta table from scratch
-    HBaseFsck fsck = new HBaseFsck(conf);
-    assertFalse(fsck.rebuildMeta(false));
-
-    Multimap<byte[], HbckInfo> problems = fsck.getOverlapGroups(table);
-    assertEquals(1, problems.keySet().size());
-    assertEquals(3, problems.size());
-
-    // bring up the minicluster
-    TEST_UTIL.startMiniZKCluster(); // tables seem enabled by default
-    TEST_UTIL.restartHBaseCluster(3);
-
-    LOG.info("Waiting for no more RIT");
-    TEST_UTIL.waitUntilNoRegionsInTransition(60000);
-    LOG.info("No more RIT in ZK, now doing final test verification");
-
-    // Meta still messed up.
-    assertEquals(1, scanMeta());
-    HTableDescriptor[] htbls = getTables(TEST_UTIL.getConfiguration());
-    LOG.info("Tables present after restart: " + Arrays.toString(htbls));
-
-    // After HBASE-451 HBaseAdmin.listTables() gets table descriptors from FS,
-    // so the table is still present and this should be 1.
-    assertEquals(1, htbls.length);
-    assertErrors(doFsck(conf, false),
-        new ERROR_CODE[] {
-            ERROR_CODE.NOT_IN_META_OR_DEPLOYED,
-            ERROR_CODE.NOT_IN_META_OR_DEPLOYED,
-            ERROR_CODE.NOT_IN_META_OR_DEPLOYED,
-            ERROR_CODE.NOT_IN_META_OR_DEPLOYED});
-  }
-}