Author: stack
Date: Thu Sep  2 20:39:41 2010
New Revision: 992110

URL: http://svn.apache.org/viewvc?rev=992110&view=rev
Log:
HBASE-2943 major_compact (and other admin commands) broken for .META.

Added:
    hbase/trunk/src/test/java/org/apache/hadoop/hbase/catalog/
    
hbase/trunk/src/test/java/org/apache/hadoop/hbase/catalog/TestMetaReaderEditor.java
Modified:
    hbase/trunk/CHANGES.txt
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/avro/AvroServer.java
    
hbase/trunk/src/main/java/org/apache/hadoop/hbase/catalog/CatalogTracker.java
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/catalog/MetaReader.java
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/client/HConnection.java
    
hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/handler/ServerShutdownHandler.java
    
hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/thrift/ThriftServer.java

Modified: hbase/trunk/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/hbase/trunk/CHANGES.txt?rev=992110&r1=992109&r2=992110&view=diff
==============================================================================
--- hbase/trunk/CHANGES.txt (original)
+++ hbase/trunk/CHANGES.txt Thu Sep  2 20:39:41 2010
@@ -500,6 +500,7 @@ Release 0.21.0 - Unreleased
                append by config or by missing lib/feature
    HBASE-2799  "Append not enabled" warning should not show if hbase
                root dir isn't on DFS
