You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by jx...@apache.org on 2012/08/27 23:05:39 UTC

svn commit: r1377862 - in /hbase/trunk/hbase-server/src: main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java test/java/org/apache/hadoop/hbase/client/TestAdmin.java

Author: jxiang
Date: Mon Aug 27 21:05:38 2012
New Revision: 1377862

URL: http://svn.apache.org/viewvc?rev=1377862&view=rev
Log:
HBASE-6643 Accept encoded region name in compacting/spliting region from shell

Modified:
    hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java
    hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAdmin.java

Modified: hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java?rev=1377862&r1=1377861&r2=1377862&view=diff
==============================================================================
--- hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java (original)
+++ hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java Mon Aug 27 21:05:38 2012
@@ -28,6 +28,7 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.concurrent.Callable;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
 import java.util.regex.Pattern;
 
 import org.apache.commons.logging.Log;
@@ -100,7 +101,6 @@ import org.apache.hadoop.hbase.regionser
 import org.apache.hadoop.hbase.util.Addressing;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.hbase.util.Pair;
-import org.apache.hadoop.hbase.util.Writables;
 import org.apache.hadoop.ipc.RemoteException;
 import org.apache.hadoop.util.StringUtils;
 import org.apache.zookeeper.KeeperException;
@@ -409,11 +409,13 @@ public class HBaseAdmin implements Abort
         MetaScannerVisitor visitor = new MetaScannerVisitorBase() {
           @Override
           public boolean processRow(Result rowResult) throws IOException {
-            HRegionInfo info = Writables.getHRegionInfoOrNull(
-              rowResult.getValue(HConstants.CATALOG_FAMILY,
-              HConstants.REGIONINFO_QUALIFIER));
-            //If regioninfo is null, skip this row
-            if (null == info) {
+            if (rowResult == null || rowResult.size() <= 0) {
+              return true;
+            }
+            HRegionInfo info = MetaReader.parseHRegionInfoFromCatalogResult(
+              rowResult, HConstants.REGIONINFO_QUALIFIER);
+            if (info == null) {
+              LOG.warn("No serialized HRegionInfo in " + rowResult);
               return true;
             }
             if (!(Bytes.equals(info.getTableName(), desc.getName()))) {
@@ -1228,16 +1230,15 @@ public class HBaseAdmin implements Abort
   public void flush(final byte [] tableNameOrRegionName)
   throws IOException, InterruptedException {
     CatalogTracker ct = getCatalogTracker();
-    boolean isRegionName = isRegionName(tableNameOrRegionName, ct);
     try {
-      if (isRegionName) {
-        Pair<HRegionInfo, ServerName> pair =
-          MetaReader.getRegion(ct, tableNameOrRegionName);
-        if (pair == null || pair.getSecond() == null) {
+      Pair<HRegionInfo, ServerName> regionServerPair
+        = getRegion(tableNameOrRegionName, ct);
+      if (regionServerPair != null) {
+        if (regionServerPair.getSecond() == null) {
           LOG.info("No server in .META. for " +
-            Bytes.toStringBinary(tableNameOrRegionName) + "; pair=" + pair);
+            Bytes.toStringBinary(tableNameOrRegionName) + "; pair=" + regionServerPair);
         } else {
-          flush(pair.getSecond(), pair.getFirst());
+          flush(regionServerPair.getSecond(), regionServerPair.getFirst());
         }
       } else {
         final String tableName = tableNameString(tableNameOrRegionName, ct);
@@ -1340,14 +1341,14 @@ public class HBaseAdmin implements Abort
   throws IOException, InterruptedException {
     CatalogTracker ct = getCatalogTracker();
     try {
-      if (isRegionName(tableNameOrRegionName, ct)) {
-        Pair<HRegionInfo, ServerName> pair =
-          MetaReader.getRegion(ct, tableNameOrRegionName);
-        if (pair == null || pair.getSecond() == null) {
+      Pair<HRegionInfo, ServerName> regionServerPair
+        = getRegion(tableNameOrRegionName, ct);
+      if (regionServerPair != null) {
+        if (regionServerPair.getSecond() == null) {
           LOG.info("No server in .META. for " +
-            Bytes.toStringBinary(tableNameOrRegionName) + "; pair=" + pair);
+            Bytes.toStringBinary(tableNameOrRegionName) + "; pair=" + regionServerPair);
         } else {
-          compact(pair.getSecond(), pair.getFirst(), major);
+          compact(regionServerPair.getSecond(), regionServerPair.getFirst(), major);
         }
       } else {
         final String tableName = tableNameString(tableNameOrRegionName, ct);
@@ -1622,15 +1623,14 @@ public class HBaseAdmin implements Abort
       final byte [] splitPoint) throws IOException, InterruptedException {
     CatalogTracker ct = getCatalogTracker();
     try {
-      if (isRegionName(tableNameOrRegionName, ct)) {
-        // Its a possible region name.
-        Pair<HRegionInfo, ServerName> pair =
-          MetaReader.getRegion(ct, tableNameOrRegionName);
-        if (pair == null || pair.getSecond() == null) {
+      Pair<HRegionInfo, ServerName> regionServerPair
+        = getRegion(tableNameOrRegionName, ct);
+      if (regionServerPair != null) {
+        if (regionServerPair.getSecond() == null) {
           LOG.info("No server in .META. for " +
-            Bytes.toStringBinary(tableNameOrRegionName) + "; pair=" + pair);
+            Bytes.toStringBinary(tableNameOrRegionName) + "; pair=" + regionServerPair);
         } else {
-          split(pair.getSecond(), pair.getFirst(), splitPoint);
+          split(regionServerPair.getSecond(), regionServerPair.getFirst(), splitPoint);
         }
       } else {
         final String tableName = tableNameString(tableNameOrRegionName, ct);
@@ -1685,19 +1685,45 @@ public class HBaseAdmin implements Abort
   /**
    * @param tableNameOrRegionName Name of a table or name of a region.
    * @param ct A {@link CatalogTracker} instance (caller of this method usually has one).
-   * @return True if <code>tableNameOrRegionName</code> is a verified region
-   * name (we call {@link  MetaReader#getRegion( CatalogTracker, byte[])}
-   *  else false.
+   * @return a pair of HRegionInfo and ServerName if <code>tableNameOrRegionName</code> is
+   *  a verified region name (we call {@link  MetaReader#getRegion( CatalogTracker, byte[])}
+   *  else null.
    * Throw an exception if <code>tableNameOrRegionName</code> is null.
    * @throws IOException
    */
-  private boolean isRegionName(final byte[] tableNameOrRegionName,
-      CatalogTracker ct)
-  throws IOException {
+  Pair<HRegionInfo, ServerName> getRegion(final byte[] tableNameOrRegionName,
+      final CatalogTracker ct) throws IOException {
     if (tableNameOrRegionName == null) {
       throw new IllegalArgumentException("Pass a table name or region name");
     }
-    return (MetaReader.getRegion(ct, tableNameOrRegionName) != null);
+    Pair<HRegionInfo, ServerName> pair = MetaReader.getRegion(ct, tableNameOrRegionName);
+    if (pair == null) {
+      final AtomicReference<Pair<HRegionInfo, ServerName>> result =
+        new AtomicReference<Pair<HRegionInfo, ServerName>>(null);
+      final String encodedName = Bytes.toString(tableNameOrRegionName);
+      MetaScannerVisitor visitor = new MetaScannerVisitorBase() {
+        @Override
+        public boolean processRow(Result data) throws IOException {
+          if (data == null || data.size() <= 0) {
+            return true;
+          }
+          HRegionInfo info = MetaReader.parseHRegionInfoFromCatalogResult(
+            data, HConstants.REGIONINFO_QUALIFIER);
+          if (info == null) {
+            LOG.warn("No serialized HRegionInfo in " + data);
+            return true;
+          }
+          if (!encodedName.equals(info.getEncodedName())) return true;
+          ServerName sn = MetaReader.getServerNameFromCatalogResult(data);
+          result.set(new Pair<HRegionInfo, ServerName>(info, sn));
+          return false; // found the region, stop
+        }
+      };
+
+      MetaScanner.metaScan(conf, visitor);
+      pair = result.get();
+    }
+    return pair;
   }
 
   /**
@@ -1962,18 +1988,18 @@ public class HBaseAdmin implements Abort
     CompactionState state = CompactionState.NONE;
     CatalogTracker ct = getCatalogTracker();
     try {
-      if (isRegionName(tableNameOrRegionName, ct)) {
-        Pair<HRegionInfo, ServerName> pair =
-          MetaReader.getRegion(ct, tableNameOrRegionName);
-        if (pair == null || pair.getSecond() == null) {
+      Pair<HRegionInfo, ServerName> regionServerPair
+        = getRegion(tableNameOrRegionName, ct);
+      if (regionServerPair != null) {
+        if (regionServerPair.getSecond() == null) {
           LOG.info("No server in .META. for " +
-            Bytes.toStringBinary(tableNameOrRegionName) + "; pair=" + pair);
+            Bytes.toStringBinary(tableNameOrRegionName) + "; pair=" + regionServerPair);
         } else {
-          ServerName sn = pair.getSecond();
+          ServerName sn = regionServerPair.getSecond();
           AdminProtocol admin =
             this.connection.getAdmin(sn.getHostname(), sn.getPort());
           GetRegionInfoRequest request = RequestConverter.buildGetRegionInfoRequest(
-            pair.getFirst().getRegionName(), true);
+            regionServerPair.getFirst().getRegionName(), true);
           GetRegionInfoResponse response = admin.getRegionInfo(null, request);
           return response.getCompactionState();
         }

Modified: hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAdmin.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAdmin.java?rev=1377862&r1=1377861&r2=1377862&view=diff
==============================================================================
--- hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAdmin.java (original)
+++ hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAdmin.java Mon Aug 27 21:05:38 2012
@@ -40,6 +40,7 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.*;
+import org.apache.hadoop.hbase.catalog.CatalogTracker;
 import org.apache.hadoop.hbase.executor.EventHandler;
 import org.apache.hadoop.hbase.executor.EventHandler.EventType;
 import org.apache.hadoop.hbase.executor.ExecutorService;
@@ -52,6 +53,7 @@ import org.apache.hadoop.hbase.regionser
 import org.apache.hadoop.hbase.regionserver.wal.HLogUtilsForTests;
 import org.apache.hadoop.hbase.InvalidFamilyOperationException;
 import org.apache.hadoop.hbase.util.Bytes;
+import org.apache.hadoop.hbase.util.Pair;
 import org.apache.hadoop.hbase.zookeeper.ZKTable;
 import org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher;
 import org.junit.*;
@@ -1610,7 +1612,29 @@ public class TestAdmin {
     htd.addFamily(hcd);
     TEST_UTIL.getHBaseAdmin().createTable(htd);
   }
-  
+
+  @Test
+  public void testGetRegion() throws Exception {
+    final String name = "testGetRegion";
+    LOG.info("Started " + name);
+    final byte [] nameBytes = Bytes.toBytes(name);
+    HTable t = TEST_UTIL.createTable(nameBytes, HConstants.CATALOG_FAMILY);
+    TEST_UTIL.createMultiRegions(t, HConstants.CATALOG_FAMILY);
+    CatalogTracker ct = new CatalogTracker(TEST_UTIL.getConfiguration());
+    ct.start();
+    try {
+      HRegionLocation regionLocation = t.getRegionLocation("mmm");
+      HRegionInfo region = regionLocation.getRegionInfo();
+      byte[] regionName = region.getRegionName();
+      Pair<HRegionInfo, ServerName> pair = admin.getRegion(regionName, ct);
+      assertTrue(Bytes.equals(regionName, pair.getFirst().getRegionName()));
+      pair = admin.getRegion(region.getEncodedNameAsBytes(), ct);
+      assertTrue(Bytes.equals(regionName, pair.getFirst().getRegionName()));
+    } finally {
+      ct.stop();
+    }
+  }
+
   @org.junit.Rule
   public org.apache.hadoop.hbase.ResourceCheckerJUnitRule cu =
     new org.apache.hadoop.hbase.ResourceCheckerJUnitRule();