You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by st...@apache.org on 2010/08/21 07:25:02 UTC

svn commit: r987697 - in /hbase/branches/0.90_master_rewrite/src: main/java/org/apache/hadoop/hbase/client/ main/java/org/apache/hadoop/hbase/io/ main/java/org/apache/hadoop/hbase/ipc/ main/java/org/apache/hadoop/hbase/master/ main/java/org/apache/hado...

Author: stack
Date: Sat Aug 21 05:25:01 2010
New Revision: 987697

URL: http://svn.apache.org/viewvc?rev=987697&view=rev
Log:
Small changes to do w/ making the modify of table and column work again.

M src/test/java/org/apache/hadoop/hbase/regionserver/wal/TestLogRolling.java
M src/test/java/org/apache/hadoop/hbase/regionserver/DisabledTestRegionServerExit.java
M src/test/java/org/apache/hadoop/hbase/MiniHBaseCluster.java
  Method named changed from getOnlineRegions to getOnlineRegionsLocalContext.
M src/test/java/org/apache/hadoop/hbase/master/TestZKBasedOpenCloseRegion.java
  getOnlineRegions returns HRIs not HRs now.
M src/test/java/org/apache/hadoop/hbase/client/TestAdmin.java
  Tests for modify table/column to ensure they work.  Finding little copy/paste
  bugs here so these tests are proving their worth.
D src/main/java/org/apache/hadoop/hbase/regionserver/RegionServer.java
  Removed.  Made regionserver follow the model introduced yesterday
  where you have Server and then RegionServerServices and over in
  master package its Server and MasterServices where Server has
  what both servers have in common and then the *Services are the
  facility other local classes would make use of.
M src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
  Implement new RegionServerServices interface.
M src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRegionHandler.java
M src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRootHandler.java
M src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenMetaHandler.java
M src/main/java/org/apache/hadoop/hbase/regionserver/handler/CloseRegionHandler.java
M src/main/java/org/apache/hadoop/hbase/regionserver/handler/CloseRootHandler.java
M src/main/java/org/apache/hadoop/hbase/regionserver/handler/CloseMetaHandler.java
  Take RegionServerServices.
A src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerServices.java
  Interface of services the regionserver package needs.
M src/main/java/org/apache/hadoop/hbase/master/HMaster.java
  Remove redundant columnname arg.
M src/main/java/org/apache/hadoop/hbase/master/handler/TableModifyFamilyHandler.java
  Fix its type and fix copy paste errors.
M src/main/java/org/apache/hadoop/hbase/io/HbaseObjectWritable.java
  Added navigableset.
M src/main/java/org/apache/hadoop/hbase/ipc/HMasterInterface.java
  Changed interface to drop unnecessary param on modifyColumn.
M src/main/java/org/apache/hadoop/hbase/ipc/HRegionInterface.java
  (getOnlineRegionsAsArray): Removed. Not used.
  Renamed getRegionsAssignment as getOnlineRegions
M src/main/java/org/apache/hadoop/hbase/client/HBaseFsck.java
  Removed unused imports and changed it to use getOnlineRegions.
M src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java
  Deprecated modifyColumn methods that take extra unnecessary arg.

Added:
    hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerServices.java
Removed:
    hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServer.java
Modified:
    hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java
    hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/client/HBaseFsck.java
    hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/io/HbaseObjectWritable.java
    hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/ipc/HMasterInterface.java
    hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/ipc/HRegionInterface.java
    hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
    hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/master/handler/TableModifyFamilyHandler.java
    hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
    hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/regionserver/handler/CloseMetaHandler.java
    hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/regionserver/handler/CloseRegionHandler.java
    hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/regionserver/handler/CloseRootHandler.java
    hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenMetaHandler.java
    hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRegionHandler.java
    hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRootHandler.java
    hbase/branches/0.90_master_rewrite/src/test/java/org/apache/hadoop/hbase/MiniHBaseCluster.java
    hbase/branches/0.90_master_rewrite/src/test/java/org/apache/hadoop/hbase/client/TestAdmin.java
    hbase/branches/0.90_master_rewrite/src/test/java/org/apache/hadoop/hbase/master/TestZKBasedOpenCloseRegion.java
    hbase/branches/0.90_master_rewrite/src/test/java/org/apache/hadoop/hbase/regionserver/DisabledTestRegionServerExit.java
    hbase/branches/0.90_master_rewrite/src/test/java/org/apache/hadoop/hbase/regionserver/wal/TestLogRolling.java