+   HBASE-2943  major_compact (and other admin commands) broken for .META.
 
   IMPROVEMENTS
    HBASE-1760  Cleanup TODOs in HTable

Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/avro/AvroServer.java
URL: 
http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/avro/AvroServer.java?rev=992110&r1=992109&r2=992110&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/avro/AvroServer.java 
(original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/avro/AvroServer.java Thu 
Sep  2 20:39:41 2010
@@ -312,6 +312,10 @@ public class AvroServer {
       try {
        admin.flush(Bytes.toBytes(table));
        return null;
+      } catch (InterruptedException e) {
+       AIOError ioe = new AIOError();
+       ioe.message = new Utf8(e.getMessage());
+        throw ioe;
       } catch (IOException e) {
        AIOError ioe = new AIOError();
        ioe.message = new Utf8(e.getMessage());
@@ -324,6 +328,10 @@ public class AvroServer {
       try {
        admin.split(Bytes.toBytes(table));
        return null;
+      } catch (InterruptedException e) {
+       AIOError ioe = new AIOError();
+       ioe.message = new Utf8(e.getMessage());
+        throw ioe;
       } catch (IOException e) {
        AIOError ioe = new AIOError();
        ioe.message = new Utf8(e.getMessage());

Modified: 
hbase/trunk/src/main/java/org/apache/hadoop/hbase/catalog/CatalogTracker.java
URL: 
http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/catalog/CatalogTracker.java?rev=992110&r1=992109&r2=992110&view=diff
==============================================================================
--- 
hbase/trunk/src/main/java/org/apache/hadoop/hbase/catalog/CatalogTracker.java 
(original)
+++ 
hbase/trunk/src/main/java/org/apache/hadoop/hbase/catalog/CatalogTracker.java 
Thu Sep  2 20:39:41 2010
@@ -48,6 +48,7 @@ import org.apache.zookeeper.KeeperExcept
  * be explicitly set.  Instead, ZooKeeper is used to learn of the availability
  * and location of ROOT.  ROOT is used to learn of the location of META.  If 
not
  * available in ROOT, ZooKeeper is used to monitor for a new location of META.
+ * <p>Call {...@link #start()} to start up operation.
  */
 public class CatalogTracker {
   private static final Log LOG = LogFactory.getLog(CatalogTracker.class);
@@ -80,6 +81,21 @@ public class CatalogTracker {
    * @throws IOException 
    */
   public CatalogTracker(final ZooKeeperWatcher zk,
+      final ServerConnection connection, final Abortable abortable)
+  throws IOException {
+    this(zk, connection, abortable, 0);
+  }
+
+  /**
+   * Constructs the catalog tracker.  Find current state of catalog tables and
+   * begin active tracking by executing {...@link #start()}.
+   * @param zk
+   * @param connection server connection
+   * @param abortable if fatal exception
+   * @param defaultTimeout Timeout to use.
+   * @throws IOException 
+   */
+  public CatalogTracker(final ZooKeeperWatcher zk,
       final ServerConnection connection, final Abortable abortable,
       final int defaultTimeout)
   throws IOException {
@@ -285,7 +301,7 @@ public class CatalogTracker {
       }
       if(getMetaServerConnection(true) == null) {
         throw new NotAllMetaRegionsOnlineException(
-            "Timed out (" + timeout + "ms");
+            "Timed out (" + timeout + "ms)");
       }
       return metaLocation;
     }

Modified: 
hbase/trunk/src/main/java/org/apache/hadoop/hbase/catalog/MetaReader.java
URL: 
http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/catalog/MetaReader.java?rev=992110&r1=992109&r2=992110&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/catalog/MetaReader.java 
(original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/catalog/MetaReader.java 
Thu Sep  2 20:39:41 2010
@@ -24,14 +24,14 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.NavigableMap;
-import java.util.NavigableSet;
 import java.util.TreeMap;
-import java.util.TreeSet;
 
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.HRegionInfo;
 import org.apache.hadoop.hbase.HServerAddress;
 import org.apache.hadoop.hbase.HServerInfo;
+import org.apache.hadoop.hbase.HTableDescriptor;
+import org.apache.hadoop.hbase.NotAllMetaRegionsOnlineException;
 import org.apache.hadoop.hbase.client.Get;
 import org.apache.hadoop.hbase.client.Result;
 import org.apache.hadoop.hbase.client.Scan;
@@ -47,6 +47,73 @@ import org.apache.hadoop.hbase.util.Writ
  * catalogs.
  */
 public class MetaReader {
+  public static final byte [] META_REGION_PREFIX;
+  static {
+    // Copy the prefix from FIRST_META_REGIONINFO into META_REGION_PREFIX.
+    // FIRST_META_REGIONINFO == '.META.,,1'.  META_REGION_PREFIX == '.META.,'
+    int len = HRegionInfo.FIRST_META_REGIONINFO.getRegionName().length - 2;
+    META_REGION_PREFIX = new byte [len];
+    System.arraycopy(HRegionInfo.FIRST_META_REGIONINFO.getRegionName(), 0,
+      META_REGION_PREFIX, 0, len);
+  }
+
+  /**
+   * @param ct
+   * @param tableName A user tablename or a .META. table name.
+   * @return Interface on to server hosting the <code>-ROOT-</code> or
+   * <code>.META.</code> regions.
+   * @throws NotAllMetaRegionsOnlineException
+   * @throws IOException
+   */
+  private static HRegionInterface getCatalogRegionInterface(final 
CatalogTracker ct,
+      final byte [] tableName)
+  throws NotAllMetaRegionsOnlineException, IOException {
+    return Bytes.equals(HConstants.META_TABLE_NAME, tableName)?
+      ct.waitForRootServerConnectionDefault():
+      ct.waitForMetaServerConnectionDefault();
+  }
+
+  /**
+   * @param tableName
+   * @return Returns region name to look in for regions for 
<code>tableName</code>;
+   * e.g. if we are looking for <code>.META.</code> regions, we need to look
+   * in the <code>-ROOT-</code> region, else if a user table, we need to look
+   * in the <code>.META.</code> region.
+   */
+  private static byte [] getCatalogRegionNameForTable(final byte [] tableName) 
{
+    return Bytes.equals(HConstants.META_TABLE_NAME, tableName)?
+      HRegionInfo.ROOT_REGIONINFO.getRegionName():
+      HRegionInfo.FIRST_META_REGIONINFO.getRegionName();
+  }
+
+  /**
+   * @param regionName
+   * @return Returns region name to look in for <code>regionName</code>;
+   * e.g. if we are looking for <code>.META.,,1</code> region, we need to look
+   * in <code>-ROOT-</code> region, else if a user region, we need to look
+   * in the <code>.META.,,1</code> region.
+   */
+  private static byte [] getCatalogRegionNameForRegion(final byte [] 
regionName) {
+    return isMetaRegion(regionName)?
+      HRegionInfo.ROOT_REGIONINFO.getRegionName():
+      HRegionInfo.FIRST_META_REGIONINFO.getRegionName();
+  }
+
+  /**
+   * @param regionName
+   * @return True if <code>regionName</code> is from <code>.META.</code> table.
+   */
+  private static boolean isMetaRegion(final byte [] regionName) {
+    if (regionName.length < META_REGION_PREFIX.length + 2 /* ',', + '1' */) {
+      // Can't be meta table region.
+      return false;
+    }
+    // Compare the prefix of regionName.  If it matches META_REGION_PREFIX 
prefix,
+    // then this is region from .META. table.
+    return Bytes.compareTo(regionName, 0, META_REGION_PREFIX.length,
+      META_REGION_PREFIX, 0, META_REGION_PREFIX.length) == 0;
+  }
+
   /**
    * Performs a full scan of <code>.META.</code>.
    * <p>
@@ -57,8 +124,7 @@ public class MetaReader {
    * @return map of regions to their currently assigned server
    * @throws IOException
    */
-  public static Map<HRegionInfo,HServerAddress> fullScan(
-      CatalogTracker catalogTracker)
+  public static Map<HRegionInfo,HServerAddress> fullScan(CatalogTracker 
catalogTracker)
   throws IOException {
     HRegionInterface metaServer =
       catalogTracker.waitForMetaServerConnectionDefault();
@@ -105,6 +171,7 @@ public class MetaReader {
   public static HServerAddress readRegionLocation(CatalogTracker 
catalogTracker,
       byte [] regionName)
   throws IOException {
+    if (isMetaRegion(regionName)) throw new IllegalArgumentException("See 
readMetaLocation");
     return readLocation(catalogTracker.waitForMetaServerConnectionDefault(),
         CatalogTracker.META_REGION, regionName);
   }
@@ -155,14 +222,19 @@ public class MetaReader {
   throws IOException {
     Get get = new Get(regionName);
     get.addFamily(HConstants.CATALOG_FAMILY);
-    Result r = catalogTracker.waitForMetaServerConnectionDefault().get(
-        CatalogTracker.META_REGION, get);
+    byte [] meta = getCatalogRegionNameForRegion(regionName);
+    Result r = catalogTracker.waitForMetaServerConnectionDefault().get(meta, 
get);
     if(r == null || r.isEmpty()) {
       return null;
     }
     return metaRowToRegionPair(r);
   }
 
+  /**
+   * @param data A .META. table row.
+   * @return A pair of the regioninfo and the server address from 
<code>data</code>.
+   * @throws IOException
+   */
   public static Pair<HRegionInfo, HServerAddress> metaRowToRegionPair(
       Result data) throws IOException {
     HRegionInfo info = Writables.getHRegionInfo(
@@ -188,6 +260,11 @@ public class MetaReader {
   public static boolean tableExists(CatalogTracker catalogTracker,
       String tableName)
   throws IOException {
+    if (tableName.equals(HTableDescriptor.ROOT_TABLEDESC.getNameAsString()) ||
+        tableName.equals(HTableDescriptor.META_TABLEDESC.getNameAsString())) {
+      // Catalog tables always exist.
+      return true;
+    }
     HRegionInterface metaServer =
       catalogTracker.waitForMetaServerConnectionDefault();
     byte[] firstRowInTable = Bytes.toBytes(tableName + ",,");
@@ -213,24 +290,37 @@ public class MetaReader {
   }
 
   /**
-   * Gets all of the regions of the specified table from META.
+   * Gets all of the regions of the specified table.
    * @param catalogTracker
    * @param tableName
-   * @return
+   * @return Ordered list of {...@link HRegionInfo}.
    * @throws IOException
    */
   public static List<HRegionInfo> getTableRegions(CatalogTracker 
catalogTracker,
       byte [] tableName)
   throws IOException {
+    if (Bytes.equals(tableName, HConstants.ROOT_TABLE_NAME)) {
+      // If root, do a bit of special handling.
+      List<HRegionInfo> list = new ArrayList<HRegionInfo>();
+      list.add(HRegionInfo.ROOT_REGIONINFO);
+      return list;
+    } else if (Bytes.equals(tableName, HConstants.ROOT_TABLE_NAME)) {
+      // Same for .META. table
+      List<HRegionInfo> list = new ArrayList<HRegionInfo>();
+      list.add(HRegionInfo.FIRST_META_REGIONINFO);
+      return list;
+    }
+
+    // Its a user table.
     HRegionInterface metaServer =
-      catalogTracker.waitForMetaServerConnectionDefault();
+      getCatalogRegionInterface(catalogTracker, tableName);
     List<HRegionInfo> regions = new ArrayList<HRegionInfo>();
     String tableString = Bytes.toString(tableName);
     byte[] firstRowInTable = Bytes.toBytes(tableString + ",,");
     Scan scan = new Scan(firstRowInTable);
     scan.addColumn(HConstants.CATALOG_FAMILY, HConstants.REGIONINFO_QUALIFIER);
-    long scannerid = metaServer.openScanner(
-        HRegionInfo.FIRST_META_REGIONINFO.getRegionName(), scan);
+    long scannerid =
+      metaServer.openScanner(getCatalogRegionNameForTable(tableName), scan);
     try {
       Result data;
       while((data = metaServer.next(scannerid)) != null) {
@@ -251,18 +341,34 @@ public class MetaReader {
     }
   }
 
+  /**
+   * @param catalogTracker
+   * @param tableName
+   * @return Return list of regioninfos and server addresses.
+   * @throws IOException
+   * @throws InterruptedException
+   */
   public static List<Pair<HRegionInfo, HServerAddress>>
   getTableRegionsAndLocations(CatalogTracker catalogTracker, String tableName)
-  throws IOException {
+  throws IOException, InterruptedException {
+    byte [] tableNameBytes = Bytes.toBytes(tableName);
+    if (Bytes.equals(tableNameBytes, HConstants.ROOT_TABLE_NAME)) {
+      // If root, do a bit of special handling.
+      HServerAddress hsa = catalogTracker.getRootLocation();
+      List<Pair<HRegionInfo, HServerAddress>> list =
+        new ArrayList<Pair<HRegionInfo, HServerAddress>>();
+      list.add(new Pair<HRegionInfo, 
HServerAddress>(HRegionInfo.ROOT_REGIONINFO, hsa));
+      return list;
+    }
     HRegionInterface metaServer =
-      catalogTracker.waitForMetaServerConnectionDefault();
+      getCatalogRegionInterface(catalogTracker, tableNameBytes);
     List<Pair<HRegionInfo, HServerAddress>> regions =
       new ArrayList<Pair<HRegionInfo, HServerAddress>>();
     byte[] firstRowInTable = Bytes.toBytes(tableName + ",,");
     Scan scan = new Scan(firstRowInTable);
     scan.addFamily(HConstants.CATALOG_FAMILY);
-    long scannerid = metaServer.openScanner(
-        HRegionInfo.FIRST_META_REGIONINFO.getRegionName(), scan);
+    long scannerid =
+      metaServer.openScanner(getCatalogRegionNameForTable(tableNameBytes), 
scan);
     try {
       Result data;
       while((data = metaServer.next(scannerid)) != null) {
@@ -282,8 +388,15 @@ public class MetaReader {
     }
   }
 
+  /**
+   * @param catalogTracker
+   * @param hsi Server specification
+   * @return List of user regions installed on this server (does not include
+   * catalog regions).
+   * @throws IOException
+   */
   public static NavigableMap<HRegionInfo, Result>
-  getServerRegions(CatalogTracker catalogTracker, final HServerInfo hsi)
+  getServerUserRegions(CatalogTracker catalogTracker, final HServerInfo hsi)
   throws IOException {
     HRegionInterface metaServer =
       catalogTracker.waitForMetaServerConnectionDefault();

Modified: 
hbase/trunk/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java
URL: 
http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java?rev=992110&r1=992109&r2=992110&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java 
(original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java 
Thu Sep  2 20:39:41 2010
@@ -740,8 +740,10 @@ public class HBaseAdmin implements Abort
    *
    * @param tableNameOrRegionName table or region to flush
    * @throws IOException if a remote or network exception occurs
+   * @throws InterruptedException 
    */
-  public void flush(final String tableNameOrRegionName) throws IOException {
+  public void flush(final String tableNameOrRegionName)
+  throws IOException, InterruptedException {
     flush(Bytes.toBytes(tableNameOrRegionName));
   }
 
@@ -751,8 +753,10 @@ public class HBaseAdmin implements Abort
    *
    * @param tableNameOrRegionName table or region to flush
    * @throws IOException if a remote or network exception occurs
+   * @throws InterruptedException 
    */
-  public void flush(final byte [] tableNameOrRegionName) throws IOException {
+  public void flush(final byte [] tableNameOrRegionName)
+  throws IOException, InterruptedException {
     boolean isRegionName = isRegionName(tableNameOrRegionName);
     if (isRegionName) {
       Pair<HRegionInfo, HServerAddress> pair =
@@ -780,8 +784,10 @@ public class HBaseAdmin implements Abort
    *
    * @param tableNameOrRegionName table or region to compact
    * @throws IOException if a remote or network exception occurs
+   * @throws InterruptedException 
    */
-  public void compact(final String tableNameOrRegionName) throws IOException {
+  public void compact(final String tableNameOrRegionName)
+  throws IOException, InterruptedException {
     compact(Bytes.toBytes(tableNameOrRegionName));
   }
 
@@ -791,8 +797,10 @@ public class HBaseAdmin implements Abort
    *
    * @param tableNameOrRegionName table or region to compact
    * @throws IOException if a remote or network exception occurs
+   * @throws InterruptedException 
    */
-  public void compact(final byte [] tableNameOrRegionName) throws IOException {
+  public void compact(final byte [] tableNameOrRegionName)
+  throws IOException, InterruptedException {
     compact(tableNameOrRegionName, false);
   }
 
@@ -802,9 +810,10 @@ public class HBaseAdmin implements Abort
    *
    * @param tableNameOrRegionName table or region to major compact
    * @throws IOException if a remote or network exception occurs
+   * @throws InterruptedException 
    */
   public void majorCompact(final String tableNameOrRegionName)
-  throws IOException {
+  throws IOException, InterruptedException {
     majorCompact(Bytes.toBytes(tableNameOrRegionName));
   }
 
@@ -814,9 +823,10 @@ public class HBaseAdmin implements Abort
    *
    * @param tableNameOrRegionName table or region to major compact
    * @throws IOException if a remote or network exception occurs
+   * @throws InterruptedException 
    */
   public void majorCompact(final byte [] tableNameOrRegionName)
-  throws IOException {
+  throws IOException, InterruptedException {
     compact(tableNameOrRegionName, true);
   }
 
@@ -827,9 +837,10 @@ public class HBaseAdmin implements Abort
    * @param tableNameOrRegionName table or region to compact
    * @param major True if we are to do a major compaction.
    * @throws IOException if a remote or network exception occurs
+   * @throws InterruptedException 
    */
   private void compact(final byte [] tableNameOrRegionName, final boolean 
major)
-  throws IOException {
+  throws IOException, InterruptedException {
     if (isRegionName(tableNameOrRegionName)) {
       Pair<HRegionInfo, HServerAddress> pair =
         MetaReader.getRegion(getCatalogTracker(), tableNameOrRegionName);
@@ -882,8 +893,10 @@ public class HBaseAdmin implements Abort
    *
    * @param tableNameOrRegionName table or region to split
    * @throws IOException if a remote or network exception occurs
+   * @throws InterruptedException 
    */
-  public void split(final String tableNameOrRegionName) throws IOException {
+  public void split(final String tableNameOrRegionName)
+  throws IOException, InterruptedException {
     split(Bytes.toBytes(tableNameOrRegionName));
   }
 
@@ -893,8 +906,9 @@ public class HBaseAdmin implements Abort
    *
    * @param tableNameOrRegionName table to region to split
    * @throws IOException if a remote or network exception occurs
+   * @throws InterruptedException 
    */
-  public void split(final byte [] tableNameOrRegionName) throws IOException {
+  public void split(final byte [] tableNameOrRegionName) throws IOException, 
InterruptedException {
     if (isRegionName(tableNameOrRegionName)) {
       // Its a possible region name.
       Pair<HRegionInfo, HServerAddress> pair =

Modified: 
hbase/trunk/src/main/java/org/apache/hadoop/hbase/client/HConnection.java
URL: 
http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/client/HConnection.java?rev=992110&r1=992109&r2=992110&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/client/HConnection.java 
(original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/client/HConnection.java 
Thu Sep  2 20:39:41 2010
@@ -108,7 +108,7 @@ public interface HConnection {
    * lives in.
    * @param tableName name of the table <i>row</i> is in
    * @param row row key you're trying to find the region of
-   * @return HRegionLocation that describes where to find the reigon in
+   * @return HRegionLocation that describes where to find the region in
    * question
    * @throws IOException if a remote or network exception occurs
    */

Modified: 
hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/handler/ServerShutdownHandler.java
URL: 
http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/handler/ServerShutdownHandler.java?rev=992110&r1=992109&r2=992110&view=diff
==============================================================================
--- 
hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/handler/ServerShutdownHandler.java
 (original)
+++ 
hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/handler/ServerShutdownHandler.java
 Thu Sep  2 20:39:41 2010
@@ -104,7 +104,7 @@ public class ServerShutdownHandler exten
     }
 
     NavigableMap<HRegionInfo, Result> hris =
-      MetaReader.getServerRegions(this.server.getCatalogTracker(), this.hsi);
+      MetaReader.getServerUserRegions(this.server.getCatalogTracker(), 
this.hsi);
     LOG.info("Reassigning the " + hris.size() + " region(s) that " + 
serverName +
       " was carrying.");
 

Modified: 
hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
URL: 
http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java?rev=992110&r1=992109&r2=992110&view=diff
==============================================================================
--- 
hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
 (original)
+++ 
hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
 Thu Sep  2 20:39:41 2010
@@ -1883,6 +1883,7 @@ public class HRegionServer implements HR
   @Override
   public void flushRegion(HRegionInfo regionInfo)
       throws NotServingRegionException, IOException {
+    LOG.info("Flushing " + regionInfo.getRegionNameAsString());
     HRegion region = getRegion(regionInfo.getRegionName());
     region.flushcache();
   }

Modified: 
hbase/trunk/src/main/java/org/apache/hadoop/hbase/thrift/ThriftServer.java
URL: 
http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/thrift/ThriftServer.java?rev=992110&r1=992109&r2=992110&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/thrift/ThriftServer.java 
(original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/thrift/ThriftServer.java 
Thu Sep  2 20:39:41 2010
@@ -222,6 +222,8 @@ public class ThriftServer {
     public void compact(byte[] tableNameOrRegionName) throws IOError {
       try{
         admin.compact(tableNameOrRegionName);
+      } catch (InterruptedException e) {
+        throw new IOError(e.getMessage());
       } catch (IOException e) {
         throw new IOError(e.getMessage());
       }
@@ -230,6 +232,8 @@ public class ThriftServer {
     public void majorCompact(byte[] tableNameOrRegionName) throws IOError {
       try{
         admin.majorCompact(tableNameOrRegionName);
+      } catch (InterruptedException e) {
+        throw new IOError(e.getMessage());
       } catch (IOException e) {
         throw new IOError(e.getMessage());
       }

Added: 
hbase/trunk/src/test/java/org/apache/hadoop/hbase/catalog/TestMetaReaderEditor.java
URL: 
http://svn.apache.org/viewvc/hbase/trunk/src/test/java/org/apache/hadoop/hbase/catalog/TestMetaReaderEditor.java?rev=992110&view=auto
==============================================================================
--- 
hbase/trunk/src/test/java/org/apache/hadoop/hbase/catalog/TestMetaReaderEditor.java
 (added)
+++ 
hbase/trunk/src/test/java/org/apache/hadoop/hbase/catalog/TestMetaReaderEditor.java
 Thu Sep  2 20:39:41 2010
@@ -0,0 +1,125 @@
+/**
+ * Copyright 2010 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.catalog;
+
+import static org.junit.Assert.*;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.hbase.Abortable;
+import org.apache.hadoop.hbase.HBaseTestingUtility;
+import org.apache.hadoop.hbase.HConstants;
+import org.apache.hadoop.hbase.HRegionInfo;
+import org.apache.hadoop.hbase.HServerAddress;
+import org.apache.hadoop.hbase.client.HTable;
+import org.apache.hadoop.hbase.client.ServerConnection;
+import org.apache.hadoop.hbase.client.ServerConnectionManager;
+import org.apache.hadoop.hbase.util.Bytes;
+import org.apache.hadoop.hbase.util.Pair;
+import org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ * Test {...@link MetaReader}, {...@link MetaEditor}, and {...@link 
RootLocationEditor}.
+ */
+public class TestMetaReaderEditor {
+  private static final Log LOG = LogFactory.getLog(TestMetaReaderEditor.class);
+  private static final  HBaseTestingUtility UTIL = new HBaseTestingUtility();
+  private static ZooKeeperWatcher ZKW;
+  private static CatalogTracker CT;
+  private final static Abortable ABORTABLE = new Abortable() {
+    private final AtomicBoolean abort = new AtomicBoolean(false);
+
+    @Override
+    public void abort(String why, Throwable e) {
+      LOG.info(why, e);
+      abort.set(true);
+    }
+  };
+
+  @BeforeClass public static void beforeClass() throws Exception {
+    UTIL.startMiniCluster();
+    ZKW = new ZooKeeperWatcher(UTIL.getConfiguration(),
+      "TestMetaReaderEditor", ABORTABLE);
+    ServerConnection connection =
+      ServerConnectionManager.getConnection(UTIL.getConfiguration());
+    CT = new CatalogTracker(ZKW, connection, ABORTABLE);
+    CT.start();
+  }
+
+  @AfterClass public static void afterClass() throws IOException {
+    UTIL.shutdownMiniCluster();
+  }
+
+  @Test public void testGetRegionsCatalogTables()
+  throws IOException, InterruptedException {
+    List<HRegionInfo> regions =
+      MetaReader.getTableRegions(CT, HConstants.META_TABLE_NAME);
+    assertTrue(regions.size() >= 1);
+    assertTrue(MetaReader.getTableRegionsAndLocations(CT,
+      Bytes.toString(HConstants.META_TABLE_NAME)).size() >= 1);
+    assertTrue(MetaReader.getTableRegionsAndLocations(CT,
+      Bytes.toString(HConstants.ROOT_TABLE_NAME)).size() == 1);
+  }
+
+  @Test public void testTableExists() throws IOException {
+    final String name = "testTableExists";
+    final byte [] nameBytes = Bytes.toBytes(name);
+    assertFalse(MetaReader.tableExists(CT, name));
+    UTIL.createTable(nameBytes, HConstants.CATALOG_FAMILY);
+    assertTrue(MetaReader.tableExists(CT, name));
+    UTIL.getHBaseAdmin().disableTable(name);
+    UTIL.getHBaseAdmin().deleteTable(name);
+    assertFalse(MetaReader.tableExists(CT, name));
+    assertTrue(MetaReader.tableExists(CT,
+      Bytes.toString(HConstants.META_TABLE_NAME)));
+    assertTrue(MetaReader.tableExists(CT,
+      Bytes.toString(HConstants.ROOT_TABLE_NAME)));
+  }
+
+  @Test public void testGetRegion() throws IOException, InterruptedException {
+    final String name = "testGetRegion";
+    final byte [] nameBytes = Bytes.toBytes(name);
+    HTable t = UTIL.createTable(nameBytes, HConstants.CATALOG_FAMILY);
+    int regionCount = UTIL.createMultiRegions(t, HConstants.CATALOG_FAMILY);
+
+    // Test it works getting a region from user table.
+    List<HRegionInfo> regions = MetaReader.getTableRegions(CT, nameBytes);
+    assertEquals(regionCount, regions.size());
+    Pair<HRegionInfo, HServerAddress> pair =
+      MetaReader.getRegion(CT, regions.get(0).getRegionName());
+    assertEquals(regions.get(0).getEncodedName(),
+      pair.getFirst().getEncodedName());
+    // Test get on non-existent region.
+    pair = MetaReader.getRegion(CT, Bytes.toBytes("nonexistent-region"));
+    assertNull(pair);
+    // Test it works getting a region from meta/root.
+    pair =
+      MetaReader.getRegion(CT, 
HRegionInfo.FIRST_META_REGIONINFO.getRegionName());
+    assertEquals(HRegionInfo.FIRST_META_REGIONINFO.getEncodedName(),
+      pair.getFirst().getEncodedName());
+  }
+}


Reply via email to