Modified: hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java?rev=987697&r1=987696&r2=987697&view=diff
==============================================================================
--- hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java (original)
+++ hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java Sat Aug 21 05:25:01 2010
@@ -610,11 +610,25 @@ public class HBaseAdmin {
    * @param columnName name of column to be modified
    * @param descriptor new column descriptor to use
    * @throws IOException if a remote or network exception occurs
+   * @deprecated The <code>columnName</code> is redundant. Use {@link #addColumn(String, HColumnDescriptor)}
    */
   public void modifyColumn(final String tableName, final String columnName,
       HColumnDescriptor descriptor)
   throws IOException {
-    modifyColumn(Bytes.toBytes(tableName), Bytes.toBytes(columnName), descriptor);
+    modifyColumn(tableName,  descriptor);
+  }
+
+  /**
+   * Modify an existing column family on a table.
+   * Asynchronous operation.
+   *
+   * @param tableName name of table
+   * @param descriptor new column descriptor to use
+   * @throws IOException if a remote or network exception occurs
+   */
+  public void modifyColumn(final String tableName, HColumnDescriptor descriptor)
+  throws IOException {
+    modifyColumn(Bytes.toBytes(tableName), descriptor);
   }
 
   /**
@@ -625,16 +639,27 @@ public class HBaseAdmin {
    * @param columnName name of column to be modified
    * @param descriptor new column descriptor to use
    * @throws IOException if a remote or network exception occurs
+   * @deprecated The <code>columnName</code> is redundant. Use {@link #modifyColumn(byte[], HColumnDescriptor)}
    */
   public void modifyColumn(final byte [] tableName, final byte [] columnName,
     HColumnDescriptor descriptor)
   throws IOException {
+    modifyColumn(tableName, descriptor);
+  }
+
+  /**
+   * Modify an existing column family on a table.
+   * Asynchronous operation.
+   *
+   * @param tableName name of table
+   * @param descriptor new column descriptor to use
+   * @throws IOException if a remote or network exception occurs
+   */
+  public void modifyColumn(final byte [] tableName, HColumnDescriptor descriptor)
+  throws IOException {
     HTableDescriptor.isLegalTableName(tableName);
-    try {
-      getMaster().modifyColumn(tableName, columnName, descriptor);
-    } catch (RemoteException e) {
-      throw RemoteExceptionHandler.decodeRemoteException(e);
-    }
+    if (isTableEnabled(tableName)) throw new TableNotDisabledException(tableName);
+    getMaster().modifyColumn(tableName, descriptor);
   }
 
   /**
@@ -802,7 +827,8 @@ public class HBaseAdmin {
 
   /**
    * Modify an existing table, more IRB friendly version.
-   * Asynchronous operation.
+   * Asynchronous operation.  This means that it may be a while before your
+   * schema change is updated across all of the table.
    *
    * @param tableName name of table.
    * @param htd modified description of the table
@@ -810,6 +836,7 @@ public class HBaseAdmin {
    */
   public void modifyTable(final byte [] tableName, HTableDescriptor htd)
   throws IOException {
+    HTableDescriptor.isLegalTableName(tableName);
     if (isTableEnabled(tableName)) throw new TableNotDisabledException(tableName);
     getMaster().modifyTable(tableName, htd);
   }

Modified: hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/client/HBaseFsck.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/client/HBaseFsck.java?rev=987697&r1=987696&r2=987697&view=diff
==============================================================================
--- hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/client/HBaseFsck.java (original)
+++ hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/client/HBaseFsck.java Sat Aug 21 05:25:01 2010
@@ -19,50 +19,35 @@
  */
 package org.apache.hadoop.hbase.client;
 
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.NavigableSet;
+import java.util.TreeMap;
+import java.util.TreeSet;
+import java.util.concurrent.atomic.AtomicInteger;
+
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.fs.FileStatus;
+import org.apache.hadoop.fs.FileSystem;
+import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.hbase.ClusterStatus;
 import org.apache.hadoop.hbase.HBaseConfiguration;
-import org.apache.hadoop.hbase.HColumnDescriptor;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.HRegionInfo;
-import org.apache.hadoop.hbase.HRegionLocation;
+import org.apache.hadoop.hbase.HServerAddress;
+import org.apache.hadoop.hbase.HServerInfo;
 import org.apache.hadoop.hbase.HTableDescriptor;
 import org.apache.hadoop.hbase.KeyValue;
 import org.apache.hadoop.hbase.MasterNotRunningException;
-import org.apache.hadoop.hbase.HServerInfo;
-import org.apache.hadoop.hbase.HServerAddress;
-import org.apache.hadoop.hbase.RegionException;
-import org.apache.hadoop.hbase.RemoteExceptionHandler;
-import org.apache.hadoop.hbase.TableExistsException;
 import org.apache.hadoop.hbase.client.MetaScanner.MetaScannerVisitor;
-import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
 import org.apache.hadoop.hbase.ipc.HMasterInterface;
 import org.apache.hadoop.hbase.ipc.HRegionInterface;
-import org.apache.hadoop.hbase.regionserver.HRegion;
 import org.apache.hadoop.hbase.util.Bytes;
-import org.apache.hadoop.hbase.util.MetaUtils;
 import org.apache.hadoop.hbase.util.Writables;
-import org.apache.hadoop.io.BooleanWritable;
-import org.apache.hadoop.io.Writable;
-import org.apache.hadoop.ipc.RemoteException;
-import org.apache.hadoop.fs.FileSystem;
-import org.apache.hadoop.fs.FileStatus;
-import org.apache.hadoop.fs.Path;
-
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Map;
-import java.util.List;
-import java.util.TreeSet;
-import java.util.TreeMap;
-import java.util.NavigableMap;
-import java.util.Random;
-import java.util.concurrent.atomic.AtomicInteger;
 
 /**
  * Check consistency among the in-memory states of the master and the 
@@ -276,10 +261,10 @@ public class HBaseFsck extends HBaseAdmi
                                     rsinfo.getServerAddress());
 
         // list all online regions from this region server
-        HRegionInfo[] regions = server.getRegionsAssignment();
+        NavigableSet<HRegionInfo> regions = server.getOnlineRegions();
         if (details) {
           System.out.print("\nRegionServer:" + rsinfo.getServerName() +
-                           " number of regions:" + regions.length);
+                           " number of regions:" + regions.size());
           for (HRegionInfo rinfo: regions) {
             System.out.print("\n\t name:" + rinfo.getRegionNameAsString() +
                              " id:" + rinfo.getRegionId() +

Modified: hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/io/HbaseObjectWritable.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/io/HbaseObjectWritable.java?rev=987697&r1=987696&r2=987697&view=diff
==============================================================================
--- hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/io/HbaseObjectWritable.java (original)
+++ hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/io/HbaseObjectWritable.java Sat Aug 21 05:25:01 2010
@@ -26,6 +26,7 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.NavigableSet;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -183,6 +184,8 @@ public class HbaseObjectWritable impleme
 
     // List
     addToMap(List.class, code++);
+    //
+    addToMap(NavigableSet.class, code++);
   }
 
   private Class<?> declaredClass;

Modified: hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/ipc/HMasterInterface.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/ipc/HMasterInterface.java?rev=987697&r1=987696&r2=987697&view=diff
==============================================================================
--- hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/ipc/HMasterInterface.java (original)
+++ hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/ipc/HMasterInterface.java Sat Aug 21 05:25:01 2010
@@ -71,12 +71,10 @@ public interface HMasterInterface extend
   /**
    * Modifies an existing column on the specified table
    * @param tableName table name
-   * @param columnName name of the column to edit
    * @param descriptor new column descriptor
    * @throws IOException e
    */
-  public void modifyColumn(final byte [] tableName, final byte [] columnName,
-    HColumnDescriptor descriptor)
+  public void modifyColumn(final byte [] tableName, HColumnDescriptor descriptor)
   throws IOException;
 
 

Modified: hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/ipc/HRegionInterface.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/ipc/HRegionInterface.java?rev=987697&r1=987696&r2=987697&view=diff
==============================================================================
--- hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/ipc/HRegionInterface.java (original)
+++ hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/ipc/HRegionInterface.java Sat Aug 21 05:25:01 2010
@@ -20,7 +20,9 @@
 package org.apache.hadoop.hbase.ipc;
 
 import java.io.IOException;
+import java.util.Collection;
 import java.util.List;
+import java.util.NavigableSet;
 
 import org.apache.hadoop.hbase.Abortable;
 import org.apache.hadoop.hbase.HRegionInfo;
@@ -69,12 +71,6 @@ public interface HRegionInterface extend
   throws IOException;
 
   /**
-   *
-   * @return the regions served by this regionserver
-   */
-  public HRegion [] getOnlineRegionsAsArray();
-
-  /**
    * Perform Get operation.
    * @param regionName name of region to get from
    * @param get Get operation
@@ -259,11 +255,10 @@ public interface HRegionInterface extend
 
 
   /**
-   * Method used when a master is taking the place of another failed one.
-   * @return All regions assigned on this region server
+   * @return All regions online on this region server
    * @throws IOException e
    */
-  public HRegionInfo[] getRegionsAssignment() throws IOException;
+  public NavigableSet<HRegionInfo> getOnlineRegions();
 
   /**
    * Method used when a master is taking the place of another failed one.

Modified: hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/master/HMaster.java?rev=987697&r1=987696&r2=987697&view=diff
==============================================================================
--- hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/master/HMaster.java (original)
+++ hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/master/HMaster.java Sat Aug 21 05:25:01 2010
@@ -607,8 +607,7 @@ implements HMasterInterface, HMasterRegi
     new TableAddFamilyHandler(tableName, column, this, this).execute();
   }
 
-  public void modifyColumn(byte [] tableName, byte [] columnName,
-    HColumnDescriptor descriptor)
+  public void modifyColumn(byte [] tableName, HColumnDescriptor descriptor)
   throws IOException {
     if (isCatalogTable(tableName)) {
       throw new IOException("Can't modify catalog tables");

Modified: hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/master/handler/TableModifyFamilyHandler.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/master/handler/TableModifyFamilyHandler.java?rev=987697&r1=987696&r2=987697&view=diff
==============================================================================
--- hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/master/handler/TableModifyFamilyHandler.java (original)
+++ hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/master/handler/TableModifyFamilyHandler.java Sat Aug 21 05:25:01 2010
@@ -41,7 +41,7 @@ public class TableModifyFamilyHandler ex
   public TableModifyFamilyHandler(byte[] tableName,
       HColumnDescriptor familyDesc, Server server,
       final MasterServices masterServices) {
-    super(EventType.C2M_ADD_FAMILY, tableName, server, masterServices);
+    super(EventType.C2M_MODIFY_FAMILY, tableName, server, masterServices);
     this.familyDesc = familyDesc;
   }
 
@@ -49,10 +49,9 @@ public class TableModifyFamilyHandler ex
   protected void handleTableOperation(List<HRegionInfo> regions) throws IOException {
     HTableDescriptor htd = regions.get(0).getTableDesc();
     byte [] familyName = familyDesc.getName();
-    if(htd.hasFamily(familyName)) {
-      throw new InvalidFamilyOperationException(
-          "Family '" + Bytes.toString(familyName) + "' already exists so " +
-          "cannot be modified");
+    if(!htd.hasFamily(familyName)) {
+      throw new InvalidFamilyOperationException("Family '" +
+        Bytes.toString(familyName) + "' doesn't exists so cannot be modified");
     }
     for(HRegionInfo region : regions) {
       // Update the HTD

Modified: hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java?rev=987697&r1=987696&r2=987697&view=diff
==============================================================================
--- hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java (original)
+++ hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java Sat Aug 21 05:25:01 2010
@@ -36,10 +36,10 @@ import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.NavigableSet;
 import java.util.Random;
 import java.util.Set;
 import java.util.SortedMap;
-import java.util.SortedSet;
 import java.util.TreeMap;
 import java.util.TreeSet;
 import java.util.concurrent.BlockingQueue;
@@ -69,6 +69,7 @@ import org.apache.hadoop.hbase.LocalHBas
 import org.apache.hadoop.hbase.MasterAddressTracker;
 import org.apache.hadoop.hbase.NotServingRegionException;
 import org.apache.hadoop.hbase.RemoteExceptionHandler;
+import org.apache.hadoop.hbase.Server;
 import org.apache.hadoop.hbase.Stoppable;
 import org.apache.hadoop.hbase.UnknownRowLockException;
 import org.apache.hadoop.hbase.UnknownScannerException;
@@ -123,7 +124,7 @@ import org.apache.zookeeper.KeeperExcept
  * the HMaster. There are many HRegionServers in a single HBase deployment.
  */
 public class HRegionServer implements HRegionInterface, HBaseRPCErrorHandler,
-    Runnable, RegionServer {
+    Runnable, RegionServerServices, Server {
   public static final Log LOG = LogFactory.getLog(HRegionServer.class);
 
   // Set when a report to the master comes back with a message asking us to
@@ -1869,11 +1870,11 @@ public class HRegionServer implements HR
     LOG.info("Received request to open region: " +
       region.getRegionNameAsString());
     if(region.isRootRegion()) {
-      this.service.submit(new OpenRootHandler(this, catalogTracker, region));
+      this.service.submit(new OpenRootHandler(this, this, catalogTracker, region));
     } else if(region.isMetaRegion()) {
-      this.service.submit(new OpenMetaHandler(this, catalogTracker, region));
+      this.service.submit(new OpenMetaHandler(this, this, catalogTracker, region));
     } else {
-      this.service.submit(new OpenRegionHandler(this, catalogTracker, region));
+      this.service.submit(new OpenRegionHandler(this, this, catalogTracker, region));
     }
   }
 
@@ -1903,11 +1904,11 @@ public class HRegionServer implements HR
       final boolean zk) {
     CloseRegionHandler crh = null;
     if (region.isRootRegion()) {
-      crh = new CloseRootHandler(this, region, abort, zk);
+      crh = new CloseRootHandler(this, this, region, abort, zk);
     } else if (region.isMetaRegion()) {
-      crh = new CloseMetaHandler(this, region, abort, zk);
+      crh = new CloseMetaHandler(this, this, region, abort, zk);
     } else {
-      crh = new CloseRegionHandler(this, region, abort, zk);
+      crh = new CloseRegionHandler(this, this, region, abort, zk);
     }
     this.service.submit(crh);
     return true;
@@ -1969,28 +1970,25 @@ public class HRegionServer implements HR
     return lock.writeLock();
   }
 
-  /**
-   * @return Immutable list of this servers regions.
-   */
-  public Collection<HRegion> getOnlineRegions() {
-    return Collections.unmodifiableCollection(onlineRegions.values());
-  }
-
-  public HRegion[] getOnlineRegionsAsArray() {
-    return getOnlineRegions().toArray(new HRegion[0]);
+  @Override
+  public NavigableSet<HRegionInfo> getOnlineRegions() {
+    NavigableSet<HRegionInfo> sortedset = new TreeSet<HRegionInfo>();
+    synchronized(this.onlineRegions) {
+      for (Map.Entry<String,HRegion> e: this.onlineRegions.entrySet()) {
+        sortedset.add(e.getValue().getRegionInfo());
+      }
+    }
+    return sortedset;
   }
 
   /**
-   * @return The HRegionInfos from online regions sorted
+   * For tests and web ui.
+   * This method will only work if HRegionServer is in the same JVM as client;
+   * HRegion cannot be serialized to cross an rpc.
+   * @see #getOnlineRegions()
    */
-  public SortedSet<HRegionInfo> getSortedOnlineRegionInfos() {
-    SortedSet<HRegionInfo> result = new TreeSet<HRegionInfo>();
-    synchronized (this.onlineRegions) {
-      for (HRegion r : this.onlineRegions.values()) {
-        result.add(r.getRegionInfo());
-      }
-    }
-    return result;
+  public Collection<HRegion> getOnlineRegionsLocalContext() {
+    return Collections.unmodifiableCollection(this.onlineRegions.values());
   }
 
   @Override

Added: hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerServices.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerServices.java?rev=987697&view=auto
==============================================================================
--- hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerServices.java (added)
+++ hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerServices.java Sat Aug 21 05:25:01 2010
@@ -0,0 +1,46 @@
+/**
+ * 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.regionserver;
+
+import org.apache.hadoop.hbase.HServerInfo;
+import org.apache.hadoop.hbase.regionserver.wal.HLog;
+
+/**
+ * Services provided by {@link HRegionServer}
+ */
+public interface RegionServerServices extends OnlineRegions {
+  public HLog getWAL();
+
+  /**
+   * @return Implementation of {@link CompactionRequestor} or null.
+   */
+  public CompactionRequestor getCompactionRequester();
+  
+  /**
+   * @return Implementation of {@link FlushRequester} or null.
+   */
+  public FlushRequester getFlushRequester();
+
+  /**
+   * Return data structure that has Server address and startcode.
+   * @return The HServerInfo for this RegionServer.
+   */
+  public HServerInfo getServerInfo();
+}
\ No newline at end of file

Modified: hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/regionserver/handler/CloseMetaHandler.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/regionserver/handler/CloseMetaHandler.java?rev=987697&r1=987696&r2=987697&view=diff
==============================================================================
--- hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/regionserver/handler/CloseMetaHandler.java (original)
+++ hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/regionserver/handler/CloseMetaHandler.java Sat Aug 21 05:25:01 2010
@@ -20,20 +20,24 @@
 package org.apache.hadoop.hbase.regionserver.handler;
 
 import org.apache.hadoop.hbase.HRegionInfo;
-import org.apache.hadoop.hbase.regionserver.RegionServer;
+import org.apache.hadoop.hbase.Server;
+import org.apache.hadoop.hbase.regionserver.RegionServerServices;
 
 /**
  * Handles closing of the root region on a region server.
  */
 public class CloseMetaHandler extends CloseRegionHandler {
   // Called when master tells us shutdown a region via close rpc
-  public CloseMetaHandler(RegionServer server, HRegionInfo regionInfo) {
-    this(server, regionInfo, false, true);
+  public CloseMetaHandler(final Server server,
+      final RegionServerServices rsServices, final HRegionInfo regionInfo) {
+    this(server, rsServices, regionInfo, false, true);
   }
 
   // Called when regionserver determines its to go down; not master orchestrated
-  public CloseMetaHandler(RegionServer server, HRegionInfo regionInfo,
+  public CloseMetaHandler(final Server server,
+      final RegionServerServices rsServices,
+      final HRegionInfo regionInfo,
       final boolean abort, final boolean zk) {
-    super(server, regionInfo, abort, zk, EventType.M2RS_CLOSE_META);
+    super(server, rsServices, regionInfo, abort, zk, EventType.M2RS_CLOSE_META);
   }
 }
\ No newline at end of file

Modified: hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/regionserver/handler/CloseRegionHandler.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/regionserver/handler/CloseRegionHandler.java?rev=987697&r1=987696&r2=987697&view=diff
==============================================================================
--- hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/regionserver/handler/CloseRegionHandler.java (original)
+++ hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/regionserver/handler/CloseRegionHandler.java Sat Aug 21 05:25:01 2010
@@ -24,9 +24,10 @@ import java.io.IOException;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.hbase.HRegionInfo;
+import org.apache.hadoop.hbase.Server;
 import org.apache.hadoop.hbase.executor.EventHandler;
 import org.apache.hadoop.hbase.regionserver.HRegion;
-import org.apache.hadoop.hbase.regionserver.RegionServer;
+import org.apache.hadoop.hbase.regionserver.RegionServerServices;
 import org.apache.hadoop.hbase.zookeeper.ZKAssign;
 import org.apache.zookeeper.KeeperException;
 
@@ -43,7 +44,7 @@ public class CloseRegionHandler extends 
 
   private final int FAILED = -1;
 
-  private final RegionServer server;
+  private final RegionServerServices rsServices;
 
   private final HRegionInfo regionInfo;
 
@@ -58,26 +59,31 @@ public class CloseRegionHandler extends 
   private final boolean zk;
 
   // This is executed after receiving an CLOSE RPC from the master.
-  public CloseRegionHandler(RegionServer server, HRegionInfo regionInfo) {
-    this(server, regionInfo, false, true);
+  public CloseRegionHandler(final Server server,
+      final RegionServerServices rsServices, HRegionInfo regionInfo) {
+    this(server, rsServices, regionInfo, false, true);
   }
 
   /**
    * This method used internally by the RegionServer to close out regions.
    * @param server
+   * @param rsServices
    * @param regionInfo
    * @param abort If the regionserver is aborting.
    * @param zk If the close should be noted out in zookeeper.
    */
-  public CloseRegionHandler(final RegionServer server,
+  public CloseRegionHandler(final Server server,
+      final RegionServerServices rsServices,
       final HRegionInfo regionInfo, final boolean abort, final boolean zk) {
-    this(server, regionInfo, abort, zk, EventType.M2RS_CLOSE_REGION);
+    this(server, rsServices,  regionInfo, abort, zk, EventType.M2RS_CLOSE_REGION);
   }
 
-  protected CloseRegionHandler(RegionServer server, HRegionInfo regionInfo,
+  protected CloseRegionHandler(final Server server,
+      final RegionServerServices rsServices, HRegionInfo regionInfo,
       boolean abort, final boolean zk, EventType eventType) {
     super(server, eventType);
     this.server = server;
+    this.rsServices = rsServices;
     this.regionInfo = regionInfo;
     this.abort = abort;
     this.zk = zk;
@@ -93,7 +99,7 @@ public class CloseRegionHandler extends 
     LOG.debug("Processing close of " + name);
     String encodedRegionName = regionInfo.getEncodedName();
     // Check that this region is being served here
-    HRegion region = server.getFromOnlineRegions(encodedRegionName);
+    HRegion region = this.rsServices.getFromOnlineRegions(encodedRegionName);
     if (region == null) {
       LOG.warn("Received CLOSE for region " + name + " but currently not serving");
       return;
@@ -109,7 +115,7 @@ public class CloseRegionHandler extends 
     try {
       // TODO: If we need to keep updating CLOSING stamp to prevent against
       //       a timeout if this is long-running, need to spin up a thread?
-      server.removeFromOnlineRegions(regionInfo.getEncodedName());
+      this.rsServices.removeFromOnlineRegions(regionInfo.getEncodedName());
       region.close(abort);
     } catch (IOException e) {
       LOG.error("IOException closing region for " + regionInfo);

Modified: hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/regionserver/handler/CloseRootHandler.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/regionserver/handler/CloseRootHandler.java?rev=987697&r1=987696&r2=987697&view=diff
==============================================================================
--- hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/regionserver/handler/CloseRootHandler.java (original)
+++ hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/regionserver/handler/CloseRootHandler.java Sat Aug 21 05:25:01 2010
@@ -20,21 +20,24 @@
 package org.apache.hadoop.hbase.regionserver.handler;
 
 import org.apache.hadoop.hbase.HRegionInfo;
-import org.apache.hadoop.hbase.regionserver.RegionServer;
+import org.apache.hadoop.hbase.Server;
+import org.apache.hadoop.hbase.regionserver.RegionServerServices;
 
 /**
  * Handles closing of the root region on a region server.
  */
 public class CloseRootHandler extends CloseRegionHandler {
   // This is executed after receiving an CLOSE RPC from the master for root.
-  public CloseRootHandler(RegionServer server, HRegionInfo regionInfo) {
-    this(server, regionInfo, false, true);
+  public CloseRootHandler(final Server server,
+      final RegionServerServices rsServices, HRegionInfo regionInfo) {
+    this(server, rsServices, regionInfo, false, true);
   }
 
   // This is called directly by the regionserver when its determined its
   // shutting down.
-  public CloseRootHandler(RegionServer server, HRegionInfo regionInfo,
+  public CloseRootHandler(final Server server,
+      final RegionServerServices rsServices, HRegionInfo regionInfo,
       final boolean abort, final boolean zk) {
-    super(server, regionInfo, abort, zk, EventType.M2RS_CLOSE_ROOT);
+    super(server, rsServices, regionInfo, abort, zk, EventType.M2RS_CLOSE_ROOT);
   }
 }
\ No newline at end of file

Modified: hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenMetaHandler.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenMetaHandler.java?rev=987697&r1=987696&r2=987697&view=diff
==============================================================================
--- hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenMetaHandler.java (original)
+++ hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenMetaHandler.java Sat Aug 21 05:25:01 2010
@@ -20,8 +20,9 @@
 package org.apache.hadoop.hbase.regionserver.handler;
 
 import org.apache.hadoop.hbase.HRegionInfo;
+import org.apache.hadoop.hbase.Server;
 import org.apache.hadoop.hbase.catalog.CatalogTracker;
-import org.apache.hadoop.hbase.regionserver.RegionServer;
+import org.apache.hadoop.hbase.regionserver.RegionServerServices;
 
 /**
  * Handles opening of a meta region on a region server.
@@ -29,8 +30,9 @@ import org.apache.hadoop.hbase.regionser
  * This is executed after receiving an OPEN RPC from the master for meta.
  */
 public class OpenMetaHandler extends OpenRegionHandler {
-  public OpenMetaHandler(RegionServer server,
+  public OpenMetaHandler(final Server server,
+      final RegionServerServices rsServices,
       CatalogTracker catalogTracker, HRegionInfo regionInfo) {
-    super(server, catalogTracker, regionInfo, EventType.M2RS_OPEN_META);
+    super(server,rsServices,  catalogTracker, regionInfo, EventType.M2RS_OPEN_META);
   }
 }

Modified: hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRegionHandler.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRegionHandler.java?rev=987697&r1=987696&r2=987697&view=diff
==============================================================================
--- hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRegionHandler.java (original)
+++ hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRegionHandler.java Sat Aug 21 05:25:01 2010
@@ -25,12 +25,13 @@ import java.util.concurrent.atomic.Atomi
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.hbase.HRegionInfo;
+import org.apache.hadoop.hbase.Server;
 import org.apache.hadoop.hbase.catalog.CatalogTracker;
 import org.apache.hadoop.hbase.catalog.MetaEditor;
 import org.apache.hadoop.hbase.catalog.RootLocationEditor;
 import org.apache.hadoop.hbase.executor.EventHandler;
 import org.apache.hadoop.hbase.regionserver.HRegion;
-import org.apache.hadoop.hbase.regionserver.RegionServer;
+import org.apache.hadoop.hbase.regionserver.RegionServerServices;
 import org.apache.hadoop.hbase.zookeeper.ZKAssign;
 import org.apache.hadoop.util.Progressable;
 import org.apache.zookeeper.KeeperException;
@@ -44,22 +45,24 @@ import org.apache.zookeeper.KeeperExcept
 public class OpenRegionHandler extends EventHandler {
   private static final Log LOG = LogFactory.getLog(OpenRegionHandler.class);
 
-  private final RegionServer server;
+  private final RegionServerServices rsServices;
 
   private final CatalogTracker catalogTracker;
 
   private final HRegionInfo regionInfo;
 
-  public OpenRegionHandler(RegionServer server,
+  public OpenRegionHandler(final Server server,
+      final RegionServerServices rsServices,
       CatalogTracker catalogTracker, HRegionInfo regionInfo) {
-    this(server, catalogTracker, regionInfo, EventType.M2RS_OPEN_REGION);
+    this(server, rsServices, catalogTracker, regionInfo, EventType.M2RS_OPEN_REGION);
   }
 
-  protected OpenRegionHandler(RegionServer server,
+  protected OpenRegionHandler(final Server server,
+      final RegionServerServices rsServices,
       CatalogTracker catalogTracker, HRegionInfo regionInfo,
       EventType eventType) {
     super(server, eventType);
-    this.server = server;
+    this.rsServices = rsServices;
     this.catalogTracker = catalogTracker;
     this.regionInfo = regionInfo;
   }
@@ -79,7 +82,7 @@ public class OpenRegionHandler extends E
     // now since we edit meta?
 
     // Check that this region is not already online
-    HRegion region = server.getFromOnlineRegions(encodedName);
+    HRegion region = this.rsServices.getFromOnlineRegions(encodedName);
     if (region != null) {
       LOG.warn("Attempting open of " + regionInfo.getRegionNameAsString() +
         " but it's already online on this server");
@@ -106,8 +109,8 @@ public class OpenRegionHandler extends E
     final AtomicInteger openingInteger = new AtomicInteger(openingVersion);
     try {
       // Instantiate the region.  This also periodically updates OPENING.
-      region = HRegion.openHRegion(regionInfo, server.getWAL(),
-          server.getConfiguration(), server.getFlushRequester(),
+      region = HRegion.openHRegion(regionInfo, this.rsServices.getWAL(),
+          server.getConfiguration(), this.rsServices.getFlushRequester(),
           new Progressable() {
             public void progress() {
               try {
@@ -159,26 +162,26 @@ public class OpenRegionHandler extends E
 
     // Do checks to see if we need to compact (references or too many files)
     if(region.hasReferences() || region.hasTooManyStoreFiles()) {
-      server.getCompactionRequester().requestCompaction(region,
+      this.rsServices.getCompactionRequester().requestCompaction(region,
           region.hasReferences() ? "Region has references on open" :
                                    "Region has too many store files");
     }
 
     // Add to online regions
-    server.addToOnlineRegions(region);
+    this.rsServices.addToOnlineRegions(region);
 
     // Update ZK, ROOT or META
     try {
       if(regionInfo.isRootRegion()) {
         RootLocationEditor.setRootLocation(server.getZooKeeper(),
-            server.getServerInfo().getServerAddress());
+            this.rsServices.getServerInfo().getServerAddress());
       } else if(regionInfo.isMetaRegion()) {
         // TODO: doh, this has weird naming between RootEditor/MetaEditor
         MetaEditor.updateMetaLocation(catalogTracker, regionInfo,
-            server.getServerInfo());
+            this.rsServices.getServerInfo());
       } else {
         MetaEditor.updateRegionLocation(catalogTracker, region.getRegionInfo(),
-          server.getServerInfo());
+          this.rsServices.getServerInfo());
       }
     } catch (IOException e) {
       // TODO: rollback the open?

Modified: hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRootHandler.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRootHandler.java?rev=987697&r1=987696&r2=987697&view=diff
==============================================================================
--- hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRootHandler.java (original)
+++ hbase/branches/0.90_master_rewrite/src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRootHandler.java Sat Aug 21 05:25:01 2010
@@ -20,8 +20,9 @@
 package org.apache.hadoop.hbase.regionserver.handler;
 
 import org.apache.hadoop.hbase.HRegionInfo;
+import org.apache.hadoop.hbase.Server;
 import org.apache.hadoop.hbase.catalog.CatalogTracker;
-import org.apache.hadoop.hbase.regionserver.RegionServer;
+import org.apache.hadoop.hbase.regionserver.RegionServerServices;
 
 /**
  * Handles opening of the root region on a region server.
@@ -29,8 +30,9 @@ import org.apache.hadoop.hbase.regionser
  * This is executed after receiving an OPEN RPC from the master for root.
  */
 public class OpenRootHandler extends OpenRegionHandler {
-  public OpenRootHandler(RegionServer server,
+  public OpenRootHandler(final Server server,
+      final RegionServerServices rsServices,
       CatalogTracker catalogTracker, HRegionInfo regionInfo) {
-    super(server, catalogTracker, regionInfo, EventType.M2RS_OPEN_ROOT);
+    super(server, rsServices, catalogTracker, regionInfo, EventType.M2RS_OPEN_ROOT);
   }
 }

Modified: hbase/branches/0.90_master_rewrite/src/test/java/org/apache/hadoop/hbase/MiniHBaseCluster.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.90_master_rewrite/src/test/java/org/apache/hadoop/hbase/MiniHBaseCluster.java?rev=987697&r1=987696&r2=987697&view=diff
==============================================================================
--- hbase/branches/0.90_master_rewrite/src/test/java/org/apache/hadoop/hbase/MiniHBaseCluster.java (original)
+++ hbase/branches/0.90_master_rewrite/src/test/java/org/apache/hadoop/hbase/MiniHBaseCluster.java Sat Aug 21 05:25:01 2010
@@ -343,7 +343,7 @@ public class MiniHBaseCluster {
   public void flushcache() throws IOException {
     for (JVMClusterUtil.RegionServerThread t:
         this.hbaseCluster.getRegionServers()) {
-      for(HRegion r: t.getRegionServer().getOnlineRegions()) {
+      for(HRegion r: t.getRegionServer().getOnlineRegionsLocalContext()) {
         r.flushcache();
       }
     }
@@ -376,7 +376,7 @@ public class MiniHBaseCluster {
     List<HRegion> ret = new ArrayList<HRegion>();
     for (JVMClusterUtil.RegionServerThread rst : getRegionServerThreads()) {
       HRegionServer hrs = rst.getRegionServer();
-      for (HRegion region : hrs.getOnlineRegions()) {
+      for (HRegion region : hrs.getOnlineRegionsLocalContext()) {
         if (Bytes.equals(region.getTableDesc().getName(), tableName)) {
           ret.add(region);
         }

Modified: hbase/branches/0.90_master_rewrite/src/test/java/org/apache/hadoop/hbase/client/TestAdmin.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.90_master_rewrite/src/test/java/org/apache/hadoop/hbase/client/TestAdmin.java?rev=987697&r1=987696&r2=987697&view=diff
==============================================================================
--- hbase/branches/0.90_master_rewrite/src/test/java/org/apache/hadoop/hbase/client/TestAdmin.java (original)
+++ hbase/branches/0.90_master_rewrite/src/test/java/org/apache/hadoop/hbase/client/TestAdmin.java Sat Aug 21 05:25:01 2010
@@ -27,6 +27,7 @@ import static org.junit.Assert.assertTru
 import java.io.IOException;
 import java.util.Iterator;
 import java.util.Map;
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.commons.logging.Log;
@@ -40,6 +41,10 @@ import org.apache.hadoop.hbase.HTableDes
 import org.apache.hadoop.hbase.TableExistsException;
 import org.apache.hadoop.hbase.TableNotDisabledException;
 import org.apache.hadoop.hbase.TableNotFoundException;
+import org.apache.hadoop.hbase.executor.EventHandler;
+import org.apache.hadoop.hbase.executor.ExecutorService;
+import org.apache.hadoop.hbase.executor.EventHandler.EventType;
+import org.apache.hadoop.hbase.master.MasterServices;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.junit.AfterClass;
 import org.junit.Before;
@@ -96,6 +101,8 @@ public class TestAdmin {
     TEST_UTIL.createTable(tableName, HConstants.CATALOG_FAMILY);
     tables = this.admin.listTables();
     assertEquals(numTables + 1, tables.length);
+
+    // FIRST, do htabledescriptor changes.
     HTableDescriptor htd = this.admin.getTableDescriptor(tableName);
     // Make a copy and assert copy is good.
     HTableDescriptor copy = new HTableDescriptor(htd);
@@ -115,13 +122,119 @@ public class TestAdmin {
     assertTrue(expectedException);
     this.admin.disableTable(tableName);
     assertTrue(this.admin.isTableDisabled(tableName));
-    this.admin.modifyTable(tableName, copy);
-    HTableDescriptor modifiedhcd = this.admin.getTableDescriptor(tableName);
+    modifyTable(tableName, copy);
+    HTableDescriptor modifiedHtd = this.admin.getTableDescriptor(tableName);
     // Assert returned modifiedhcd is same as the copy.
-    assertFalse(htd.equals(modifiedhcd));
-    assertTrue(copy.equals(modifiedhcd));
-    assertEquals(newFlushSize, modifiedhcd.getMemStoreFlushSize());
-    assertEquals(key, modifiedhcd.getValue(key));
+    assertFalse(htd.equals(modifiedHtd));
+    assertTrue(copy.equals(modifiedHtd));
+    assertEquals(newFlushSize, modifiedHtd.getMemStoreFlushSize());
+    assertEquals(key, modifiedHtd.getValue(key));
+
+    // Reenable table.
+    this.admin.enableTable(tableName);
+    assertFalse(this.admin.isTableDisabled(tableName));
+
+    // Now work on column family changes.
+    int countOfFamilies = modifiedHtd.getFamilies().size();
+    assertTrue(countOfFamilies > 0);
+    HColumnDescriptor hcd = modifiedHtd.getFamilies().iterator().next();
+    int maxversions = hcd.getMaxVersions();
+    final int newMaxVersions = maxversions + 1;
+    hcd.setMaxVersions(newMaxVersions);
+    expectedException = false;
+    final byte [] hcdName = hcd.getName();
+    try {
+      this.admin.modifyColumn(tableName, hcd);
+      LOG.info("Modified column");
+    } catch (TableNotDisabledException e) {
+      LOG.error("EXCEP", e);
+      expectedException = true;
+    }
+    assertTrue(expectedException);
+    this.admin.disableTable(tableName);
+    assertTrue(this.admin.isTableDisabled(tableName));
+    modifyColumn(tableName, hcd);
+    this.admin.modifyColumn(tableName, hcd);
+    modifiedHtd = this.admin.getTableDescriptor(tableName);
+    HColumnDescriptor modifiedHcd = modifiedHtd.getFamily(hcdName);
+    assertEquals(newMaxVersions, modifiedHcd.getMaxVersions());
+
+    TODO: ADD/REMOVE COLUMN, REMOVE TABLE
+  }
+
+  /**
+   * Modify table is async so wait on completion of the table operation in master.
+   * @param tableName
+   * @param htd
+   * @throws IOException
+   */
+  private void modifyTable(final byte [] tableName, final HTableDescriptor htd)
+  throws IOException {
+    MasterServices services = TEST_UTIL.getMiniHBaseCluster().getMaster();
+    ExecutorService executor = services.getExecutorService();
+    AtomicBoolean done = new AtomicBoolean(false);
+    executor.registerListener(EventType.C2M_MODIFY_TABLE, new DoneListener(done));
+    this.admin.modifyTable(tableName, htd);
+    while (!done.get()) {
+      synchronized (done) {
+        try {
+          done.wait(1000);
+        } catch (InterruptedException e) {
+          e.printStackTrace();
+        }
+      }
+    }
+    executor.unregisterListener(EventType.C2M_MODIFY_TABLE);
+  }
+
+  /**
+   * Modify table is async so wait on completion of the table operation in master.
+   * @param tableName
+   * @param htd
+   * @throws IOException
+   */
+  private void modifyColumn(final byte [] tableName, final HColumnDescriptor hcd)
+  throws IOException {
+    MasterServices services = TEST_UTIL.getMiniHBaseCluster().getMaster();
+    ExecutorService executor = services.getExecutorService();
+    AtomicBoolean done = new AtomicBoolean(false);
+    executor.registerListener(EventType.C2M_MODIFY_FAMILY, new DoneListener(done));
+    this.admin.modifyColumn(tableName, hcd);
+    while (!done.get()) {
+      synchronized (done) {
+        try {
+          done.wait(1000);
+        } catch (InterruptedException e) {
+          e.printStackTrace();
+        }
+      }
+    }
+  }
+
+  /**
+   * Listens for when an event is done in Master.
+   */
+  static class DoneListener implements EventHandler.EventHandlerListener {
+    private final AtomicBoolean done;
+
+    DoneListener(final AtomicBoolean done) {
+      super();
+      this.done = done;
+    }
+
+    @Override
+    public void afterProcess(EventHandler event) {
+      this.done.set(true);
+      synchronized (this.done) {
+        // Wake anyone waiting on this value to change.
+        this.done.notifyAll();
+      }
+    }
+
+    @Override
+    public void beforeProcess(EventHandler event) {
+      // continue
+    }
   }
 
   @Test

Modified: hbase/branches/0.90_master_rewrite/src/test/java/org/apache/hadoop/hbase/master/TestZKBasedOpenCloseRegion.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.90_master_rewrite/src/test/java/org/apache/hadoop/hbase/master/TestZKBasedOpenCloseRegion.java?rev=987697&r1=987696&r2=987697&view=diff
==============================================================================
--- hbase/branches/0.90_master_rewrite/src/test/java/org/apache/hadoop/hbase/master/TestZKBasedOpenCloseRegion.java (original)
+++ hbase/branches/0.90_master_rewrite/src/test/java/org/apache/hadoop/hbase/master/TestZKBasedOpenCloseRegion.java Sat Aug 21 05:25:01 2010
@@ -40,7 +40,6 @@ import org.apache.hadoop.hbase.executor.
 import org.apache.hadoop.hbase.executor.EventHandler.EventHandlerListener;
 import org.apache.hadoop.hbase.executor.EventHandler.EventType;
 import org.apache.hadoop.hbase.master.handler.TotesHRegionInfo;
-import org.apache.hadoop.hbase.regionserver.HRegion;
 import org.apache.hadoop.hbase.regionserver.HRegionServer;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.hbase.util.Threads;
@@ -100,32 +99,32 @@ public class TestZKBasedOpenCloseRegion 
     int rsIdx = 0;
     HRegionServer regionServer =
       TEST_UTIL.getHBaseCluster().getRegionServer(rsIdx);
-    Collection<HRegion> regions = regionServer.getOnlineRegions();
-    HRegion region;
-    while((region = regions.iterator().next()) != null) {
-      if(!region.getRegionInfo().isMetaRegion() && !region.getRegionInfo().isRootRegion()) {
+    Collection<HRegionInfo> regions = regionServer.getOnlineRegions();
+    HRegionInfo hri;
+    while((hri = regions.iterator().next()) != null) {
+      if(!hri.isMetaRegion() && !hri.isRootRegion()) {
         break;
       }
     }
-    LOG.debug("Asking RS to close region " + region.getRegionNameAsString());
+    LOG.debug("Asking RS to close region " + hri.getRegionNameAsString());
 
     AtomicBoolean closeEventProcessed = new AtomicBoolean(false);
     AtomicBoolean reopenEventProcessed = new AtomicBoolean(false);
 
     EventHandlerListener closeListener =
-      new ReopenEventListener(region.getRegionNameAsString(),
+      new ReopenEventListener(hri.getRegionNameAsString(),
           closeEventProcessed, EventType.RS2ZK_REGION_CLOSED);
     cluster.getMaster().executorService.
       registerListener(EventType.RS2ZK_REGION_CLOSED, closeListener);
 
     EventHandlerListener openListener =
-      new ReopenEventListener(region.getRegionNameAsString(),
+      new ReopenEventListener(hri.getRegionNameAsString(),
           reopenEventProcessed, EventType.RS2ZK_REGION_OPENED);
     cluster.getMaster().executorService.
       registerListener(EventType.RS2ZK_REGION_OPENED, openListener);
 
-    LOG.info("Unassign " + region.getRegionNameAsString());
-    cluster.getMaster().assignmentManager.unassign(region.getRegionInfo());
+    LOG.info("Unassign " + hri.getRegionNameAsString());
+    cluster.getMaster().assignmentManager.unassign(hri);
 
     synchronized(closeEventProcessed) {
       closeEventProcessed.wait(3*60*1000);
@@ -197,22 +196,22 @@ public class TestZKBasedOpenCloseRegion 
 
     int rsIdx = 0;
     HRegionServer regionServer = TEST_UTIL.getHBaseCluster().getRegionServer(rsIdx);
-    Collection<HRegion> regions = regionServer.getOnlineRegions();
-    HRegion region;
-    while((region = regions.iterator().next()) != null) {
-      if(!region.getRegionInfo().isMetaRegion() && !region.getRegionInfo().isRootRegion()) {
+    Collection<HRegionInfo> regions = regionServer.getOnlineRegions();
+    HRegionInfo hri;
+    while((hri = regions.iterator().next()) != null) {
+      if(!hri.isMetaRegion() && !hri.isRootRegion()) {
         break;
       }
     }
-    LOG.debug("Asking RS to close region " + region.getRegionNameAsString());
+    LOG.debug("Asking RS to close region " + hri.getRegionNameAsString());
 
     AtomicBoolean closeEventProcessed = new AtomicBoolean(false);
     EventHandlerListener listener =
-      new CloseRegionEventListener(region.getRegionNameAsString(),
+      new CloseRegionEventListener(hri.getRegionNameAsString(),
           closeEventProcessed);
     cluster.getMaster().executorService.registerListener(EventType.RS2ZK_REGION_CLOSED, listener);
 
-    cluster.getMaster().assignmentManager.unassign(region.getRegionInfo());
+    cluster.getMaster().assignmentManager.unassign(hri);
 
     synchronized(closeEventProcessed) {
       // wait for 3 minutes

Modified: hbase/branches/0.90_master_rewrite/src/test/java/org/apache/hadoop/hbase/regionserver/DisabledTestRegionServerExit.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.90_master_rewrite/src/test/java/org/apache/hadoop/hbase/regionserver/DisabledTestRegionServerExit.java?rev=987697&r1=987696&r2=987697&view=diff
==============================================================================
--- hbase/branches/0.90_master_rewrite/src/test/java/org/apache/hadoop/hbase/regionserver/DisabledTestRegionServerExit.java (original)
+++ hbase/branches/0.90_master_rewrite/src/test/java/org/apache/hadoop/hbase/regionserver/DisabledTestRegionServerExit.java Sat Aug 21 05:25:01 2010
@@ -130,7 +130,7 @@ public class DisabledTestRegionServerExi
     int server = -1;
     for (int i = 0; i < regionThreads.size() && server == -1; i++) {
       HRegionServer s = regionThreads.get(i).getRegionServer();
-      Collection<HRegion> regions = s.getOnlineRegions();
+      Collection<HRegion> regions = s.getOnlineRegionsLocalContext();
       for (HRegion r : regions) {
         if (Bytes.equals(r.getTableDesc().getName(),
             HConstants.META_TABLE_NAME)) {

Modified: hbase/branches/0.90_master_rewrite/src/test/java/org/apache/hadoop/hbase/regionserver/wal/TestLogRolling.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.90_master_rewrite/src/test/java/org/apache/hadoop/hbase/regionserver/wal/TestLogRolling.java?rev=987697&r1=987696&r2=987697&view=diff
==============================================================================
--- hbase/branches/0.90_master_rewrite/src/test/java/org/apache/hadoop/hbase/regionserver/wal/TestLogRolling.java (original)
+++ hbase/branches/0.90_master_rewrite/src/test/java/org/apache/hadoop/hbase/regionserver/wal/TestLogRolling.java Sat Aug 21 05:25:01 2010
@@ -172,7 +172,7 @@ public class TestLogRolling extends HBas
       // flush all regions
 
       List<HRegion> regions =
-        new ArrayList<HRegion>(server.getOnlineRegions());
+        new ArrayList<HRegion>(server.getOnlineRegionsLocalContext());
       for (HRegion r: regions) {
         r.flushcache();
       }